Отправить команду со словарем по 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 шт):

Автор решения: Dmitry

Очевидно @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

→ Ссылка