我如何在服务器中运行Expect脚本以SSH并在bash脚本中设置值

时间:2019-08-03 19:56:13

标签: bash ssh expect

我有点傻。我有一些服务器可以访问,这些服务器在服务器上具有BMC(基板管理控制器),但是只有当您已经通过接口SSHd连接到服务器时(可以通过数据路径访问),才能访问该服务器。该BMC装有一个微型操作系统,但是该操作系统上的日期通常会关闭一个月或一个月或更长时间,并且无法访问外部网络资源(除非您将它们浪费了),它需要手动设置。告诉。我正在尝试将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设置日期并退出。它所做的就是退出

3 个答案:

答案 0 :(得分:0)

出于几个原因,您可能会看到您真的要连接(是/否)

  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之类的自动化工具来更高效,更稳定地完成此任务。

答案 1 :(得分:0)

想通了!我基本上必须使用“ 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

答案 2 :(得分:0)

构建在之上,{{3}}是具有内置日期时间功能的全功能脚本语言。您无需在此处将shell变量传递给Expect主体:

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