Ganske ofte er det situasjoner hvor tilgang til serveren er nødvendig her og nå. Men å koble til via SSH er ikke alltid den mest praktiske måten, fordi du kanskje ikke har en SSH-klient, serveradresse eller bruker/passord-kombinasjon for hånden. Selvfølgelig har
Så jeg bestemte meg for å implementere en enkel, men interessant løsning. Nemlig å skrive en Telegram-bot som, når den startes på selve serveren, vil utføre kommandoene som sendes til den og returnere resultatet. Etter å ha studert
Jeg implementerte dette prosjektet på Ubuntu 16.04, men for en problemfri kjøring på andre distribusjoner, prøvde jeg å lage alt på en generell måte.
Bot registrering
Registrer en ny bot med @BotFather. Vi sender ham /newbot
og videre i teksten. Vi trenger et nytt bot-token og ID-en din (du kan få den for eksempel fra
Python forberedelse
For å kjøre boten bruker vi biblioteket telebot
(pip install pytelegrambotapi
). Bruke biblioteket subprocess
vi vil utføre kommandoer på serveren.
Bot lansering
På serveren oppretter du en bot.py-fil:
nano bot.py
Og lim inn koden i den:
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)#в случае падения
Vi erstatter bot-tokenet i det med det utstedt av @BotFather, og user_id med id-verdien til kontoen din. Det er nødvendig å sjekke bruker-IDen slik at boten bare gir deg tilgang til serveren din. Funksjon check_output()
utfører den gitte kommandoen og returnerer resultatet.
Det gjenstår bare å starte boten. For å kjøre prosesser på serveren foretrekker jeg å bruke screen
(sudo apt-get install screen
):
screen -dmS ServerBot python3 bot.py
(der "ServerBot" er prosess-IDen)
Prosessen kjøres automatisk i bakgrunnen. La oss gå til dialogen med boten og sjekke at alt fungerer som det skal:
Gratulerer! Boten utfører kommandoene som sendes til den. Nå, for å få tilgang til serveren, trenger du bare å åpne en dialog med boten.
Kommando repetisjon
Ofte, for å overvåke tilstanden til serveren, må du utføre de samme kommandoene. Derfor vil implementering av repeterende kommandoer uten å sende dem på nytt være veldig malplassert.
Vi vil implementere det ved å bruke innebygde knapper under meldingene:
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)#в случае падения
Starter boten på nytt:
killall python3
screen -dmS ServerBot python3 bot.py
La oss sjekke igjen at alt fungerer som det skal:
Ved å trykke på knappen under meldingen, må boten gjenta kommandoen som denne meldingen ble sendt fra.
I stedet for en konklusjon
Selvfølgelig later ikke denne metoden til å være en erstatning for de klassiske tilkoblingsmetodene, men den lar deg raskt finne ut om tilstanden til serveren og sende kommandoer til den som ikke krever kompleks utgang.
Kilde: www.habr.com