有没有办法重定向发送到期望的标准输入,以便将其馈送到期望内的生成调用?在下面的示例中,我将 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
)
}
解决方案:我不得不在这里发布这个,因为我没有足够的声望点来这么快地回答我自己的问题。
我能够通过尝试在这个问题中应用的相同技术来解决它。我认为该解决方案最初并不适用,但确实如此。工作代码如下所示。
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