Связь нескольких программ на разных ПК с Телеграм ботом
Есть несколько копий программы на разных компьютерах (у каждого прописывается уникальный тэг), и отдельный сервер с телеграм ботом (на библиотеке telegrambotapi).
Каким способом можно реализовать функции, когда в телеграм боте выбирается тэг программы и, например, следующая функция:
1) Приостановить или запустить скрипт (направление бот-программа).
2) Получить из скрипта какое-то значение (направление программа-бот).
У меня есть идея запустить на сервере с Телеграм ботом базу MySQL с возможностью подключиться с любого устройства (с открытым IP или как это называется), создать для каждой программы таблицу, в которую в виде столбцов внести нужные функции с булевым типом данных, а в самой программе в отдельном потоке создать проверку своей таблицы, и если она находит значение True, то выполняет действие. Однако я крайне не уверен в безопасности данного способа.
Заранее спасибо!
Ответы (1 шт):
users = [123, 456, 789]
adm = [123, 789]
# для Windows
def run_script(pc):
s = winrm.Session(pc, auth=(pc_admin, pc_password), transport='ntlm') # pc = dns name
stop = s.run_cmd('net stop spooler')
status_stop = stop.std_out.translate(None, b'\r\n').decode('cp866').replace('The ', '').replace('.', '\n')
return str(status_stop + ' ' + stop.status_code)
# для Linux
def ssh_connect(command):
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname='', username='', password='', port=22)
stdin, stdout, stderr = client.exec_command(command)
data = stdout.read().decode('utf-8').strip('\n')
client.close()
return data
# Органичение доступа к боту по ID
@bot.message_handler(func=lambda message: message.chat.id not in users)
def some(message):
bot.send_message(message.chat.id, 'Мне не дозволено общаться с незнакомцами')
# Органичение выполнение команды start
@bot.message_handler(commands=['start'])
def some(message):
if message.chat.id not in users:
bot.send_message(message.chat.id, 'Не дозволено')
elif message.chat.id in adm:
start_keyboard = types.InlineKeyboardMarkup()
run_script_button = types.InlineKeyboardButton(text='Запуск скрипта', callback_data='run_script')
start_keyboard.add(run_script_button)
bot.send_message(message.chat.id, 'Велкам', reply_markup=start_keyboard)
else:
bot.send_message(message.chat.id, 'Мне не дозволено общаться с незнакомцами')
@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call):
if call.data == 'run_script':
check_keyboard = types.InlineKeyboardMarkup()
pc1_button = types.InlineKeyboardButton(text='PC1', callback_data='PC1')
pc2_button = types.InlineKeyboardButton(text='PC2', callback_data='PC2')
check_keyboard.add(pc1_button, pc2_button)
bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id,
text='Запустить скрипт на:', reply_markup=check_keyboard)
elif call.data == 'pc1':
service = run_script('pc1')
bot.send_message(call.message.chat.id, '{}'.format(service))
elif call.data == 'pc2':
service = ssh_connect('service comproxy status | grep "Active" | awk \'{print $2, $3, $9, $10}\'')
bot.send_message(call.message.chat.id, '{}'.format(service))
таким образом имеем:
- доступ к боту только для нужных пользователей
- доступ к выполнению команды только для администраторов
- выбор ПК для выполнения команды
- выполнение команд как для Wnidows так и для Linux