Gyakran előfordulnak olyan helyzetek, amikor a szerverhez azonnal hozzáférés szükséges. Ugyanakkor nem mindig az SSH kapcsolódás a legkényelmesebb módszer, mert lehet, hogy nincs kéznél SSH kliens, a szerver címe vagy a "felhasználó/jelszó" páros. Természetesen van , amely egyszerűsíti az adminisztrációt, de az sem biztosít azonnali hozzáférést.
Ezért egy egyszerű, de érdekes megoldást választottam. Mégpedig - egy Telegram-botot írtam, amely a szerveren futva végrehajtja a küldött parancsokat és visszaadja az eredményt. Tanulmányozva ezzel a témával kapcsolatban rájöttem, hogy senki sem írt hasonló megvalósításokról.
Ezt a projektet Ubuntu 16.04-en valósítottam meg, de más disztribúciókon is problémamentes indítás érdekében igyekeztem mindent általános formában megtenni.
Bot regisztrálása
Új botot regisztrálunk a @BotFather-nél. Küldünk neki /newbot és folytatjuk a szöveget. Szükségünk lesz az új bot tokenjére és a te id-dre (ezt például megszerezheted a ).
Python előkészítése
A bot indításához a telebot (pip install pytelegrambotapi) könyvtárat fogjuk használni. A subprocess segítségével parancsokat fogunk futtatni a szerveren.
A bot indítása
A szerveren létrehozunk egy bot.py fájlt:
nano bot.py
És beillesztjük a kódot:
from subprocess import check_output
import telebot
import time
bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#a bot tokenja
user_id = 0 #a te fiókod azonosítója
@bot.message_handler(content_types=["text"])
def main(message):
if (user_id == message.chat.id): #ellenőrizzük, hogy valóban a tulajdonos ír-e
comand = message.text #üzenet szövege
try: #ha a parancs nem végrehajtható - a check_output kivételt ad vissza
bot.send_message(message.chat.id, check_output(comand, shell = True))
except:
bot.send_message(message.chat.id, "Érvénytelen bemenet") #ha a parancs helytelen
if __name__ == '__main__':
while True:
try:#try hozzáadva a megszakítás nélküli működéshez
bot.polling(none_stop=True)#a bot indítása
except:
time.sleep(10)#összeomlás esetén
Cseréljük ki benne a bot tokenjét arra, amelyet a @BotFather adott, és a user_id-t az accountod azonosítójára. Az user id ellenőrzése azért szükséges, hogy a bot csak neked biztosítson hozzáférést a szerveredhez. A check_output() végrehajtja a megadott parancsot és visszaadja az eredményt.
Már csak a bot indítása van hátra. A folyamatok indításához a szerveren én a screen (sudo apt-get install screen):
screen -dmS ServerBot python3 bot.py(ahol a "ServerBot" a folyamat azonosítója)
A folyamat automatikusan háttérben indul. Lépjünk a bot párbeszédébe, és ellenőrizzük, hogy minden megfelelően működik:

Gratulálunk! A bot végrehajtja a küldött parancsokat. Most, hogy hozzáférjen a szerverhez, elegendő megnyitnia a bot párbeszédét.
Parancsok ismétlése
Gyakran előfordul, hogy a szerver állapotának megfigyeléséhez ugyanazokat a parancsokat kell végrehajtani. Ezért a parancsok ismétlése anélkül, hogy újra kellene küldeni őket, nagyon hasznos lesz.
A megvalósítást az üzenetek alatti inline gombok segítségével végezzük:
from subprocess import check_output
import telebot
from telebot import types #Gombok importálása
import time
bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#Bot token
user_id = 0 #az Ön fiókjának az azonosítója
@bot.message_handler(content_types=["text"])
def main(message):
if (user_id == message.chat.id): #ellenőrizzük, hogy a tulajdonos ír-e
comand = message.text #üzenet szövege
markup = types.InlineKeyboardMarkup() #billentyűzet létrehozása
button = types.InlineKeyboardButton(text="Ismételje meg", callback_data=comand) #gomb létrehozása
markup.add(button) #gomb hozzáadása a billentyűzethez
try: #ha a parancs nem végrehajtható - a check_output kivételt dob
bot.send_message(user_id, check_output(comand, shell = True, reply_markup = markup)) #parancs hívása és üzenet küldése az eredménnyel
except:
bot.send_message(user_id, "Érvénytelen bemenet") #ha a parancs hibás
@bot.callback_query_handler(func=lambda call: True)
def callback(call):
comand = call.data #a parancs beolvasása a gomb data mezőjéből
try:#ha a parancs nem végrehajtható - a check_output kivételt dob
markup = types.InlineKeyboardMarkup() #billentyűzet létrehozása
button = types.InlineKeyboardButton(text="Ismételje meg", callback_data=comand) #gomb létrehozása, és a data mezőbe tesszük a parancsot
markup.add(button) #gomb hozzáadása a billentyűzethez
bot.send_message(user_id, check_output(comand, shell = True), reply_markup = markup) #parancs hívása és üzenet küldése az eredménnyel
except:
bot.send_message(user_id, "Érvénytelen bemenet") #ha a parancs hibás
if __name__ == '__main__':
while True:
try:#a folyamatos működés érdekében adunk hozzá try-t
bot.polling(none_stop=True)#a bot indítása
except:
time.sleep(10)#ha leállt
Bot újraindítása:
killall python3
screen -dmS ServerBot python3 bot.py
Ellenőrizzük újra, hogy minden helyesen működik:

A gombra kattintva a botnak ismételnie kell a parancsot, amelyből a fenti üzenet érkezett.
Összegzésként
Természetesen ez a módszer nem kívánja helyettesíteni a klasszikus csatlakozási módokat, azonban lehetővé teszi, hogy viszonylag gyorsan megtudja a szerver állapotát és parancsokat küldjön neki, anélkül, hogy bonyolult kimenetre lenne szüksége.
Forrás: habr.com
