重定向期望stdin生成调用

时间:2012-05-10 16:25:57

标签: bash redirect pipe stdin expect

有没有办法重定向stdin发送到期望这样它被送到期望中的spawn调用?在我下面的例子中,我在一个shell函数中嵌入expect,我希望通过heredoc管道另一个shell脚本,并通过将其捕获到shell变量来压缩输出。

    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
    )
    }

解决方案我必须在此发帖,因为我没有足够的声誉点来快速回答我自己的问题。

我能够通过尝试this issue中应用的相同技术来解决它。我认为这个解决方案最初并不适用,但确实如此。工作代码如下所示。

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

1 个答案:

答案 0 :(得分:0)

您可以使用stdin=$(cat -)

将标准输入捕获到变量

更新:让我们收集stdin:

未经测试,但也许:

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
)
}