2012-10-11 77 views
4

我有一個bash腳本,我想用OS X上的launchd plist文件運行。我遇到的問題是bash腳本包含sudo命令,它是阻止它運行。因此,例如,我的bash腳本是這樣的:在bash腳本中運行sudo命令並使用launchd運行它

#!/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中正在運行,但它與下面的錯誤出現:

須藤:不存在TTY並沒有askpass程序指定

有人知道如何得到這個工作,或者爲什麼我會得到這個錯誤。謝謝。

回答

1

sudo是一個交互式命令,要求用戶輸入他們的密碼才能繼續。我會想象,sudo,無法找到一個tty,只是出現一個錯誤。

你想要的命令是su,它是非交互的,唯一的例外是你需要是root來運行它。然而在你的情況下,你可能根本不需要它,因爲腳本是由特權用戶運行的嗎?

另外,你爲什麼要把腳本放入/usr/bin?餿主意;改爲使用/usr/local/bin(如果存在,則使用/usr/local/sbin)。

+0

感謝您的安全提示。移動。 – jpayne

4

您可能只需將屬性列表移動到/Library/LaunchDaemons/並從腳本中刪除sudo命令。

參見man launchdman launchd.plistthis blog post

+0

這是什麼工作。謝謝。 – jpayne

+0

雖然這是我最終做的並解決了問題,但我必須接受trojanfoe的答案,因爲它專門解決並解釋了與原始腳本相關的問題。無論如何,我已經投了你的答案,因爲這是一個相關的選擇。 – jpayne

1

如果你來到這裏,從谷歌希望運行使用sudo/root權限的用戶登錄LaunchAgent你可以做到以下幾點:

  • 把plist中在/Library/LaunchAgents如果運行所有用戶或~/Library/LaunchAgents如果正在運行對於只是一個單一的用戶
  • 有第一ProgramArgumentssudo,剩下的是你正在運行
  • /etc/sudoers.d文件設置NOPASSWORD配置,以允許launchctl升級命令您的特定命令沒有交互式密碼提示。

請參閱this answer以獲得更詳細的分步演練。