【问题标题】:How can I run an expect script to SSH in a server and set a value inside a bash script如何在服务器中运行期望脚本以进行 SSH 并在 bash 脚本中设置值
【发布时间】:2019-12-11 23:29:21
【问题描述】:

我有一个笨蛋。我有一些我可以访问的服务器,这些服务器在服务器上具有 BMC(基板管理控制器),但只有当您已经通过接口(通过数据路径)通过 SSH 连接到服务器时才能访问它。这个 BMC 有一个迷你操作系统,但是这个操作系统上的日期是完全关闭的,通常是一个月或更长时间,并且无法访问外部网络资源(除非你 scp 覆盖)它需要尽可能手动设置告诉。我正在尝试编写一个bash脚本以SSH到服务器并获取当前日期(这是正确的),然后使用expect使用已知密码SSH到BMC并根据服务器设置的日期设置日期,但是它只是运行脚本并退出而不更改它。更困难的部分是有时有 2 个期望提示(一个用于您是否真的要连接(是/否),另一个用于密码)。我四处寻找,他们不是我为这个复杂的问题找到的答案。另外我有点新期待,在 bash 脚本中运行它很困难。请问我能得到一些帮助吗?

我尝试在 bash 脚本中使用 EOD 来调用期望运行的一部分,但没有骰子。我也尝试使用我当前的代码: 期望 -c "spawn ssh root@address "date -s $DATE" 预计 { “(是/否)”} 发送——“是\r” } “My_known_PW” } 但结果相同

#!/bin/bash
ssh root@$1 -oConnectTimeout=2 << "EOF"
PW="Known_PW"
DATE=$(date +"%y%m%d%H%M")
expect -c "
spawn ssh root@fe80::ff:feff:1%usb0 "date -s $DATE"
expect {
  "(yes/no)" {
    send -- "yes\r"
  }
  "$PW"
}
EOF

预期结果:SSH 到输入的服务器,获取 YYMMDDHHMM 格式的当前日期(即 1908031250)并设置为变量 DATE。然后 SSH 到 BMC 并从 $DATE 设置日期并退出。它所做的只是退出

【问题讨论】:

    标签: bash ssh expect


    【解决方案1】:

    构建在 之上, 是一种内置日期时间功能的全功能脚本语言。您不需要在此处将 shell 变量传递给期望主体:

    ssh $USER@$1 -qoConnectTimeout=2 << "EOF"
        $(type -P expect) << 'EOD'
            set date [clock format [clock seconds] -format "%y%m%d%H%M"]
            spawn ssh root@fe80::ff:ff80:1%usb0 -o StrictHostKeyChecking=no "date -s $date"
            expect "password:"
            send "my_password\r"
            expect eof
    
    EOD
    EOF
    

    【讨论】:

      【解决方案2】:

      想通了!我基本上不得不使用“expect eof”,因为如果我理解正确的话,它有助于确保终端在执行命令之前准备就绪。现在代码如下:

      #!/bin/bash
      
      if [[ $(ssh root@$1 -oBatchMode=yes -oConnectTimeout=2 -oLogLevel=QUIET "exit") ]];then
        USER=root
      else
        USER=siteops
      fi
      ssh $USER@$1 -qoConnectTimeout=2 << "EOF"
      DATE=$(date +"%y%m%d%H%M")
      $(type -P expect) << EOD
      spawn ssh root@fe80::ff:ff80:1%usb0 -o StrictHostKeyChecking=no "date -s $DATE"
      expect "password:"
        send "my_password\r"
      expect eof
      EOD
      EOF
      exit
      

      【讨论】:

        【解决方案3】:

        您可能会看到 您真的要连接吗(是/否)

        1. 这台机器是新机器,以前从未连接过
        2. 机器签名已手动从白名单中移除(authorized_keys)。
        3. 以前的 SSH 命令有严格的说明,不能将机器签名记录在授权机器列表中。

        以上任何一项都会提示 SSH 发出此警告。

        您可以在~/.ssh/authorized_keys 文件中找到所有列入白名单的 IP 及其主机签名。

        如果您信任远程机器,您可以指示 SSH 认为该机器是受信任的,而不管机器签名如何。 这可以通过在 SSH 命令中添加-o StrictHostKeyChecking=no 来完成。

        ssh -o StrictHostKeyChecking=no root@fe80::ff:feff:1%usb0
        

        您可能希望使用NTPd server 进行时间同步。目前看来,实现这一目标的方法很冗长。

        如果没有,您还可以使用SaltStackChef 等自动化工具来更高效、更稳定地执行此操作。

        【讨论】:

        • 我没有想过使用 -o 来禁用这个提示,因为这个域上的所有服务器都由厨师管理并且在这个白名单上 AFAIK,注意!这个 BMC 是一个特例,尽管它尝试使用任何其他服务器或程序来同步时间,因为它不连接到 anything 但我可以通过 SSH 连接到的服务器。可以将其想象为具有严格网络策略的 LAN,无法访问外部资源,更不用说它的磁盘空间有限了。这更像是一种优化,然后如果有意义就需要自动化
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-03
        • 2013-10-01
        • 2019-01-26
        • 1970-01-01
        相关资源
        最近更新 更多