简单命令重启视频助手
Restarting the video assistant with a simple command
原问题:在我的 MacBook Pro 上,摄像机一直死机。找到 the solution is to type
sudo killall VDCAssistant
在终端中,提供我的密码(我有管理员权限)。
现在我想把它变成一个命令(不需要密码)。我发现可以使用 visudo
编辑一个文件,告诉 sudo
什么命令可能是 运行 而不需要密码。显然,让 killall
本身成为 "password free" 太危险了,所以我希望我可以将特定命令包装在另一个脚本中;编写该脚本 "password free";继续我的生活。所以这就是我所做的:
创建一个名为 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
部分,它会告诉我 "No matching processes belonging to you were found".
有没有人有我错过的技巧 - 我如何实现我的目标(使用单字命令为我不拥有的进程执行 killall
,而无需输入我的密码) ?
我已经阅读了 how to run script as another user without password but could not find anything that applied here; I also read the answers to sudo with password in one command line 的答案 - 那是使用 visudo
的灵感来源 - 但同样没有给我我正在寻找的答案。显然我不能以纯文本形式保存我的密码,而且我不想从 killall
.
中删除 "normal" 保护
有办法吗?
如果你有一个实际的二进制可执行文件,你可以使用 chmod 4755
设置它的 setuid
位,然后二进制文件将始终以拥有它的用户身份执行(如果它是最有用的根,显然)。但是,出于安全原因,这不适用于 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
并设置那个傻瓜的 setuid:
mv video /usr/local/bin
sudo chown root:wheel /usr/local/bin/video
sudo chmod 4755 /usr/local/bin/video
现在应该可以了。
如果您想变得更有趣,也可以在 /Library/LaunchDaemons 中安装一个 plist 并启动以每隔一段时间自动终止进程。
我是个 bash 菜鸟,但请尝试检查 this answer,这里的问题可能与您的 sudoers 文件有关。我尝试复制您的问题并遇到相同的行为,通过这个答案我能够使其工作。我不能说这个解决方案的安全性。总结:
我以 root 身份登录时创建了一个名为 video 的文件,内容如下:
#!/bin/bash
sudo killall VDCAssistant
设置它的权限chmod 700 video
并重新哈希
- 使用
visudo
我在 %sudo ALL=(ALL:ALL) ALL
行 mysuername ALL=NOPASSWD:ALL
下方添加了一行 %sudo ALL=(ALL:ALL) ALL
因为 myusername
是成员组 sudo
sudo video
运行脚本并终止进程
- 通过将
alias VIDEO 'sudo video'
添加到您的 .cshrc
文件,您可以使它成为真实的 "one word command"
answer by Charles Srstka 解决了我眼前的问题; @mspaint 随后的澄清表明 script-based 答案实际上也可以工作。然后我发现了一个很好的额外接触,我想与 运行 遇到这个问题的任何人分享。这是 "how do you make the whole process seamless".
1) "Hide"脚本中的killall
命令:
创建包含以下行的文本文件:
#!/bin/bash
sudo killall VDCAssistant
并保存到/usr/local/bin/restartVideo.sh
更改权限:chmod 700 restartVideo.sh
因此只有您可以 运行 它。
2) 使 restartVideo.sh
脚本 password-free 与 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
最后一行实际上表示“用户 'ME'(使用 User_Alias
命令定义),来自‘ALL
’终端,并作为‘[=22=”的任何成员执行]',无需密码 (NOPASSWD:
) 即可执行 VIDEO
定义的所有命令。保存文件 - 确保没有错误/警告!N.B.:在我最初的问题中,我似乎使用了 CMND_Alias
而不是 Cmnd_Alias
;那一定是产生了一个我忽略的警告……这可能是我原来的方法不是的原因工作 (???).
3) 创建一个服务来调用脚本
为此,我求助于 Mac Automator 应用程序 - 特别是,我创建了一个新服务。
搜索标题中包含 "run" 的操作,然后选择 "Run shell script":
使用默认 shell,运行 命令 sudo /usr/local/bin/restartVideo.sh
,不接受任何输入。使命令可用于任何应用程序。
最后 - 将脚本另存为 "Restart video"。
奇迹般地,您得到以下菜单项(在此处显示用于 Skype):
原问题:在我的 MacBook Pro 上,摄像机一直死机。找到 the solution is to type
sudo killall VDCAssistant
在终端中,提供我的密码(我有管理员权限)。
现在我想把它变成一个命令(不需要密码)。我发现可以使用 visudo
编辑一个文件,告诉 sudo
什么命令可能是 运行 而不需要密码。显然,让 killall
本身成为 "password free" 太危险了,所以我希望我可以将特定命令包装在另一个脚本中;编写该脚本 "password free";继续我的生活。所以这就是我所做的:
创建一个名为 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
部分,它会告诉我 "No matching processes belonging to you were found".
有没有人有我错过的技巧 - 我如何实现我的目标(使用单字命令为我不拥有的进程执行 killall
,而无需输入我的密码) ?
我已经阅读了 how to run script as another user without password but could not find anything that applied here; I also read the answers to sudo with password in one command line 的答案 - 那是使用 visudo
的灵感来源 - 但同样没有给我我正在寻找的答案。显然我不能以纯文本形式保存我的密码,而且我不想从 killall
.
有办法吗?
如果你有一个实际的二进制可执行文件,你可以使用 chmod 4755
设置它的 setuid
位,然后二进制文件将始终以拥有它的用户身份执行(如果它是最有用的根,显然)。但是,出于安全原因,这不适用于 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
并设置那个傻瓜的 setuid:
mv video /usr/local/bin
sudo chown root:wheel /usr/local/bin/video
sudo chmod 4755 /usr/local/bin/video
现在应该可以了。
如果您想变得更有趣,也可以在 /Library/LaunchDaemons 中安装一个 plist 并启动以每隔一段时间自动终止进程。
我是个 bash 菜鸟,但请尝试检查 this answer,这里的问题可能与您的 sudoers 文件有关。我尝试复制您的问题并遇到相同的行为,通过这个答案我能够使其工作。我不能说这个解决方案的安全性。总结:
我以 root 身份登录时创建了一个名为 video 的文件,内容如下:
#!/bin/bash sudo killall VDCAssistant
设置它的权限
chmod 700 video
并重新哈希- 使用
visudo
我在%sudo ALL=(ALL:ALL) ALL
行mysuername ALL=NOPASSWD:ALL
下方添加了一行%sudo ALL=(ALL:ALL) ALL
因为myusername
是成员组sudo
sudo video
运行脚本并终止进程- 通过将
alias VIDEO 'sudo video'
添加到您的.cshrc
文件,您可以使它成为真实的 "one word command"
answer by Charles Srstka 解决了我眼前的问题; @mspaint 随后的澄清表明 script-based 答案实际上也可以工作。然后我发现了一个很好的额外接触,我想与 运行 遇到这个问题的任何人分享。这是 "how do you make the whole process seamless".
1) "Hide"脚本中的killall
命令:
创建包含以下行的文本文件:
#!/bin/bash
sudo killall VDCAssistant
并保存到/usr/local/bin/restartVideo.sh
更改权限:chmod 700 restartVideo.sh
因此只有您可以 运行 它。
2) 使 restartVideo.sh
脚本 password-free 与 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
最后一行实际上表示“用户 'ME'(使用 User_Alias
命令定义),来自‘ALL
’终端,并作为‘[=22=”的任何成员执行]',无需密码 (NOPASSWD:
) 即可执行 VIDEO
定义的所有命令。保存文件 - 确保没有错误/警告!N.B.:在我最初的问题中,我似乎使用了 CMND_Alias
而不是 Cmnd_Alias
;那一定是产生了一个我忽略的警告……这可能是我原来的方法不是的原因工作 (???).
3) 创建一个服务来调用脚本 为此,我求助于 Mac Automator 应用程序 - 特别是,我创建了一个新服务。
搜索标题中包含 "run" 的操作,然后选择 "Run shell script":
使用默认 shell,运行 命令 sudo /usr/local/bin/restartVideo.sh
,不接受任何输入。使命令可用于任何应用程序。
最后 - 将脚本另存为 "Restart video"。
奇迹般地,您得到以下菜单项(在此处显示用于 Skype):