【问题标题】:Automate ssh connection with expect in a bash script在 bash 脚本中使用期望自动连接 ssh
【发布时间】:2020-11-17 17:28:12
【问题描述】:

我正在尝试使用 expect 来执行 shell 脚本来自动连接,因为它不允许使用 ssh 密钥。这是我的第一个带有期望的脚本,我觉得有点困惑。在这种情况下,我可以通过 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}}

"

【问题讨论】:

标签: bash shell expect


【解决方案1】:

直接的解决方法是将命令指定为ssh 的参数——然后连接将建立,命令将运行,连接将关闭

#!/bin/bash

user=pepe
host=server
pass=`cat /tmp/password.txt`

COMMAND=df

PASSWORD=$pass expect -c "
    spawn ssh $user@$host $COMMAND
    expect \"*assword*\"
    send \$env(PASSWORD)\r
    expect eof
"

有几点需要注意:

  • expect eof 将优雅地等待生成的命令退出
  • 我已经转义了内部双引号。

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

#!/bin/bash

export user=pepe
export host=server
export pass=`cat /tmp/password.txt`

export cmd=df

expect << 'END_EXPECT'
    spawn ssh $env(user)@$env(host) $env(cmd)
    expect "*assword*"
    send $env(pass)\r
    expect eof
END_EXPECT

我要做的最后一件事是减少密码的暴露。 Expect 建立在 语言之上,完全可以读取文件:

#!/bin/bash

export user=pepe
export host=server
export pass=`cat /tmp/password.txt`

export cmd=df

expect << 'END_EXPECT'
    set fh [open /tmp/password.txt]
    gets $fh pass
    close $fh

    spawn ssh $env(user)@$env(host) $env(cmd)
    expect "*assword*"
    send $pass\r
    expect eof
END_EXPECT

并确保该密码文件的权限尽可能严格:

mv /tmp/password.txt ~/.local/share/pass.txt
chmod 0400 ~/.local/share/pass.txt

【讨论】:

    猜你喜欢
    • 2015-11-18
    • 1970-01-01
    • 2019-09-13
    • 2016-02-28
    • 1970-01-01
    • 2016-04-13
    • 2017-06-11
    • 2014-09-20
    • 1970-01-01
    相关资源
    最近更新 更多