重定向期望标准输入产生调用

Posted

技术标签:

【中文标题】重定向期望标准输入产生调用【英文标题】:Redirect expect stdin to spawn call 【发布时间】:2012-05-19 06:45:57 【问题描述】:

有没有办法重定向发送到期望的标准输入,以便将其馈送到期望中的生成调用?在下面的示例中,我将 expect 嵌入到一个 shell 函数中,我想通过 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

【问题讨论】:

找到了解决方案here。 【参考方案1】:

您可以使用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
)

【讨论】:

这在 shell 中工作,但似乎没有记录的方式将其通过管道传递到 spawn 调用的命令中。我在原始代码的上下文中尝试了以下内容:spawn echo '"$stdin"' | pssh.....spawn pssh...&lt; '"$stdin"',但实际上两者都无法在预期内正确输入文本。 你会想在expect内引用它:spawn pssh...&lt; '"$stdin"'。我会在我的回答中提供一个替代方案。 我意识到答案一直存在于现有的 *** 问题中。不过感谢您的快速帮助。 @user1387661,请为您的问题添加评论,并附上其他问题的链接,以便其他人受益。

以上是关于重定向期望标准输入产生调用的主要内容,如果未能解决你的问题,请参考以下文章

UNIX 输入/输出重定向

Shell 输入/输出重定向

shell 12输入输出重定向

如何将 A 的标准输出重定向到 B 的标准输入,将 B 的标准输出重定向到 A 的标准输入?

Java重定向标准输入/输出

Shell 输入/输出重定向