使用简单的命令重新启动视频助手

时间:2017-08-18 14:58:47

标签: macos shell sudo password-protection

原始问题:在我的MacBook Pro上,摄像机一直在冻结。找到the solution is to type

sudo killall VDCAssistant

在终端中,并提供我的密码(我有管理员权限)。

现在我想把它作为一个命令(不需要密码)。我发现可以使用visudo编辑一个文件,告诉sudo可以运行哪些命令而无需密码。显然,让killall本身"无密码"会太危险,所以我希望我可以将特定命令包装在另一个脚本中;制作该脚本"密码免费&#34 ;;继续我的生活。所以这就是我所做的:

创建一个名为video的文件,其中包含

!#/bin/bash
sudo killall VDCAssistant

将其放入/usr/local/bin,授予权限chmod 700 video,然后重新发送。当我输入video时,系统会提示我输入密码。到目前为止一切都很好。

接下来,我运行visudo并添加了行

User_Alias USERS = myusername
CMND_Alias CMDS = /usr/local/bin/video
USERS ALL = (ALL) NOPASSWD: CMDS

但这并没有产生预期的效果。我仍然被提示输入密码。如果我将root作为脚本的所有者,那么它就不会改变。如果我遗漏了命令的sudo部分,它告诉我"没有找到属于你的匹配进程"。

有没有人有我错过的技巧 - 如何实现我的目标(使用单字命令为我不拥有的进程执行killall,而无需输入我的密码)?< / p>

我已阅读how to run script as another user without password的答案,但找不到任何适用于此处的内容;我还阅读了sudo with password in one command line的答案 - 这就是使用visudo的灵感所来自的地方 - 但它再次没有给我我想要的答案。显然,我无法以纯文本格式保存我的密码,而且我不想删除&#34;正常&#34;来自killall的保护。

有办法做到这一点吗?

3 个答案:

答案 0 :(得分:2)

如果你有一个实际的二进制可执行文件,你可以使用setuid在其上设置chmod 4755位,然后二进制文件将始终以任何用户拥有它的方式执行(如果它是root,则最有用)明显)。但是,出于安全原因,这不适用于shell脚本。我不是100%确定是这种情况,但visudo也可能出于同样的原因忽略shell脚本。

如果你已经安装了Xcode,你可以构建一个实际的二进制程序来运行killall命令,然后你可以设置它的setuid位。这个Swift程序应该可以解决这个问题:

import Foundation

guard setuid(0) == 0 else {
    print("Couldn't set UID 0: error \(errno)")
    exit(-1)
}

let killall = Process()

killall.launchPath = "/usr/bin/killall"
killall.arguments = ["VDCAssistant"]

killall.launch()
killall.waitUntilExit()

将上述内容保存在名为video.swift的文本文件中。运行以下命令:

swiftc video.swift -framework Foundation

这将在该目录中创建一个名为video的文件。将文件移至/usr/local/bin,将所有者更改为root并设置该吸盘:

mv video /usr/local/bin
sudo chown root:wheel video
sudo chmod 4755 video

现在应该可以了。

如果你想变得更加漂亮,也可能会在/ Library / LaunchDaemons中安装一个plist并启动它以便经常自动终止进程。

答案 1 :(得分:2)

我是一个完整的bash noob但是尝试检查this answer,这里的问题可能出在你的sudoers文件中。我尝试复制你的问题并遇到了同样的行为,这个答案我能够使它工作。我无法谈论这个解决方案的安全性。总结一下:

  • 我以root用户身份登录时创建了一个名为video的文件,其中包含以下内容:

    #!/bin/bash
    sudo killall VDCAssistant
    
  • 设置权限chmod 700 video并重新设置

  • 使用visudo我已在行mysuername ALL=NOPASSWD:ALL下添加了以下行%sudo ALL=(ALL:ALL) ALL 以下行myusername,因为sudo是群组成员{ {1}}
  • sudo video运行脚本并终止进程
  • 通过将alias VIDEO 'sudo video'添加到您的.cshrc文件,您可以将其设为真正的单词命令&#34;

答案 2 :(得分:1)

answer by Charles Srstka解决了我眼前的问题;随后@mspaint的澄清表明,基于脚本的答案实际上也可以起作用。然后我发现了一个很好的额外触摸,我想分享给遇到这个问题的任何人。这是&#34;你如何使整个过程无缝化#34;。

1)&#34;隐藏&#34;脚本中的killall命令:

使用以下行创建一个文本文件:

#!/bin/bash
sudo killall VDCAssistant

并将其保存到/usr/local/bin/restartVideo.sh

更改权限:chmod 700 restartVideo.sh,只有您可以运行它。

2)使restartVideo.sh脚本免密码,以便与sudo 一起使用

接下来,我们需要编辑sudoers文件,这样在运行上述脚本时无需提示输入密码。编辑由sudo visudo完成 - 这会在vim中编辑文件的副本,并在覆盖原始文件之前检查错误。将以下行添加到文件中:

# my user can run the restartVideo.sh command with sudo without password:
User_Alias ME = myUserName
Cmnd_Alias VIDEO = /usr/local/bin/restartVideo.sh
ME ALL = (ALL) NOPASSWD: VIDEO

这最后一行实际上意味着&#34;用户&#39;我&#39; (使用User_Alias命令定义),来自&#39; ALL&#39;终端,并作为(ALL)&#39;的任何成员执行,可以在没有密码(NOPASSWD:)的情况下执行由VIDEO定义的所有命令。保存文件 - 确保没有错误/警告! N.B。:在我原来的问题中,我似乎使用了CMND_Alias代替Cmnd_Alias;必须产生一个我忽略的警告......这可能是我原来的方法不起作用的原因(???)。

3)创建服务以调用脚本 为此,我转向Mac Automator应用程序 - 特别是,我创建了一个新服务。

enter image description here

搜索有&#34;运行&#34;的操作。在他们的标题中,选择&#34;运行shell脚本&#34;:

enter image description here

使用默认shell,运行命令sudo /usr/local/bin/restartVideo.sh,不进行任何输入。使命令可用于任何应用程序。

最后 - 将脚本保存为&#34;重新启动视频&#34;。

通过奇迹,你得到以下菜单项(在这里显示Skype):

enter image description here 现在您只需选择该菜单项,您的相机就会恢复活力。