在bash脚本中使用expect自动化ssh连接

在bash脚本中使用expect自动化ssh连接,bash,shell,expect,tcl,Bash,Shell,Expect,Tcl,我正在尝试使用expect做一个shell脚本来自动连接,因为它不允许使用ssh密钥。这是我第一个使用expect的脚本,我觉得有点困惑。在这种情况下,我可以通过ssh连接,但我无法关闭连接,我不知道该怎么做,知道吗 #!/bin/bash user=pepe host=server pass=`cat /tmp/password.txt` COMMAND=df PASSWORD=$pass expect -c " spawn ssh $user@$host

我正在尝试使用expect做一个shell脚本来自动连接,因为它不允许使用ssh密钥。这是我第一个使用expect的脚本,我觉得有点困惑。在这种情况下,我可以通过ssh连接,但我无法关闭连接,我不知道该怎么做,知道吗

#!/bin/bash

user=pepe

host=server

pass=`cat /tmp/password.txt`

COMMAND=df

PASSWORD=$pass expect -c "

    spawn ssh $user@$host

    expect "*assword*"

    send \$env(PASSWORD)\r

    expect {

     "*be*" {send $COMMAND\r;interact}}

"

即时修复方法是将命令指定为
ssh
的参数,然后建立连接,命令将运行,连接将关闭

#/bin/bash
用户=pepe
主机=服务器
pass=`cat/tmp/password.txt`
命令=df
密码=$pass expect-c“
生成ssh$user@$host$命令
期望\“*assword*\”
发送\$env(密码)\r
预期eof
"
有几件事需要注意:

  • expect eof
    将优雅地等待生成的命令退出
  • 我避开了内部的双引号

下一步是整理引用/转义。在shell脚本中嵌入另一种语言的代码时,使用带引号的herdoc是避免引用hell的最佳方法。这意味着所有shell变量都需要通过环境传递给expect

#/bin/bash
导出用户=pepe
导出主机=服务器
导出密码=`cat/tmp/password.txt`
导出cmd=df

expect立即修复的方法是将该命令指定为ssh的参数,然后建立连接,命令将运行,连接将关闭

#/bin/bash
用户=pepe
主机=服务器
pass=`cat/tmp/password.txt`
命令=df
密码=$pass expect-c“
生成ssh$user@$host$命令
期望\“*assword*\”
发送\$env(密码)\r
预期eof
"
有几件事需要注意:

  • expect eof
    将优雅地等待生成的命令退出
  • 我避开了内部的双引号

下一步是整理引用/转义。在shell脚本中嵌入另一种语言的代码时,使用带引号的herdoc是避免引用hell的最佳方法。这意味着所有shell变量都需要通过环境传递给expect

#/bin/bash
导出用户=pepe
导出主机=服务器
导出密码=`cat/tmp/password.txt`
导出cmd=df
expect查看my,您可以使用它仅使用shell代码编写expect脚本。查看my,您可以使用它仅使用shell代码编写expect脚本。