Akses ke server linux menggunakan bot Telegram dengan Python

Cukup sering ada situasi ketika akses ke server diperlukan di sini dan saat ini. Namun, menghubungkan melalui SSH tidak selalu merupakan cara yang paling nyaman, karena Anda mungkin tidak memiliki klien SSH, alamat server, atau kombinasi pengguna/kata sandi. Tentu saja Webmin, yang menyederhanakan administrasi, tetapi juga tidak menyediakan akses instan.

Jadi saya memutuskan untuk menerapkan solusi yang sederhana namun menarik. Yaitu, untuk menulis bot Telegram yang, ketika diluncurkan di server itu sendiri, akan menjalankan perintah yang dikirimkan kepadanya dan mengembalikan hasilnya. Setelah belajar beberapa artikel tentang topik ini, saya menyadari bahwa belum ada yang menjelaskan implementasi seperti itu.

Saya mengimplementasikan proyek ini di Ubuntu 16.04, tetapi untuk menjalankan bebas masalah di distribusi lain, saya mencoba membuat semuanya secara umum.

Pendaftaran bot

Daftarkan bot baru dengan @BotFather. Kami mengirimnya /newbot dan selanjutnya dalam teks. Kami akan membutuhkan token bot baru dan id Anda (Anda bisa mendapatkannya, misalnya dari @infopenggunabot).

Persiapan ular piton

Untuk menjalankan bot, kita akan menggunakan library telebot (pip install pytelegrambotapi). Menggunakan perpustakaan subprocess kami akan menjalankan perintah di server.

Peluncuran bot

Buat file bot.py di server:
nano bot.py

Dan rekatkan kode 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 mengganti bot token di dalamnya dengan yang dikeluarkan oleh @BotFather, dan user_id dengan nilai id akun Anda. Memeriksa id pengguna diperlukan agar bot menyediakan akses ke server Anda hanya untuk Anda. Fungsi check_output() mengeksekusi perintah yang diberikan dan mengembalikan hasilnya.

Tetap hanya untuk memulai bot. Untuk menjalankan proses di server, saya lebih suka menggunakan screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(di mana "ServerBot" adalah ID proses)

Proses akan secara otomatis berjalan di latar belakang. Mari kita berdialog dengan bot dan periksa apakah semuanya berfungsi sebagaimana mestinya:

Akses ke server linux menggunakan bot Telegram dengan Python

Selamat! Bot mengeksekusi perintah yang dikirimkan kepadanya. Sekarang, untuk mengakses server, Anda hanya perlu membuka dialog dengan bot.

Pengulangan perintah

Seringkali, untuk memantau status server, Anda harus menjalankan perintah yang sama. Oleh karena itu, penerapan perintah berulang tanpa mengirimkannya kembali akan sangat tidak pada tempatnya.

Kami akan menerapkannya menggunakan tombol sebaris di bawah pesan:

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

Mulai ulang bot:

killall python3
screen -dmS ServerBot python3 bot.py

Mari kita periksa lagi apakah semuanya berfungsi dengan benar:

Akses ke server linux menggunakan bot Telegram dengan Python

Dengan menekan tombol di bawah pesan, bot harus mengulangi perintah dari mana pesan ini dikirim.

Alih-alih sebuah kesimpulan

Tentu saja, metode ini tidak berpura-pura menjadi pengganti metode koneksi klasik, namun memungkinkan Anda untuk mengetahui dengan cepat tentang status server dan mengirim perintah ke sana yang tidak memerlukan keluaran yang rumit.

Sumber: www.habr.com

Tambah komentar