Aksè nan sèvè linux lè l sèvi avèk Telegram bot nan Python

Byen souvan gen sitiyasyon lè yo bezwen aksè nan sèvè a isit la e kounye a. Sepandan, koneksyon via SSH se pa toujou fason ki pi pratik, paske ou ka pa gen yon kliyan SSH, adrès sèvè, oswa konbinezon itilizatè/modpas nan men. Natirèlman genyen Webmin, ki senplifye administrasyon an, men tou li pa bay aksè enstantane.

Se konsa, mwen deside aplike yon solisyon senp men enteresan. Savwa, ekri yon bot Telegram ki, lè lanse sou sèvè a li menm, pral egzekite kòmandman yo voye ba li epi retounen rezilta a. Lè w fin etidye kèk atik sou sijè sa a, mwen reyalize ke pa gen moun ki poko dekri aplikasyon sa yo.

Mwen aplike pwojè sa a sou Ubuntu 16.04, men pou yon kouri san pwoblèm sou lòt distribisyon, mwen te eseye fè tout bagay nan yon fason jeneral.

Enskripsyon bot

Anrejistre yon nouvo bot ak @BotFather. Nou voye l /newbot ak pi lwen nan tèks la. Nou pral bezwen yon nouvo siy bot ak id ou (ou ka jwenn li, pou egzanp, nan @userinfobot).

Preparasyon Python

Pou kouri bot la, nou pral sèvi ak bibliyotèk la telebot (pip install pytelegrambotapi). Sèvi ak bibliyotèk la subprocess nou pral egzekite kòmandman sou sèvè a.

Lansman bot

Kreye yon fichye bot.py sou sèvè a:
nano bot.py

Epi kole kòd la nan li:

from subprocess import check_output
import telebot
import time

bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#токен бота
user_id = 0 #id вашего аккаунта
@bot.message_handler(content_types=["text"])
def main(message):
   if (user_id == message.chat.id): #проверяем, что пишет именно владелец
      comand = message.text  #текст сообщения
      try: #если команда невыполняемая - check_output выдаст exception
         bot.send_message(message.chat.id, check_output(comand, shell = True))
      except:
         bot.send_message(message.chat.id, "Invalid input") #если команда некорректна
if __name__ == '__main__':
    while True:
        try:#добавляем try для бесперебойной работы
            bot.polling(none_stop=True)#запуск бота
        except:
            time.sleep(10)#в случае падения

Nou ranplase siy bot ki nan li a ak youn nan @BotFather bay, ak user_id ak valè id kont ou a. Tcheke id itilizatè a nesesè pou bot la bay aksè a sèvè ou sèlman pou ou. Fonksyon check_output() egzekite lòd yo bay la epi retounen rezilta a.

Li rete sèlman kòmanse bot la. Pou kouri pwosesis sou sèvè a, mwen prefere itilize screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(kote "ServerBot" se ID pwosesis la)

Pwosesis la pral otomatikman kouri nan background nan. Ann ale nan dyalòg la ak bot la epi tcheke si tout bagay mache jan li ta dwe:

Aksè nan sèvè linux lè l sèvi avèk Telegram bot nan Python

Felisitasyon! Bot la egzekite kòmandman yo voye ba li. Koulye a, yo nan lòd yo jwenn aksè nan sèvè a, ou jis bezwen louvri yon dyalòg ak bot la.

Kòmand repetisyon

Souvan, pou kontwole eta sèvè a, ou gen pou egzekite kòmandman yo menm. Se poutèt sa, aplikasyon an nan repete kòmandman san yo pa renmèt yo pral trè soti nan plas.

Nou pral aplike li lè l sèvi avèk bouton inline anba mesaj yo:

from subprocess import check_output
import telebot
from telebot import types #Добавляем импорт кнопок
import time

bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#Токен бота
user_id = 0 #id вашего аккаунта
@bot.message_handler(content_types=["text"])
def main(message):
   if (user_id == message.chat.id): #проверяем, что пишет именно владелец
      comand = message.text  #текст сообщения
      markup = types.InlineKeyboardMarkup() #создаем клавиатуру
      button = types.InlineKeyboardButton(text="Повторить", callback_data=comand) #создаем кнопку
      markup.add(button) #добавляем кнопку в клавиатуру
      try: #если команда невыполняемая - check_output выдаст exception
         bot.send_message(user_id, check_output(comand, shell = True,  reply_markup = markup)) #вызываем команду и отправляем сообщение с результатом
      except:
         bot.send_message(user_id, "Invalid input") #если команда некорректна

@bot.callback_query_handler(func=lambda call: True)
def callback(call):
  comand = call.data #считываем команду из поля кнопки data
  try:#если команда не выполняемая - check_output выдаст exception
     markup = types.InlineKeyboardMarkup() #создаем клавиатуру
     button = types.InlineKeyboardButton(text="Повторить", callback_data=comand) #создаем кнопку и в data передаём команду
     markup.add(button) #добавляем кнопку в клавиатуру
     bot.send_message(user_id, check_output(comand, shell = True), reply_markup = markup) #вызываем команду и отправляем сообщение с результатом
  except:
     bot.send_message(user_id, "Invalid input") #если команда некорректна

if __name__ == '__main__':
    while True:
        try:#добавляем try для бесперебойной работы
            bot.polling(none_stop=True)#запуск бота
        except:
            time.sleep(10)#в случае падения

Rekòmanse bot la:

killall python3
screen -dmS ServerBot python3 bot.py

Ann tcheke ankò ke tout bagay mache kòrèkteman:

Aksè nan sèvè linux lè l sèvi avèk Telegram bot nan Python

Lè w peze bouton ki anba mesaj la, bot la dwe repete kòmandman ki te voye mesaj sa a.

Olye pou yo yon konklizyon

Natirèlman, metòd sa a pa pretann yo dwe yon ranplasman pou metòd koneksyon klasik yo, sepandan, li pèmèt ou byen vit jwenn enfòmasyon sou eta a nan sèvè a epi voye kòmandman ba li ki pa mande pou pwodiksyon konplèks.

Sous: www.habr.com

Add nouvo kòmantè