Управление конфигуратором в режиме агента с помощью python

1. Alex10166 30 11.04.20 22:05 Сейчас в теме
В статье "Режим агента конфигуратора" технологического блога 1С приводится пример управления конфигуратором с помощью языка python.

import paramiko

host = '127.0.0.1'
user = 'login'
secret = 'password'
port = 1543

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname=host, port=port, username=user, password=secret)

stdin, stdout, stderr = client.exec_command('common connect-ib')
data = stdout.read() + stderr.read()

// Тут подразумевается код команд конфигуратору после подключения к базе

stdin, stdout, stderr = client.exec_command('common disconnect-ib')
data = stdout.read() + stderr.read()

client.close()
Показать


Оригинал кода можно посмотреть по ссылке выше. Я попробовал воспроизвести этот код. Проблема возникла в том, что метод exec_command() после выполнения одной команды закрывает сессию. Поэтому таким способом нельзя выполнить две команды последовательно в рамках одного подключения, созданного методом client.connect(hostname=host, username=user, password=secret, port=port). Следовательно, после подключения к базе командой 'common connect-ib' любую другую команду для базы уже выполнить нельзя, используя exec_command().
Я пошел другим путем. Запуск конфигуратора в режиме агента из командной строки с помощью subprocess.Popen(). Параметры командной строки есть в Руководстве администратора ИТС.
/F - путь к базе
/AgentMode - режим агента
/AgentSSHHostKeyAuto - ключ для подключения берется из файла host_id в директории 1С
/AgentBaseDir - путь к директории, с которой будет работать конфигуратор для загрузки/выгрузки файлов.
/Visible - режим видимости агента, появляется окно при запуске конфигуратора в этом режиме

import subprocess
import paramiko
import time

p = subprocess.Popen([r'c:\Program Files (x86)\1cv8\8.3.15.1830\bin\1cv8.exe', 
				     r'DESIGNER', 
                                     r'/F d:\Test', r'/AgentMode', r'/AgentSSHHostKeyAuto', 
                                     r'/AgentBaseDir d:\Test\Agent', r'/Visible'])

time.sleep(5)

host = '127.0.0.1'
user = 'Admin'
secret = '123'
port = 1543

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname=host, port=port, username=user, password=secret)

transport = client.get_transport()
channel = transport.open_session()
channel.invoke_shell()
print(channel.recv(5000).decode('utf-8'))

channel.send('options set --show-prompt=no\n')
time.sleep(3)
print('Нет коммандной строки: ' + channel.recv(5000).decode('utf-8'))  

channel.send('common connect-ib\n')
time.sleep(1)
print('Подключение к базе: ' + channel.recv(5000).decode('utf-8'))

channel.send(r'config dump-cfg --file=\1Cv8.cf' + '\n') 
while not channel.recv_ready():
    i = 0
print('Выгрузка конфигурации: ' + channel.recv(5000).decode('utf-8'))
time.sleep(1)

channel.send('common disconnect-ib\n')
time.sleep(1)
print('Отключение от базы: ' + channel.recv(5000).decode('utf-8'))

channel.send('common shutdown\n')
time.sleep(1)
print('Завершение работы: ' + channel.recv(5000).decode('utf-8'))

channel.close()
client.close()

print("конец программы")
Показать


Я использовал получение интерактивной сессии оболочки через invoke_shell(). После этого можно отправлять команды конфигуратору через сообщения channel.send('common connect-ib\n'), при этом канал остается открытым и ответ сервера можно получить через channel.recv(). При отправке команд через сообщения обязательно строка команды должна заканчиваться '\n' (переход строки).
'options set --show-prompt=no\n' - отключает приглашение 'designer>' в командной строке
'common connect-ib\n' - подключение к информационной базе
'config dump-cfg --file=\1Cv8.cf' - выгрузка файла конфигурации в заданную директорию
'common disconnect-ib\n' - отключение от информационной базы
'common shutdown\n' - завершение работы конфигуратора
По теме из базы знаний
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот