Пожалуйста помоги. Мы пытаемся написать некоторую автоматизацию для нескольких CyberPower PDU в нашем центре обработки данных. Это коммутируемые PDU для монтажа в стойку (PDU41002), и они могут управляться удаленно, однако у нас возникли проблемы с некоторыми кодами. PDU доступен через SSH, и при ручном входе в систему через консоль мы можем успешно управлять розетками. Мы пытаемся создать сценарий с помощью удаленных команд SSH. Мы можем успешно использовать SSH с другого сервера Linux, и снова будет предложено интерактивное меню, однако, если вместо этого мы просто попытаемся отправить команды 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, мы увидим обычное интерактивное меню консоли.
administrator@10.10.10.1:~$ ssh -c aes128-cbc,3des-cbc administrator@10.10.10.2
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
>
Однако если мы попытаемся указать какую-то команду, мы получим следующее:
administrator@10.10.10.1:~$ ssh -c aes128-cbc,3des-cbc administrator@10.10.10.2 "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
Надеюсь, это поможет кому-то еще!
Использовать expect
или одна из множества альтернативных реализаций. Он предназначен именно для этого случая. Он будет ждать определенного запроса, а затем отправит настроенный ответ как интерактивный сеанс.