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

标签 bash redirect pipe stdin expect

有没有一种方法可以重定向发送到 expect 的标准输入,以便将其馈送到 expect 内的 spawn 调用?在下面的示例中,我将 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

最佳答案

您可以使用 stdin=$(cat -) 将标准输入捕获到变量中

更新:让 expect 收集标准输入:

未经测试,但也许:

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

关于bash - 重定向期望标准输入产生调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10538343/

相关文章:

linux - 将具有最小大小的子文件夹的路径存储到变量中

bash - 嵌套的 Herodoc 操作顺序

c - 长字符串数据的暂存

java - Hadoop Pipes Wordcount示例:LocalJobRunner中的NullPointerException

c - 尝试直接通过 STDIN 传递 sudo 密码

ruby - 监控 Ruby 脚本,使用 Monit - 包括 RVM

linux - 如何编写 bash 脚本来替换文件中的单词然后重命名文件?

redirect - URL 更改的高流量页面

javascript - URL重写: Show all files of certain directories at root of site

javascript - Google 的 Invisible reCAPTCHA 能否用于保护整个页面(不是表单或按钮)?