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

时间:2012-10-11 08:59:27

标签: macos bash launchd

我有一个bash脚本,我想在OS X上使用launchd 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>

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

sudo:没有tty存在且没有指定askpass程序

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

3 个答案:

答案 0 :(得分:4)

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

请参阅man launchdman launchd.plistthis blog post

答案 1 :(得分:2)

sudo是一个交互式命令,要求用户输入密码才能继续。我想象sudo,无法找到tty,只是退出时出错。

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

另外,为什么要将脚本放入/usr/bin?馊主意;请改为使用/usr/local/bin(如果存在,则使用/usr/local/sbin。)

答案 2 :(得分:1)

如果您是从谷歌来这里寻找运行具有sudo / root权限的用户登录LaunchAgent,您可以执行以下操作:

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

有关更详细的分步演练,请参阅this answer