簡體   English   中英

OSX bash和期望

[英]OSX bash & expect

我有一個腳本,必須在多個主機上的每個主機上執行“ sudo”操作。 我試圖使工作正常,所以我只需要輸入一次,就遇到了一些問題。

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

/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,因此我希望(哈,哈,雙關語不是故意的!)他們使用的是GNU期望,而我使用的是BSD期望。 我正在閱讀手冊頁,但是“ 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

除了跳過ssh的'-t'選項外,它似乎大部分都在工作

我第二個@BrianCain的評論是,使用sudo密碼ssh是更好的解決方案。 就是說,讓我們嘗試幫助您的expect腳本,您可以決定它是否仍然令人頭疼。

我相信您會在使用bash “ here string”( << )輸入expect的腳本時使用expect -f - (從STDIN讀取腳本)。 所以:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM