1

リモート システムに ssh するスクリプトを期待し、リモート コマンドの出力を取得しようとしています。その出力をローカルで利用できるようにしたい。例として、システムに SSH 接続し、現地時間の出力を取得します。

#!/usr/bin/expect --
set timeout 60
spawn ssh user@server.domain.com
expect {
timeout {puts "timed out after $timeout seconds"; exit}
"Password:"
}
send "SuperSecretPassword\r"
expect "user$ "
send "date\r"
expect "date"
expect "\r"
set buffer1 '$expect_out(buffer)'
expect "\r"
set buffer2 '$expect_out(buffer)'
send "exit\r"
expect eof
set buffer3 '$expect_out(buffer)'
exit
export VARIABLE $buffer1
export VARIABLE $buffer2
export VARIABLE $buffer3
echo "Okay, we are done expecting..."
echo "Buffer1: $buffer1"
echo "Buffer2: $buffer2"
echo "Buffer3: $buffer3"

当然、上記は機能せず、実際にはスクリプトの実行は「終了」を期待して終了します

4

2 に答える 2

1
#!/usr/bin/expect --
log_user 0
set timeout 60
spawn ssh user@server.domain.com
expect {
timeout {puts "timed out after $timeout seconds"; exit}
"Password:"
}
send "mypassword\r"
expect "user$ "
send "date\r"
expect "date\r\n"
expect "*\r" { send_user "$expect_out(0,string)\n" }
close
exit
于 2013-05-22T14:26:02.467 に答える
0

子プロセス (expect スクリプト) から親 (シェル スクリプト?) にデータを渡す方法は、stdio チャネル経由です。expect スクリプトは、expect_out バッファーを出力する必要があり、シェル スクリプトは、expect 出力をキャプチャして動作する必要があります。それは何らかの形で。

の前にexit、次のようなことを行います

puts "buffer1='$buffer1'"
puts "buffer2='$buffer2'"
puts "buffer3='$buffer3'"

おそらく、他のすべての期待出力をオフにしたいと思うでしょう。それとlog_user 0... 私が思い出すことができない他の何か... Exploring Expect の本にはすばらしい詳細がすべて含まれています。

シェルスクリプトは

expect_out=$(./program.exp)
while read line; do
    [[ $line == buffer[123]=* ]] && eval "$line"
done <<< "$expect_out"

または単に

source <(./program.exp)

もちろん、expect はそれ自体が完全な機能を備えた非常に有能な言語 (Tcl) であり、expect を呼び出してデータを返すシェル スクリプトに煩わされることなく、必要なすべてのローカル処理を間違いなく実行できます。

于 2013-05-16T00:17:39.953 に答える