Отправить команду со словарем по SSH
на код, в котором отправляю команду 'config set'
import paramiko, json, time
host = '192.168.10.9'
user = 'admin'
secret = 'admin'
port = 22
data_to_send = {
"mode": "router",
"wanMode": "DHCP",
"DHCPServerEnable": 1,
"wifiSSID": "YourNet-PL",
"wifiPassword": "12345678",
"webPassword": "admin",
"wifiAdvertisementEnable": 1,
"wifiAccessWebEnable": 0,
"LanIP": "192.168.10.1"
}
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname=host, username=user, password=secret, port=port)
stdin, stdout, stderr = client.exec_command('config get')
data = stdout.read().decode('utf-8') + stderr.read().decode('utf-8')
print("Output:\n" + data)
client.close()
ответ удовлетворительный. Но, когда я пытаюсь вставить в запрос словарь data_to_send:
stdin, stdout, stderr = client.exec_command('config set' + data_to_send)
data = stdout.read().decode('utf-8') + stderr.read().decode('utf-8')
print("Output:\n" + data)
вылает ошибка:
Traceback (most recent call last): File "C:\Users\Admin\PycharmProjects\111\main.py", line 32, in stdin, stdout, stderr = client.exec_command('amip config set' + data_to_send) ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~ TypeError: can only concatenate str (not "dict") to str
По Telnet срабатывает команда
config set '{"mode":"router","wanMode":"DHCP","DHCPServerEnable":1,"wifiSSID":"YourNet-PL","wifiPassword":"12345678","webPassword":"admin","wifiAccessWebEnable":0,"wifiAdvertisementEnable":1,"LanIP":"192.168.10.1"}'
как отправить команду со словарем по SSH?
Ответы (1 шт):
Очевидно @CrazyElf прав.
Ошибка говорит о том, что вы пытаетесь провести операцию конкатенации двух разных типов данных. Что не поддерживается. А для словаря так и вообще не существует в python. И до отправки дело даже не доходит.
Надо применить модуль json для преобразование типа данных словарь, в последовательность символов
import json
dict_to_symbols_seq = json.dumps(data_to_send, separators=(',', ':'))
stdin, stdout, stderr = client.exec_command(f'config set {dict_to_symbols_seq}')
# или так
stdin, stdout, stderr = client.exec_command('config set ' + dict_to_symbols_seq)
Попробуйте так же обернуть строку с передаваемыми значениями в кавычки
stdin, stdout, stderr = client.exec_command(f"config set '{dict_to_symbols_seq}'")
Должно получиться вот так
print(f"config set '{dict_to_symbols_seq}'")
# OUT
config set '{"mode":"router","wanMode":"DHCP","DHCPServerEnable":1,"wifiSSID":"YourNet-PL","wifiPassword":"12345678","webPassword":"admin","wifiAdvertisementEnable":1,"wifiAccessWebEnable":0,"LanIP":"192.168.10.1"}'
Если все так, то надо смотреть документацию/требуемый формат для config set