2013-02-26 41 views
2

我有一個腳本,必須在每個主機上執行'sudo'操作。我試圖期望工作,所以我只需要輸入一次,並遇到了幾個問題。OSX bash&expect

首先,幾個例子建議使用:

/usr/bin/expect <<EOD 
spawn ssh -t $host /usr/bin/sudo -v 
expect "Password:" 
send "$SUDOPASS\n" 
EOD 

然而,當我進入第二個「<」,所有的報價中被搞砸了,我的腳本將有意想不到的結束時終止文件。這真的很奇怪,因爲我使用與cat相同的機制來寫出其他腳本中的文件。

其他的例子表明:

/usr/bin/expect -c " 
spawn ssh -t $host /usr/bin/sudo -v 
expect "Password:" 
send "$SUDOPASS\n" 
" 

這樣做,這樣(和添加-d期待),我得到任何的tty和我的密碼的重複錯誤,與「N」並在末尾,所以它不會發送換行符(我也試過'\ r'),但是似乎是逃避'n'因爲我發現的大多數示例都來自Linux,所以我期望(ha,ha,雙關不用!)他們正在使用GNU expect,而我正在使用BSD expect。我正在閱讀手冊頁,但「spawn」這個詞出現了很多次,在我偶然發現正確的實例之前可能會有一段時間。

這裏的,這似乎是最接近的工作結果:

flamingo:~ jnojr$ Scripts/getinfo_expect.sh 
Assuming you have one 'sudo' password for all of your hosts, enter it now: 
expect version 5.45 
spawn /usr/bin/ssh -t macbook /usr/bin/sudo -v 
parent: waiting for sync byte 
parent: telling child to go ahead 
parent: now unsynchronized from child 
spawn: returns {67358} 

expect: does "" (spawn_id exp7) match glob pattern "Password:"? no 
Password: 
expect: does "Password:" (spawn_id exp7) match glob pattern "Password:"? yes 
expect: set expect_out(0,string) "Password:" 
expect: set expect_out(spawn_id) "exp7" 
expect: set expect_out(buffer) "Password:" 
send: sending "password\n" to { exp7 } 
argv[0] = /usr/bin/expect argv[1] = -d argv[2] = -c argv[3] = 
    spawn /usr/bin/ssh -t macbook /usr/bin/sudo -v 
    expect Password: { send password\n } 
set argc 0 
set argv0 "/usr/bin/expect" 
set argv "" 
sudo: no tty present and no askpass program specified[/CODE] 

與離開引號外的「\ n」的,因爲在

send "$SUDOPASS"\n 

這似乎是主要工作,除了跳過'-t'選項ssh

+0

你有沒有考慮繞開這個完全贊成無密碼的'ssh'和/或'sudo'? – 2013-02-26 19:26:18

回答

3

我第二@BrianCain的評論,無密碼ssh w/sudo將是一個更好的解決方案。也就是說,讓我們試着幫助你的腳本,你可以決定它是否繼續頭痛。

我相信你會想用expect -f -(讀取STDIN的腳本)使用bash「這裏字符串」時(<<)輸入腳本expect。所以:

/usr/bin/expect -f - <<EOD 
spawn ssh -t $host /usr/bin/sudo -v 
expect "Password:" 
send "$SUDOPASS\n" 
EOD