web-dev-qa-db-ja.com

スクリプトを期待し、リモートコンピューターでcatを実行して、変数への出力を取得します

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)

この場合は機能しないようです、またはスクリプトの何が問題になっていますか?

3
lugger1

まず、ヒアドキュメントは二重引用符で囲まれた文字列のように機能するため、$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
3
glenn jackman

なぜこれにexpectを使用しているのですか?

ssh -i ssh_private_key root@${IP} "grep -E -o 'hostname.*$' /etc/rc.d/rc.local"
3
Michael Lowman