原始问题:在我的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
的保护。
有办法做到这一点吗?
答案 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应用程序 - 特别是,我创建了一个新服务。
搜索有&#34;运行&#34;的操作。在他们的标题中,选择&#34;运行shell脚本&#34;:
使用默认shell,运行命令sudo /usr/local/bin/restartVideo.sh
,不进行任何输入。使命令可用于任何应用程序。
最后 - 将脚本保存为&#34;重新启动视频&#34;。
通过奇迹,你得到以下菜单项(在这里显示Skype):