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 , 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 tentang topik ini, saya menyadari bahwa belum ada yang menjelaskan implementasi seperti itu.
Saya mengimplementasikan proyek ini pada Ubuntu 16.04, tetapi untuk peluncuran tanpa masalah pada distribusi lain, saya mencoba melakukan semuanya dalam bentuk 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 ).
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:

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:

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
