我正在尝试使用 Apple 脚本以 root 身份运行应用程序,而无需始终询问密码。我使用了这个苹果脚本代码:
do shell script "/Applications/MyApp.app" user name "<username>" password "<password>" with administrator privileges
这可行,但它使 Apple 脚本继续运行而不关闭。不仅如此,使用此 Apple 脚本运行的应用程序会卡住并且无法关闭,除非重新启动 macOS。即使强制退出也不起作用。
这个方法我也试过了
我创建了另一个脚本,可以允许应用程序以 root 身份运行而无需询问密码。这是代码,
set sudoersFilePath to "/etc/sudoers"
set newEntry to "username ALL=(ALL) NOPASSWD: /Applications/MyApp.app"
do shell script "echo " & quoted form of newEntry & " | sudo tee -a " & sudoersFilePath with administrator privileges
上面的脚本在
sudoers
文件中添加一行。您可以使用此命令从终端访问此文件,
sudo visudo
这将列出列表中所有不需要密码的文件。在
sudoers
文件中,它添加了向 macOS 用户提供完全 root 访问权限的行。该文件包含所需的应用程序,但它不是以 root 身份运行。
那么,如何使用 Apple 脚本或任何其他方法以 root 身份运行应用程序而不要求输入密码?
原始 AppleScript 持续运行而不关闭的问题可能是由于它直接启动应用程序并等待其完成的方式造成的。当您以这种方式启动应用程序时(尤其是使用管理员权限),脚本可能无法返回控制权,直到应用程序关闭,这可能会导致脚本和应用程序出现卡住的情况。
像您所做的那样修改
sudoers
文件可能存在风险,应谨慎执行。runMyAppAsRoot.sh
以 root 权限运行应用程序。该脚本可以从您的 AppleScript 调用。
shell脚本可以设计为在后台执行应用程序。这意味着脚本启动应用程序然后立即返回,而不是等待应用程序关闭。
#!/bin/bash
nohup sudo /Applications/MyApp.app/Contents/MacOS/MyAppExecutable &> /dev/null &
与:
nohup
:确保即使父 shell 关闭,进程也不会终止。&>
:将 stdout 和 stderr 重定向到 /dev/null
(有效地静默输出)。&> /path/to/logfile.log
。&
:将进程置于后台。您的 AppleScript 将是:
do shell script "/path/to/runMyAppAsRoot.sh" with administrator privileges