3

送信されたstdinをreexpectにリダイレクトして、expect内のspawn呼び出しにフィードされるようにする方法はありますか?以下の例では、ヒアドキュメントを介して別のシェルスクリプトをパイプ処理するシェル関数内にexpectを埋め込み、シェル変数にキャプチャして出力を抑制しています。

    psshstdin() {
      local user=$1 pass=$2 hosts=$3
      out=$(expect -c '
      set timeout 15
      spawn pssh -i -h '"$hosts"' -p 100 -l '"$user"' -A -o ./ -x-oStrictHostKeyChecking=no <EXPECT_STDIN_HERE
      expect "assword:" { send '\""$pass\r\""' }
      interact
    '<<EOF
    echo "hello"
    echo "world"
    EOF
    )
    }

解決策:自分の質問にすばやく答えるのに十分な評判ポイントがないため、これをここに投稿する必要がありました。

この号で適用したのと同じテクニックを試すことで、それを解決することができました。最初は解決策が適用できるとは思いませんでしたが、適用できました。動作するコードを以下に示します。

psshstdin() {
  local user=$1 pass=$2 hosts=$3
out=$(expect -c '
set timeout 30
spawn pssh -I -h '"$hosts"' -p 100 -l '"$user"' -A -o ./ -x-oStrictHostKeyChecking=no
while {[gets stdin line] != -1} {
  send "$line\n"
}
send \004
expect "assword:" { send '\""$pass\r\""' }
expect {
  "END_TOKEN_OF_SCRIPT" {
    exit 0
  }
  default {
    exit 1
  }
}'<&0)
}

私はそれを次のようなもので呼び出すことができます:

psshstdin myusername mypassword ssh_hosts_file<<EOF
echo "hello"
echo "world"
EOF
4

1 に答える 1

0

stdinを変数にキャプチャできますstdin=$(cat -)

更新:標準入力を収集することを期待しましょう:

テストされていませんが、おそらく:

psshstdin() {
  local user=$1 pass=$2 hosts=$3
  out=$(expect -c '
    set stdin [read stdin]
    puts "debug: sending the following stdin to pssh:\n$stdin\n--END--"
    set timeout 15
    spawn echo "$stdin" | pssh -i -h '"$hosts"' -p 100 -l '"$user"' -A -o ./ -x-oStrictHostKeyChecking=no
    expect "assword:" { send "'"$pass"'\r" }
    interact
  '<<EOF
echo "hello"
echo "world"
EOF
)
}
于 2012-05-10T16:37:40.920 に答える