Tagong ta Linux-tsjinner mei Telegram-bot yn Python

Hiel faak binne d'r situaasjes as tagong ta de tsjinner hjir en no nedich is. Ferbining fia SSH is lykwols net altyd de maklikste manier, om't jo miskien gjin SSH-kliïnt, serveradres of brûker/wachtwurdkombinaasje by de hân hawwe. Fansels hawwe Webmin, dy't it administraasje simplifies, mar it jout ek gjin direkte tagong.

Dat ik besleat om in ienfâldige, mar ynteressante oplossing út te fieren. Nammentlik in Telegram-bot te skriuwen dy't, as it op 'e server sels wurdt lansearre, de kommando's sil útfiere dy't dernei stjoerd binne en it resultaat weromjaan. Studearre hawwen ferskate artikels oer dit ûnderwerp, Ik realisearre dat gjinien hat noch beskreaun sokke ymplemintaasjes.

Ik implementearre dit projekt op Ubuntu 16.04, mar foar in probleemfrije run op oare distribúsjes, besocht ik alles op in algemiene manier te meitsjen.

Bot registraasje

Registrearje in nije bot mei @BotFather. Wy stjoere him /newbot en fierder yn 'e tekst. Wy sille in nij bot-token en jo id nedich hawwe (jo kinne it bygelyks krije fan @brûkerinfobot).

Python tarieding

Om de bot út te fieren, sille wy de bibleteek brûke telebot (pip install pytelegrambotapi). It brûken fan de biblioteek subprocess wy sille kommando's útfiere op 'e tsjinner.

Bot lansearring

Meitsje in bot.py-bestân op de tsjinner:
nano bot.py

En plak de koade deryn:

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)#в случае падения

Wy ferfange it bot-token dêryn mei dejinge útjûn troch @BotFather, en user_id mei de id-wearde fan jo akkount. It kontrolearjen fan de brûkers-id is nedich, sadat de bot allinich tagong jout ta jo server. Funksje check_output() fiert it opjûne kommando út en jout it resultaat werom.

It bliuwt allinich om de bot te begjinnen. Foar it útfieren fan prosessen op de tsjinner, ik leaver te brûken screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(wêr't "ServerBot" de proses-ID is)

It proses sil automatysk op 'e eftergrûn rinne. Litte wy nei it dialooch gean mei de bot en kontrolearje dat alles wurket sa't it moat:

Tagong ta Linux-tsjinner mei Telegram-bot yn Python

Lokwinske! De bot útfiert de kommando's dy't dernei stjoerd binne. No, om tagong te krijen ta de tsjinner, moatte jo gewoan in dialooch iepenje mei de bot.

Kommando werhelling

Faak, om de steat fan 'e tsjinner te kontrolearjen, moatte jo deselde kommando's útfiere. Dêrom sil de ymplemintaasje fan it werheljen fan kommando's sûnder se opnij te ferstjoeren heul net plak wêze.

Wy sille it ymplementearje mei inline-knoppen ûnder de berjochten:

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)#в случае падения

De bot opnij starte:

killall python3
screen -dmS ServerBot python3 bot.py

Litte wy nochris kontrolearje dat alles goed wurket:

Tagong ta Linux-tsjinner mei Telegram-bot yn Python

Troch op de knop ûnder it berjocht te drukken, moat de bot it kommando werhelje wêrfan dit berjocht ferstjoerd is.

Yn stee fan in konklúzje

Fansels, dizze metoade net pretend te wêzen in ferfanging foar de klassike ferbining metoaden, mar it makket it mooglik om fluch útfine oer de steat fan de tsjinner en stjoere kommando's dy't net nedich komplekse útfier.

Boarne: www.habr.com

Add a comment