Ssh経由でリモートcompに接続し、そこでファイルを読み取り、「hostname」(「hostname aaaa1111」など)の特定の行を見つけて、このホスト名を変数に格納してしばらくの間使用する必要があるbash + expectスクリプトがあります。 。 「ホスト名」パラメーターの値を取得するにはどうすればよいですか?行の内容は$ expect_out(buffer)変数にあると思ったので(スキャンして分析できるように)、そうではありません。私のスクリプトは次のとおりです。
#!/bin/bash
----bash part----
/usr/bin/expect << ENDOFEXPECT
spawn bash -c "ssh root@$IP"
expect "password:"
send "xxxx\r"
expect ":~#"
send "cat /etc/rc.d/rc.local |grep hostname \n"
expect ":~#"
set line $expect_out(buffer)
puts "line = $line, expect_out(buffer) = $expect_out(buffer)"
...more script...
ENDOFEXPECT
ここに http://en.wikipedia.org/wiki/Expect 例があります:
# Send the prebuilt command, and then wait for another Shell Prompt.
send "$my_command\r"
expect "%"
# Capture the results of the command into a variable. This can be displayed, or written to disk.
set results $expect_out(buffer)
この場合は機能しないようです、またはスクリプトの何が問題になっていますか?
まず、ヒアドキュメントは二重引用符で囲まれた文字列のように機能するため、$expect_out
変数は、expect
が開始する前にシェルに置き換えられています。シェルがヒアドキュメントに触れていないことを確認する必要があります。したがって、シェル変数は別の方法でフェッチする必要があります。ここでは、IP
がシェル変数であると想定し、それを環境に渡します。
export IP
/usr/bin/expect << 'ENDOFEXPECT'
set Prompt ":~#"
spawn ssh root@$env(IP)
expect "password:"
send "xxxx\r"
expect $Prompt
send "grep hostname /etc/rc.d/rc.local \n"
expect $Prompt
set line $expect_out(buffer)
...more script...
ENDOFEXPECT
なぜこれにexpectを使用しているのですか?
ssh -i ssh_private_key root@${IP} "grep -E -o 'hostname.*$' /etc/rc.d/rc.local"