6

多数のホストのそれぞれで「sudo」操作を実行する必要があるスクリプトがあります。私は機能することを期待しようとしているので、一度入力するだけで済み、いくつかの問題に遭遇しました。

まず、いくつかの例を使用することをお勧めします。

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

しかし、2 番目の「<」を入力するとすぐに、すべての引用符が台無しになり、スクリプトが予期しないファイルの終わりで終了します。私は 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 期待を使用していると思います (ハ、ハ、しゃれは意図されていません!)。man ページを読んでいますが、「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」オプションをスキップすることを除いて、ほとんど機能しているようです

4

1 に答える 1

6

@BrianCain の 2 番目のコメントは、パスワードなしのsshほうsudoがより良い解決策になるということです。とはいえ、あなたのスクリプトを手伝ってみましょうexpect。それが引き続き頭の痛い問題であるかどうかを判断できます。

「here string」( ) を使用して にスクリプトを入力するexpect -f -場合は、(STDIN からスクリプトを読み取る)を使用することになると思います。そう:bash<<expect

/usr/bin/expect -f - <<EOD
spawn ssh -t $host /usr/bin/sudo -v
expect "Password:"
send "$SUDOPASS\n"
EOD
于 2013-02-26T20:12:03.500 に答える