Работаю инженером в компании, у которой есть несколько удаленных филиалов и в каждом из них работают сервера видеонаблюдения. Охрана круглосуточно ведет мониторинг происходящего, а приложение видеонаблюдения на этих серверах имеет привычку зависать. Звонки от охраны могут поступать в любое время суток, что очень неудобно, когда ты спишь или нет доступа к ПК, чтобы подключиться удаленно и перезапустить программу

Я начал задумываться о решении данной проблемы путем создания Telegram бота на Python, с помощью которого можно комфортно перезапускать ПО или делегировать это функцию не компетентным людям, например охране

При всем многообразии решений с помощью Telegram ботов, информации на эту тему в интернете мало, поэтому решил поделиться ей здесь, возможно кому то пригодиться

Так же по этому примеру, через запуск скриптов, возможно управлять инфраструктурой серверов предприятия и пр.., все зависит от вашей фантазии

Настройка на серверах

Для начала нужно выполнить настройки на серверах (управляемых ПК) с помощью PowerShell, запустить оснастку необходимо от имени администратора

Включить и настроить WinRM на удаленном компьютере:

  • Разрешаем удаленные сессии

Enable-PSremoting –force
  • Разрешить удаленное взаимодействие с PowerShell если компьютер находится в общедоступной сети

Enable-PSremoting -skipnetworkprofilecheck –force
  • Выполнять локальные скрипты без ограничений

Set-executionpolicy remotesigned

На клиентском (управляющем) ПК тоже необходимо выполнить настройки

  • Добавить IP адреса компьютеров, к которым мы будем подключаться в TrustedHosts или же просто разрешить все добавив *

Set-item wsman:\localhost\client\trustedhosts *

Теперь с помощью PowerShell ISE создадим скрипт для запуска/перезапуска процесса программы, которую необходимо перезапустить, тут же можно будет проверить его выполнение

$proc = Get-Process | Where-Object  {$_.Name -eq "Имя Процесса"}
$proc.Kill()
Start-Process "C:\apps\Путь к программе "

Далее на серверах создадим простую задачу без триггеров и расписания в планировщике заданий, где укажем только действие на запуск нашего скрипта

Перейдем к настройке клиента

В качестве клиентского компьютера использовалась виртуальная машина с Windows 10

Сервера видеонаблюдения не входят в домен, поэтому придется обойти авторизацию, для этого нам необходимо создать одинаковых пользователей с правами администратора и одинаковым паролем на серверах и клиентском ПК и все действия ниже нужно выполнять под этим пользователем

На клиентском ПК создаем скрипты запуска заданий, которые мы создали на серверах

Invoke-Command -ComputerName 'IP адрес' -ScriptBlock {Start-ScheduledTask 'Название задания'}

Чтобы в дальнейшем наш бот смог выполнять эти скрипты, назначаем программу PowerShell для их выполнения по умолчанию, изначально назначен блокнот

Создаем Telegram бота

Находим контакт с именем @BotFather, пишем /newbot, далее указываем название бота

Отсюда нам понадобится token нашего бота

Далее при помощи команды /mybots выбираем и редактируем нашего бота, здесь мы можем настроить меню для запуска наших команд

Устанавливаем Python

Забегая вперед, скажу, что библиотека Python, которую мы будем подключать, почему то работала с ошибками в некоторых версиях Python, я установил PyCharm, Python 3.9.13 вместе с IDE, с ним все работало корректно. Ссылка https://www.jetbrains.com/pycharm/

Далее открываем Cmd или PowerShell от имени администратора и устанавливаем библиотеку для управления нашим ботом

py -m pip install telepot

Теперь напишем код нашего Telegram бота

import telepot, time, subprocess

def remote(msg):
    content_type, chat_type, chat_id = telepot.glance(msg)

    if (content_type == 'text'):
        command = msg['text']
        print ('Got command: %s' % command)

        if  '/address1' in command: #Комманда в Telegram
            p = subprocess.Popen(expert1, shell=True) #Указываем переменную  
            p = subprocess.Popen(expert2, shell=True)
            bot.sendMessage(chat_id, "DONE") #Вывод сообщения в чат

        if  '/address2' in command:
            p = subprocess.Popen(expert3, shell=True)
            p = subprocess.Popen(expert4, shell=True)            
            p = subprocess.Popen(expert5, shell=True)
            bot.sendMessage(chat_id, "DONE")

        if  '/address3' in command:
            p = subprocess.Popen(expert6, shell=True)
            p = subprocess.Popen(expert7, shell=True)
            bot.sendMessage(chat_id, "DONE")
        
bot = telepot.Bot('Ваш token Telegam бота') #Указываем token Telegam бота

expert1 = 'C:\Telegram\expert1.ps1' #Указваем путь к скрипту 
expert2 = 'C:\Telegram\expert2.ps1'
expert3 = 'C:\Telegram\expert3.ps1'
expert4 = 'C:\Telegram\expert4.ps1'
expert5 = 'C:\Telegram\expert5.ps1'
expert6 = 'C:\Telegram\expert6.ps1'
expert7 = 'C:\Telegram\expert7.ps1'

bot.message_loop(remote)

while 1:
    time.sleep(20)

Запускаем бота

Проверяем работу

Наш бот готов!

Комментарии (1)


  1. valkumei
    28.10.2022 12:46
    +3

    Не со зла, тема любопытная, но вспомнил "Лечение кариеса через толстую кишку").