在 bash 脚本中运行 sudo 命令并使用 launchd 运行它



我有一个bash脚本,我想在OS X上用启动的plist文件运行。我遇到的问题是 bash 脚本包含 sudo 命令并且它阻止它运行。例如,我的 bash 脚本如下所示:

#!/bin/bash
sudo /opt/local/bin/bindfs -u user1 /Library/WebServer/Documents/user1 /vhosts/user1/public_html
sudo /opt/local/bin/bindfs -u user2 /Library/WebServer/Documents/user2 /vhosts/user2/public_html

我的com.test.bindfs.plist文件看起来像这样(用Lingon创建):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>GroupName</key>
    <string>admin</string>
    <key>Label</key>
    <string>com.jamespayne.bindfs</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/bin/bindfs.sh</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

我已经检查了脚本是否通过在启动后运行它并输入密码来工作,但它不会在启动时运行。启动的 plist 正在运行,但出现以下错误:

须藤:没有TTY存在,也没有指定AskPass程序

任何人都知道如何让它工作,或者为什么我可能会得到这个错误。谢谢。

您可能只需将属性列表移动到/Library/LaunchDaemons/并从脚本中删除 sudo 命令。

请参阅man launchdman launchd.plist和这篇博文。

如果您从Google来到这里,希望以sudo/root权限运行用户登录LaunchAgent,则可以执行以下操作:

  • 如果为所有用户运行,请将 plist 放在/Library/LaunchAgents中,如果仅为单个用户运行,则~/Library/LaunchAgents
  • sudo第一个ProgramArguments,其余的是您正在运行的命令
  • /etc/sudoers.d文件中设置NOPASSWORD配置,以允许launchctl在没有交互式密码提示的情况下升级您的特定命令。

有关更详细的分步演练,请参阅此答案。

sudo是一个交互式命令,要求用户输入密码才能继续。 我会想象sudo ,找不到 tty,只是

退出并出现错误。

您想要的命令是 su ,它是非交互式的,唯一的例外是您需要是 root 才能运行它。 但是,在您的情况下,您可能根本不需要它,因为脚本是由特权用户运行的?

还有你为什么要把脚本放到/usr/bin? 坏主意;请改用/usr/local/bin(如果存在,则/usr/local/sbin)。

相关内容

  • 没有找到相关文章

最新更新