Akses kepada pelayan linux menggunakan bot Telegram dalam Python

Selalunya terdapat situasi apabila akses kepada pelayan diperlukan di sini dan sekarang. Walau bagaimanapun, menyambung melalui SSH bukanlah kaedah yang paling mudah, kerana anda mungkin tidak mempunyai klien SSH, alamat pelayan atau gabungan pengguna/kata laluan. Sudah tentu ada Webmin, yang memudahkan pentadbiran, tetapi ia juga tidak menyediakan akses segera.

Jadi saya memutuskan untuk melaksanakan penyelesaian yang mudah tetapi menarik. Iaitu, tulis bot Telegram yang, apabila dilancarkan pada pelayan itu sendiri, akan melaksanakan arahan yang dihantar kepadanya dan mengembalikan hasilnya. Setelah belajar beberapa Perkara Mengenai topik ini, saya menyedari bahawa belum ada sesiapa yang menerangkan pelaksanaan sedemikian.

Saya melaksanakan projek ini pada Ubuntu 16.04, tetapi untuk pelancaran tanpa masalah pada pengedaran lain, saya cuba melakukan semuanya secara umum.

Pendaftaran bot

Mendaftarkan bot baharu dengan @BotFather. Kami hantar kepadanya /newbot dan seterusnya dalam teks. Kami memerlukan token untuk bot baharu dan id anda (anda boleh mendapatkannya, contohnya, dari @userinfobot).

Penyediaan Python

Untuk melancarkan bot kami akan menggunakan perpustakaan telebot (pip install pytelegrambotapi). Menggunakan perpustakaan subprocess Kami akan melaksanakan arahan pada pelayan.

Menjalankan bot

Pada pelayan kami mencipta fail bot.py:
nano bot.py

Dan tampal kod ke dalamnya:

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

Kami menggantikan token bot di dalamnya dengan token yang dikeluarkan oleh @BotFather dan user_id dengan nilai id akaun anda. Mengesahkan ID pengguna adalah perlu supaya bot menyediakan akses kepada pelayan anda hanya kepada anda. Fungsi check_output() melaksanakan arahan yang diluluskan dan mengembalikan hasilnya.

Yang tinggal hanyalah melancarkan bot. Untuk menjalankan proses pada pelayan saya lebih suka menggunakan screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(di mana "ServerBot" ialah ID proses)

Proses akan bermula secara automatik di latar belakang. Mari kita pergi ke dialog dengan bot dan pastikan semuanya berfungsi sebagaimana mestinya:

Akses kepada pelayan linux menggunakan bot Telegram dalam Python

tahniah! Bot melaksanakan arahan yang dihantar kepadanya. Sekarang, untuk mengakses pelayan, anda hanya perlu membuka dialog dengan bot.

Mengulangi arahan

Selalunya, untuk memantau keadaan pelayan, anda perlu menjalankan arahan yang sama. Oleh itu, pelaksanaan mengulang arahan tanpa menghantarnya lagi adalah sangat sesuai.

Kami akan melaksanakannya menggunakan butang sebaris di bawah mesej:

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

Mulakan semula bot:

killall python3
screen -dmS ServerBot python3 bot.py

Mari semak semula bahawa semuanya berfungsi dengan betul:

Akses kepada pelayan linux menggunakan bot Telegram dalam Python

Apabila anda mengklik butang di bawah mesej, bot mesti mengulangi arahan dari mana mesej itu dihantar.

Daripada kesimpulan

Sudah tentu, kaedah ini tidak berpura-pura sebagai pengganti kaedah sambungan klasik, bagaimanapun, ia membolehkan anda mengetahui dengan cepat tentang keadaan pelayan dan menghantarnya arahan yang tidak memerlukan output yang kompleks.

Sumber: www.habr.com

Tambah komen