我有点傻。我有一些服务器可以访问,这些服务器在服务器上具有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设置日期并退出。它所做的就是退出
答案 0 :(得分:0)
出于几个原因,您可能会看到您真的要连接(是/否)
以上任何一种都会提示SSH发出此警告。
您可以在~/.ssh/authorized_keys
文件中找到所有列入白名单的IP及其主机签名。
如果您信任远程计算机,则可以指示SSH认为该计算机是受信任的,而与计算机签名无关。
可以通过在SSH命令中添加-o StrictHostKeyChecking=no
来完成。
ssh -o StrictHostKeyChecking=no root@fe80::ff:feff:1%usb0
您可能希望使用NTPd server进行时间同步。目前看来,这是一个漫长的过程。
答案 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)
expect构建在tcl之上,{{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