bash - 如何在服务器中运行期望脚本以进行 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 设置日期并退出。它所做的只是退出
解决方案
您可能会看到您真的想连接的原因有几个(是/否)
- 这台机器是新的,以前从未连接过
- 机器签名已从白名单(authorized_keys)中手动删除。
- 以前的 SSH 命令有严格的指示,不能将机器签名记录在授权机器列表中。
以上任何一项都会提示 SSH 发出此警告。
您可以在文件中找到所有列入白名单的 IP 及其主机签名~/.ssh/authorized_keys
。
如果您信任远程机器,您可以指示 SSH 认为该机器是受信任的,而不管机器签名如何。这可以通过添加-o StrictHostKeyChecking=no
到 SSH 命令来完成。
ssh -o StrictHostKeyChecking=no root@fe80::ff:feff:1%usb0
您可能希望使用NTPd 服务器进行时间同步。目前看来,实现这一目标的方法很冗长。
推荐阅读
- nestjs - 在 NESTJS 中,如何在多个模块之间共享同一个 Guard 实例?
- spring-cloud - Zookeeper 服务发现 Znode 40s 后删除
- android - 在实时模式下交易时如何解决此 PayuMoney 错误?
- android - Android - 解析包时出现问题 - 使用更正的代码覆盖现有应用程序
- php - symfony 客户端如何检测已安装的 php 客户端?
- hibernate - Spring Data:休眠查询缓存不适用于派生查询
- angular - 尝试从 JSON 字符串化对象访问值时获取未定义
- c++ - 在多态的困难情况下避免 reinterpret_cast
- matlab - 在 3D 矩阵中查找索引
- java - Clean way to write AND filters for List filtering in Java