简单命令重启视频助手

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) ALLmysuername 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):

现在您只需 select 该菜单项,您的相机就会恢复生机。