首页 > 解决方案 > 如何在服务器中运行期望脚本以进行 SSH 并在 bash 脚本中设置值

问题描述

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

我尝试在 bash 脚本中使用 EOD 来调用期望运行的一部分,但没有骰子。我也尝试使用我当前的代码:expect -c "spawn ssh root@address "date -s $DATE" expect { "(yes/no)"} send -- "yes\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 设置日期并退出。它所做的只是退出

标签: bashsshexpect

解决方案


您可能会看到您真的想连接的原因有几个(是/否)

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

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

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

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

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

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

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


推荐阅读