2012-05-10 100 views
3

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

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

SOLUTION:我,因为我没有足够的信誉分,这么快回答我的问题在这里张贴此。

我能够通过尝试应用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 
+2

该解决方案被发现[这里](http://stackoverflow.com/questions/10237872/expect-redirect-stdin)。 – user1387661

回答

0

可以捕获标准输入到一个变量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 
) 
} 
+1

这在壳内工作,但似乎没有记录的方式将其管入spawn调用的命令。 我在原始代码的上下文中尝试了以下内容: 'spawn echo'“$ stdin”'| pssh .....' 'spawn pssh ...'''$ stdin'''' 并且实际上都不能在期望的范围内正确地管理文本。 – user1387661

+0

你会希望引用它:'spawn pssh ... <{'“$ stdin”'}'。我会在我的答案中提供一个替代方案。 –

+0

我意识到答案是一直存在于现有的stackoverflow问题中。感谢您的快速帮助。 – user1387661