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

8

我有一个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: no tty present and no askpass program specified

有人知道如何使其正常工作或为什么会出现该错误吗?谢谢。

3个回答

6
你可以将属性列表移动到/Library/LaunchDaemons/中,并从脚本中删除sudo命令。请参见man launchdman launchd.plist以及这篇博客文章

虽然这是我最终采取的措施并解决了问题,但我必须接受trojanfoe的答案,因为它明确地解决并解释了原始脚本所涉及的问题。无论如何,我已经为你的答案点赞,因为它是一个相关的替代方案。 - jpayne

3
如果您是从谷歌来到这里想要以sudo/root权限运行用户登录LaunchAgent,您可以按照以下步骤操作:
  • 将plist文件放在/Library/LaunchAgents,如果是为所有用户运行则是这样,如果只是为单个用户运行则是~/Library/LaunchAgents
  • 将第一个ProgramArguments设为sudo,剩余的就是您要运行的命令
  • /etc/sudoers.d文件中设置NOPASSWORD配置项,以允许launchctl升级您特定的命令而不需要交互式密码提示。
请参见此答案以获取更详细的逐步指南。

2

sudo 是一种交互式命令,需要用户输入密码才能继续执行。我想 sudo 找不到 tty 时会以错误退出。

你想要的命令是 su,它是非交互式的,唯一的例外是需要以 root 身份运行它。但在你的情况下,由于脚本已经由特权用户运行,你可能根本不需要它?

另外,为什么要把脚本放在 /usr/bin 中呢?这是个坏主意;应该使用 /usr/local/bin(如果存在,也可以使用 /usr/local/sbin)。


感谢您的安全提示。已移动。 - jpayne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接