Pääsy linux-palvelimeen Telegram-botilla Pythonissa

Melko usein tulee tilanteita, jolloin pääsyä palvelimelle tarvitaan tässä ja nyt. Yhteyden muodostaminen SSH:n kautta ei kuitenkaan aina ole kätevin tapa, koska sinulla ei välttämättä ole SSH-asiakasta, palvelinosoitetta tai käyttäjä/salasana-yhdistelmää käsillä. Tietysti on Webmin, joka yksinkertaistaa hallintoa, mutta se ei myöskään tarjoa välitöntä pääsyä.

Joten päätin toteuttaa yksinkertaisen mutta mielenkiintoisen ratkaisun. Nimittäin kirjoittaa Telegram-botti, joka käynnistettäessä itse palvelimelle suorittaa sille lähetetyt komennot ja palauttaa tuloksen. Opiskeltuaan useat artikkelit tästä aiheesta ymmärsin, että kukaan ei ole vielä kuvaillut tällaisia ​​toteutuksia.

Totesin tämän projektin Ubuntu 16.04:ssä, mutta häiriöttömän ajon takaamiseksi muissa jakeluissa yritin tehdä kaiken yleisellä tavalla.

Botin rekisteröinti

Rekisteröi uusi botti @BotFatherilla. Lähetämme hänet /newbot ja vielä tekstissä. Tarvitsemme uuden bot-tunnuksen ja tunnuksesi (saat sen esimerkiksi osoitteesta @käyttäjäinfobot).

Pythonin valmistelu

Botin suorittamiseen käytämme kirjastoa telebot (pip install pytelegrambotapi). Kirjaston käyttäminen subprocess suoritamme komennot palvelimella.

Botin käynnistäminen

Luo bot.py-tiedosto palvelimelle:
nano bot.py

Ja liitä koodi siihen:

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

Korvaamme siinä olevan bot-tunnuksen @BotFatherin myöntämällä tunnuksella ja user_id tilisi id-arvolla. Käyttäjätunnuksen tarkistaminen on tarpeen, jotta botti tarjoaa pääsyn palvelimellesi vain sinulle. Toiminto check_output() suorittaa annetun komennon ja palauttaa tuloksen.

Jäljelle jää vain botin käynnistäminen. Prosessien suorittamiseen palvelimella käytän mieluummin screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(jossa "ServerBot" on prosessitunnus)

Prosessi suoritetaan automaattisesti taustalla. Siirrytään keskusteluun botin kanssa ja tarkistetaan, että kaikki toimii niin kuin pitää:

Pääsy linux-palvelimeen Telegram-botilla Pythonissa

Onnittelut! Botti suorittaa sille lähetetyt komennot. Nyt, jotta pääset palvelimelle, sinun tarvitsee vain avata dialogi botin kanssa.

Komennon toisto

Usein sinun on suoritettava samat komennot palvelimen tilan valvomiseksi. Siksi toistavien komentojen toteuttaminen ilman niiden uudelleenlähetystä on erittäin sopimatonta.

Toteutamme sen viestien alla olevilla painikkeilla:

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

Botin uudelleenkäynnistys:

killall python3
screen -dmS ServerBot python3 bot.py

Tarkistetaan vielä, että kaikki toimii oikein:

Pääsy linux-palvelimeen Telegram-botilla Pythonissa

Painamalla viestin alla olevaa painiketta, botin on toistettava komento, josta tämä viesti lähetettiin.

Sen sijaan johtopäätös

Tämä menetelmä ei tietenkään väitä korvaavansa klassisia yhteysmenetelmiä, mutta sen avulla voit nopeasti selvittää palvelimen tilan ja lähettää sille komentoja, jotka eivät vaadi monimutkaista tulostusta.

Lähde: will.com

Lisää kommentti