Python'da Telegram botunu kullanarak linux sunucusuna erişim

Çoğu zaman, burada ve şimdi sunucuya erişimin gerekli olduğu durumlar vardır. Ancak SSH ile bağlanmak her zaman en uygun yol değildir çünkü elinizde bir SSH istemcisi, sunucu adresi veya kullanıcı/parola kombinasyonu olmayabilir. tabii ki var Webmin'de, yönetimi basitleştirir, ancak aynı zamanda anında erişim sağlamaz.

Bu yüzden basit ama ilginç bir çözüm uygulamaya karar verdim. Yani, sunucunun kendisinde başlatıldığında kendisine gönderilen komutları yürütecek ve sonucu döndürecek bir Telegram botu yazmak. okuduktan bazı makaleler bu konuda, henüz kimsenin bu tür uygulamaları tanımlamadığını fark ettim.

Ben bu projeyi Ubuntu 16.04 üzerinde uygulamıştım fakat diğer dağıtımlarda sorunsuz çalışması için her şeyi genel bir şekilde yapmaya çalıştım.

bot kaydı

@BotFather ile yeni bir bot kaydedin. onu gönderiyoruz /newbot ve ayrıca metinde. Yeni bir bot jetonuna ve kimliğinize ihtiyacımız olacak (bunu, örneğin, @userinfobot).

Python hazırlığı

Botu çalıştırmak için kütüphaneyi kullanacağız telebot (pip install pytelegrambotapi). Kitaplığı Kullanma subprocess sunucuda komutları çalıştıracağız.

Bot başlatma

Sunucuda bir bot.py dosyası oluşturun:
nano bot.py

Ve içine kodu yapıştırın:

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

İçindeki bot jetonunu @BotFather tarafından verilenle ve user_id'yi hesabınızın id değeriyle değiştiriyoruz. Botun sunucunuza yalnızca size erişim sağlaması için kullanıcı kimliğinin kontrol edilmesi gereklidir. İşlev check_output() verilen komutu yürütür ve sonucu döndürür.

Sadece botu başlatmak için kalır. Sunucuda çalışan işlemler için kullanmayı tercih ederim screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

("ServerBot" işlem kimliğidir)

İşlem otomatik olarak arka planda çalışacaktır. Bot ile diyaloğa gidelim ve her şeyin olması gerektiği gibi çalışıp çalışmadığını kontrol edelim:

Python'da Telegram botunu kullanarak linux sunucusuna erişim

Tebrikler! Bot, kendisine gönderilen komutları yürütür. Şimdi, sunucuya erişmek için bot ile bir diyalog açmanız yeterli.

Komut tekrarı

Genellikle, sunucunun durumunu izlemek için aynı komutları uygulamanız gerekir. Bu nedenle, tekrarlanan komutları yeniden göndermeden uygulamak çok yersiz olacaktır.

Mesajların altındaki satır içi düğmeleri kullanarak uygulayacağız:

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

Botu yeniden başlatma:

killall python3
screen -dmS ServerBot python3 bot.py

Her şeyin doğru çalışıp çalışmadığını tekrar kontrol edelim:

Python'da Telegram botunu kullanarak linux sunucusuna erişim

Bot, mesajın altındaki butona basarak bu mesajın gönderildiği komutu tekrar etmelidir.

Bunun yerine bir sonuca

Elbette bu yöntem, klasik bağlantı yöntemlerinin yerini alıyormuş gibi davranmaz, ancak sunucunun durumu hakkında hızlı bir şekilde bilgi edinmenize ve karmaşık çıktı gerektirmeyen komutlar göndermenize olanak tanır.

Kaynak: habr.com

Yorum ekle