Pythonda Telegram boti yordamida Linux serveriga kirish

Ko'pincha bu erda va hozir serverga kirish kerak bo'lgan holatlar mavjud. Biroq, SSH orqali ulanish har doim ham eng qulay usul emas, chunki sizda SSH mijozi, server manzili yoki foydalanuvchi/parol birikmasi bo'lmasligi mumkin. Albatta bor Vebmin, bu boshqaruvni soddalashtiradi, lekin u ham tezkor kirishni ta'minlamaydi.

Shuning uchun men oddiy, ammo qiziqarli yechimni amalga oshirishga qaror qildim. Ya'ni, serverda ishga tushirilganda unga yuborilgan buyruqlarni bajaradigan va natijani qaytaradigan Telegram botini yozish. O'qigan bir nechta maqolalar Ushbu mavzu bo'yicha, men hali hech kim bunday ilovalarni tasvirlamaganligini angladim.

Men ushbu loyihani Ubuntu 16.04 da amalga oshirdim, ammo boshqa tarqatishlarda muammosiz ishlash uchun men hamma narsani umumiy tarzda qilishga harakat qildim.

Botni ro'yxatdan o'tkazish

@BotFather bilan yangi botni ro'yxatdan o'tkazing. Biz uni yuboramiz /newbot va keyingi matnda. Bizga yangi bot tokeni va sizning identifikatoringiz kerak bo'ladi (siz uni, masalan, dan olishingiz mumkin @userinfobot).

Python tayyorlash

Botni ishga tushirish uchun biz kutubxonadan foydalanamiz telebot (pip install pytelegrambotapi). Kutubxonadan foydalanish subprocess serverda buyruqlarni bajaramiz.

Botni ishga tushirish

Serverda bot.py faylini yarating:
nano bot.py

Va unga kodni joylashtiring:

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

Undagi bot tokenini @BotFather tomonidan chiqarilgan tokenga va user_id hisob qaydnomangizning id qiymatiga almashtiramiz. Bot serveringizga faqat sizga kirishni ta'minlashi uchun foydalanuvchi identifikatorini tekshirish kerak. Funktsiya check_output() berilgan buyruqni bajaradi va natijani qaytaradi.

Faqat botni ishga tushirish qoladi. Serverda ishlaydigan jarayonlar uchun men foydalanishni afzal ko'raman screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(bu erda "ServerBot" jarayon identifikatori)

Jarayon avtomatik ravishda fonda ishlaydi. Keling, bot bilan dialogga boramiz va hamma narsa kerakli tarzda ishlayotganini tekshiramiz:

Pythonda Telegram boti yordamida Linux serveriga kirish

Tabriklaymiz! Bot unga yuborilgan buyruqlarni bajaradi. Endi serverga kirish uchun bot bilan dialog ochish kifoya.

Buyruqning takrorlanishi

Ko'pincha server holatini kuzatish uchun siz bir xil buyruqlarni bajarishingiz kerak. Shuning uchun, takroriy buyruqlarni ularni qayta yubormasdan amalga oshirish juda o'rinsiz bo'ladi.

Biz buni xabarlar ostidagi satr tugmalari yordamida amalga oshiramiz:

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

Botni qayta ishga tushirish:

killall python3
screen -dmS ServerBot python3 bot.py

Hammasi to'g'ri ishlayotganini yana bir bor tekshiramiz:

Pythonda Telegram boti yordamida Linux serveriga kirish

Xabar ostidagi tugmani bosib, bot ushbu xabar yuborilgan buyruqni takrorlashi kerak.

Xulosa o'rniga

Albatta, bu usul klassik ulanish usullarining o'rnini bosadigan da'vo qilmaydi, ammo bu sizga serverning holatini tezda bilib olish va unga murakkab chiqishni talab qilmaydigan buyruqlarni yuborish imkonini beradi.

Manba: www.habr.com

a Izoh qo'shish