Shpesh ndodhin situata kur nevojitet qasje në server menjëherë. Megjithatë, lidhja përmes SSH nuk është gjithmonë mënyra më e përshtatshme, sepse ndoshta nuk kemi një klient SSH, adresën e serverit ose çiftin "përdorues/kontratë". Sigurisht, ka , i cili lehtëson administrimin, por ai gjithashtu nuk ofron qasje të menjëhershme.
Prandaj, vendosa tĂ« zbatoj njĂ« zgjidhje tĂ« thjeshtĂ«, por interesante. Konkretisht â tĂ« shkruaj njĂ« bot Telegram-i, i cili, duke u nisur nga vetĂ« serveri, do tĂ« kryejĂ« komandat qĂ« i dĂ«rgohen dhe do tĂ« kthejĂ« rezultatet. Pas studimit nĂ« kĂ«tĂ« temĂ«, kuptova se askush nuk kishte pĂ«rshkruar realizime tĂ« ngjashme.
Ky projekt e realizova në Ubuntu 16.04, por për të siguruar një ekzekutim pa probleme në distribuida të tjera, përpiqem ta bëj gjithçka në një mënyrë universale.
Regjistrimi i botit
Regjistroni një bot të ri te @BotFather. Dërgoni atij /newbot dhe vazhdoni sipas tekstit. Na nevojitet tokeni i botit të ri dhe id juaj (mund ta merrni, për shembull, te ).
Përgatitja e Pythonit
Për të ekzekutuar botin, ne do të përdorim bibliotekën telebot (pip install pytelegrambotapi). Me ndihmën e bibliotekës subprocess , do të kryejmë komandat në server.
Nisja e botit
NĂ« server krijoni skedarin bot.py:
nano bot.py
Dhe futni në të kodin:
from subprocess import check_output
import telebot
import time
bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#token i botit
user_id = 0 #id i llogarisë tuaj
@bot.message_handler(content_types=["text"])
def main(message):
if (user_id == message.chat.id): #kontrollojmë se kush po shkruan
comand = message.text #teksti i mesazhit
try: #nëse komanda nuk ekzekutohet - check_output do të japë një përjashtim
bot.send_message(message.chat.id, check_output(comand, shell = True))
except:
bot.send_message(message.chat.id, "Input i pavlefshëm") #nëse komanda është e papërshtatshme
if __name__ == '__main__':
while True:
try:#shto try për funksionim të vazhdueshëm
bot.polling(none_stop=True)#nisja e botit
except:
time.sleep(10)#në rast të rënies
ZĂ«vendĂ«soni nĂ« tĂ« tokenin e botit me atĂ« qĂ« iu dha @BotFather dhe user_id â me vlerĂ«n id tĂ« llogarisĂ« tuaj. Kontrollimi i id tĂ« pĂ«rdoruesit Ă«shtĂ« i nevojshĂ«m qĂ« boti t'ju japĂ« qasje nĂ« serverin tuaj vetĂ«m juve. Funksioni check_output() ekzekuton komandĂ«n e dĂ«rguar dhe kthen rezultatin.
Tani mbetet vetëm të nisim botin. Për të nisur proceset në server, unë preferoj të përdor screen (sudo apt-get install screen):
screen -dmS ServerBot python3 bot.py(ku "ServerBot" është identifikuesi i procesit)
Procesi do të nisë automatikisht në modin sfond. Le të kalojmë në bisedën me robotin dhe të verifikojmë që gjithçka funksionon siç duhet:

Urime! Roboti po ekzekuton komandat që i dërgoni. Tani, për të aksesuar serverin, mjafton të hapni bisedën me robotin.
Përsëritja e komandave
Shpesh, për monitorimin e gjendjes së serverit është e nevojshme të ekzekutoni të njëjtat komanda. Prandaj, zbatimi i përsëritjes së komandave pa i dërguar ato sërish do të ishte shumë i dobishëm.
Do ta zbatojmë me anë të butonave inline nën mesazhet:
from subprocess import check_output
import telebot
from telebot import types #Shtojmë importin e butonave
import time
bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#Tokeni i robotit
user_id = 0 #id i llogarisë suaj
@bot.message_handler(content_types=["text"])
def main(message):
if (user_id == message.chat.id): #kontrollojmë nëse po shkruan pikërisht pronari
comand = message.text #teksti i mesazhit
markup = types.InlineKeyboardMarkup() #krijojmë tastierën
button = types.InlineKeyboardButton(text="Përsërit", callback_data=comand) #krijojmë butonin
markup.add(button) #shtojmë butonin në tastierë
try: #nëse komanda nuk është ekzekutabile - check_output do të hedhi një exception
bot.send_message(user_id, check_output(comand, shell = True, reply_markup = markup)) #thërrasim komandën dhe dërgojmë një mesazh me rezultatin
except:
bot.send_message(user_id, "Input i pavlefshëm") #nëse komanda është e paplotë
@bot.callback_query_handler(func=lambda call: True)
def callback(call):
comand = call.data #lexojmë komandën nga fusha e butonit data
try:#nëse komanda nuk është ekzekutabile - check_output do të hedhi një exception
markup = types.InlineKeyboardMarkup() #krijojmë tastierën
button = types.InlineKeyboardButton(text="Përsërit", callback_data=comand) #krijojmë butonin dhe në data dërgojmë komandën
markup.add(button) #shtojmë butonin në tastierë
bot.send_message(user_id, check_output(comand, shell = True), reply_markup = markup) #thërrasim komandën dhe dërgojmë një mesazh me rezultatin
except:
bot.send_message(user_id, "Input i pavlefshëm") #nëse komanda është e paplotë
if __name__ == '__main__':
while True:
try:#shtojmë try për funksionim të vazhdueshëm
bot.polling(none_stop=True)#nisim robotin
except:
time.sleep(10)#në rast të rënies
Rinisni robotin:
killall python3
screen -dmS ServerBot python3 bot.py
Sërish do të kontrollojmë që gjithçka funksionon siç duhet:

Duke klikuar butonin nën mesazhin, roboti duhet të përsërisë komandën nga e cila është dërguar ky mesazh.
Në përfundim
Padyshim, ky metodë nuk pretendohet të jetë zëvendësim për mënyrat klasike të lidhjes, megjithatë, ai lejon të dihet shpejt për gjendjen e serverit dhe të dërgohen komanda që nuk kërkojnë një dalje të komplikuar.
Burimi: habr.com
