使用expect来自动化管道命令

Ric*_*ard 1 bash automation automated-tests expect

我要自动执行命令管道cat ~/.ssh/id_rsa.pub | ssh root@host 'cat >> .ssh/authorized_keys'expect.使用spawn命令执行命令时

spawn cat ~/.ssh/id_rsa.pub | ssh root@host 'cat >> .ssh/authorized_keys' 
Run Code Online (Sandbox Code Playgroud)

它抛出错误信息,

cat |: No such file or directory
cat ssh: No such file or directory
...
Run Code Online (Sandbox Code Playgroud)

我该如何生成管道命令?

小智 5

因为您希望在一次命中中技术上执行多个shell命令(并且spawn不处理管道I/O),您需要将它们封装在脚本中,然后使用spawn来执行脚本.

您想要的脚本已经作为ssh-copy-id存在,但是如果您想要一个精简版本,您可以动态创建一个脚本文件,然后将其传递给expect spawn:

cat > /tmp/sshkeycopy.sh <<MYEOF
cat ~/.ssh/id_rsa.pub | ssh user@host 'mkdir -p -m 600 ~/.ssh; cat >> ~/.ssh/authorized_keys'
MYEOF

chmod u+x /tmp/sshkeycopy.sh

expect -c "
spawn /tmp/sshkeycopy.sh
expect { ... }"
Run Code Online (Sandbox Code Playgroud)

使用这个bash示例,shell将按预期处理管道,只是将密码提示输出以供处理.