Askotan gertatzen dira zerbitzarirako sarbidea hemen eta orain beharrezkoa den egoerak. Hala ere, SSH bidez konektatzea ez da beti modurik erosoena, baliteke SSH bezero, zerbitzari helbidea edo erabiltzaile/pasahitz konbinaziorik eskura ez izatea. Noski
Beraz, irtenbide sinple baina interesgarri bat ezartzea erabaki nuen. Alegia, Telegram bot bat idaztea, zerbitzarian bertan abiarazitakoan, bidalitako komandoak exekutatuko dituena eta emaitza itzuliko duena. Ikasketak eginda
Proiektu hau Ubuntu 16.04-n inplementatu nuen, baina beste banaketa batzuetan arazorik gabe exekutatzeko, dena modu orokorrean egiten saiatu nintzen.
Bot erregistroa
Erregistratu bot berri bat @BotFather-rekin. Bidaltzen dugu /newbot
eta testuan aurrerago. Bot token berri bat eta zure id-a beharko ditugu (adibidez, hemendik lor dezakezu
Python prestaketa
Bota exekutatzeko, liburutegia erabiliko dugu telebot
(pip install pytelegrambotapi
). Liburutegia erabiliz subprocess
komandoak zerbitzarian exekutatuko ditugu.
Bot abian jartzea
Sortu bot.py fitxategi bat zerbitzarian:
nano bot.py
Eta itsatsi kodea bertan:
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)#Π² ΡΠ»ΡΡΠ°Π΅ ΠΏΠ°Π΄Π΅Π½ΠΈΡ
Bertan dagoen bot tokena @BotFather-ek emandakoarekin ordezkatzen dugu eta user_id zure kontuaren id balioarekin. Erabiltzailearen IDa egiaztatzea beharrezkoa da bot-ak zure zerbitzarirako sarbidea zuri bakarrik eman dezan. Funtzioa check_output()
emandako komandoa exekutatzen du eta emaitza itzultzen du.
Botea abiaraztea baino ez da geratzen. Zerbitzarian prozesuak exekutatzeko, nahiago dut erabili screen
(sudo apt-get install screen
):
screen -dmS ServerBot python3 bot.py
(non "ServerBot" prozesuaren IDa den)
Prozesua automatikoki atzeko planoan exekutatzen da. Goazen botarekin elkarrizketara eta egiaztatu dena behar bezala funtzionatzen duela:
Zorionak! Botak bidalitako komandoak exekutatzen ditu. Orain, zerbitzarian sartzeko, bot-arekin elkarrizketa bat ireki besterik ez duzu behar.
Agindu errepikapena
Sarritan, zerbitzariaren egoera kontrolatzeko, komando berdinak exekutatu behar dituzu. Hori dela eta, berriro bidali gabe komandoak errepikatzea oso lekuz kanpo egongo da.
Mezuen azpian dauden lerroko botoiak erabiliz ezarriko dugu:
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)#Π² ΡΠ»ΡΡΠ°Π΅ ΠΏΠ°Π΄Π΅Π½ΠΈΡ
Bota berrabiarazi:
killall python3
screen -dmS ServerBot python3 bot.py
Egiazta dezagun berriro dena ondo funtzionatzen duela:
Mezuaren azpiko botoia sakatuz, bot-ak mezu hau bidali den komandoa errepikatu behar du.
Horren ordez Ondorio baten
Jakina, metodo honek ez du konexio metodo klasikoen ordezkoa denik, hala ere, zerbitzariaren egoera azkar ezagutzeko eta irteera konplexurik behar ez duten komandoak bidaltzeko aukera ematen du.
Iturria: www.habr.com