2

次のプロセスを自動化しています:
ユーザー名「alpha」のパスワード「alpha」を使用して、ssh 経由で「alpha」という名前のシステムに接続します。接続したら、root パスワードを (「kickass」に) 設定したいと思います。接続しているシステムには、デフォルトで root パスワードがありません。私はこの期待スクリプトを書いて仕事をしましたが、一貫して機能しません。一度は機能し、もう一度テストするためにパスワードを変更すると、「sudo passwd root」を発行した後、「Enter new UNIX password:」プロンプトで待機します。何か案は?

#!/usr/bin/expect -f
set arg1 [lindex $argv 0]
set force_conservative 1  ;# set to 1 to force conservative mode even if
              ;# script wasn't run conservatively originally
if {$force_conservative} {
    set send_slow {1 .1}
    proc send {ignore arg} {
        sleep .1
        exp_send -s -- $arg
    }
}

set timeout -1
spawn ssh alpha@$arg1
match_max 100000
expect -exact "password: "
send -- "alpha\r"
expect -exact "alpha@alpha:~\$ "
send -- "sudo passwd root\r"
expect -exact "password for alpha: "
send -- "alpha\r"
expect -exact "new UNIX password: "
send -- "kickass\r"
expect -exact "Retype new UNIX password: "
send -- "kickass\r"
expect -exact "alpha@alpha:~\$ "
send -- "exit\r"
expect eof

ありがとう。

4

1 に答える 1

2

Andrei Sfrentのコメントを拡張します:

通常、sudoにはある種のタイムアウト値があるため、タイムアウト期間内に2番目のsudoコマンドを発行しても、パスワードの入力を再度求められることはありません。コードを次のように変更できます。

send -- "sudo passwd root\r"
expect {
        -exact "password for alpha: "
            {
                send -- "alpha\r"
                exp_continue
            }

        -exact "new UNIX password: "
            {
                send -- "kickass\r"
            }
        }
于 2011-01-24T19:32:04.433 に答える