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将按预期处理管道,只是将密码提示输出以供处理.