请帮忙。我们正在尝试为数据中心中的几个 CyberPower PDU 编写一些自动化程序。它们是机架式交换 PDU(PDU41002),可以进行远程管理,但是我们在处理一些代码时遇到了麻烦。PDU 可通过 SSH 访问,当通过控制台手动登录时,我们可以成功控制插座。我们正在尝试使用远程 SSH 命令编写脚本。我们可以从另一台 Linux 服务器成功进行 SSH,并且会再次提示交互式菜单,但是,如果我们只是尝试发送 SSH 命令与菜单交互,我们会收到错误消息。问题似乎与这个专有的交互式控制台菜单有关。当您登录时,这就是您得到的全部。您不会得到正常的终端提示。只有菜单。它看起来如下:
CyberPowerSystems Inc., Command Shell v1.0
CyberPower System ePDU Firmware Version 1.0.8
(c) Copyright 2010 All Rights Reserved PDU41002
+------- Information -------------------------------------------------------+
Name : 10.10.10.2 Date : 2019/01/02
Contact : Administrator Time : 01:58:40
Location : Datacenter User : Administrator
Up Time : 108 days 22 hours 38 mins 39 secs.
+------- Console -----------------------------------------------------------+
1- Device Manager
2- Network Settings
3- System
4- Logout
<ESC>- Back, <ENTER>- Select&Reflash
> 4
如果我们尝试远程 SSH,就会得到以下结果。请注意,我们必须强制使用较旧的加密才能使其工作。这可行,但不是目标。即,我们能够通过控制台从我们的测试 Linux 机成功登录,并且一旦进入 PDU,就会显示正常的交互式控制台菜单。
[email protected]:~$ ssh -c aes128-cbc,3des-cbc [email protected]
password:
CyberPowerSystems Inc., Command Shell v1.0
CyberPower System ePDU Firmware Version 1.0.8
(c) Copyright 2010 All Rights Reserved PDU41002
+------- Information -------------------------------------------------------+
Name : 10.10.10.2 Date : 2019/01/02
Contact : Administrator Time : 01:58:40
Location : Datacenter User : Administrator
Up Time : 108 days 22 hours 38 mins 39 secs.
+------- Console -----------------------------------------------------------+
1- Device Manager
2- Network Settings
3- System
4- Logout
<ESC>- Back, <ENTER>- Select&Reflash
>
然而,如果我们尝试指定一些命令,我们会得到以下结果:
[email protected]:~$ ssh -c aes128-cbc,3des-cbc [email protected] "1"
password:
exec request failed on channel 0
有什么想法吗?
* 解决方案 *
如果有人看到这篇文章,并且需要让类似的东西为相同的 PDU 工作,这里有一个工作脚本。我把它写得尽可能简单。你只需传递主机名用户名密码和插座,然后点击开始:
#!/usr/bin/expect -f
set hostname [lindex $argv 0]
set username [lindex $argv 1]
set password [lindex $argv 2]
set outlet [lindex $argv 3]
spawn ssh -c aes128-cbc,3des-cbc $username@$hostname
expect "password: "
send "$password\r"
expect "> "
send "1\r"
expect "> "
send "2\r"
expect "> "
send "1\r"
expect "> "
send "$outlet\r"
expect "> "
send "6\r"
expect "> "
send "yes\r"
expect "> "
例如,要对插座 3(可能是挂起的服务器)进行电源循环,请输入以下内容。假设您已将脚本命名为 example.sh 并将其设置为可执行文件:
./<script> <hostname or IP> <username> <password> <outlet>
./example.sh 10.10.10.2 administrator secretpass 3
希望这对其他人有帮助!
答案1
使用expect
或众多替代实现之一。它正是针对这种情况而设计的。它将等待特定提示,然后像交互式会话一样发送配置的响应。