Melko usein tulee tilanteita, jolloin pääsyä palvelimelle tarvitaan tässä ja nyt. Yhteyden muodostaminen SSH:n kautta ei kuitenkaan aina ole kätevin tapa, koska sinulla ei välttämättä ole SSH-asiakasta, palvelinosoitetta tai käyttäjä/salasana-yhdistelmää käsillä. Tietysti on
Joten päätin toteuttaa yksinkertaisen mutta mielenkiintoisen ratkaisun. Nimittäin kirjoittaa Telegram-botti, joka käynnistettäessä itse palvelimelle suorittaa sille lähetetyt komennot ja palauttaa tuloksen. Opiskeltuaan
Totesin tämän projektin Ubuntu 16.04:ssä, mutta häiriöttömän ajon takaamiseksi muissa jakeluissa yritin tehdä kaiken yleisellä tavalla.
Botin rekisteröinti
Rekisteröi uusi botti @BotFatherilla. Lähetämme hänet /newbot
ja vielä tekstissä. Tarvitsemme uuden bot-tunnuksen ja tunnuksesi (saat sen esimerkiksi osoitteesta
Pythonin valmistelu
Botin suorittamiseen käytämme kirjastoa telebot
(pip install pytelegrambotapi
). Kirjaston käyttäminen subprocess
suoritamme komennot palvelimella.
Botin käynnistäminen
Luo bot.py-tiedosto palvelimelle:
nano bot.py
Ja liitä koodi siihen:
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)#в случае падения
Korvaamme siinä olevan bot-tunnuksen @BotFatherin myöntämällä tunnuksella ja user_id tilisi id-arvolla. Käyttäjätunnuksen tarkistaminen on tarpeen, jotta botti tarjoaa pääsyn palvelimellesi vain sinulle. Toiminto check_output()
suorittaa annetun komennon ja palauttaa tuloksen.
Jäljelle jää vain botin käynnistäminen. Prosessien suorittamiseen palvelimella käytän mieluummin screen
(sudo apt-get install screen
):
screen -dmS ServerBot python3 bot.py
(jossa "ServerBot" on prosessitunnus)
Prosessi suoritetaan automaattisesti taustalla. Siirrytään keskusteluun botin kanssa ja tarkistetaan, että kaikki toimii niin kuin pitää:
Onnittelut! Botti suorittaa sille lähetetyt komennot. Nyt, jotta pääset palvelimelle, sinun tarvitsee vain avata dialogi botin kanssa.
Komennon toisto
Usein sinun on suoritettava samat komennot palvelimen tilan valvomiseksi. Siksi toistavien komentojen toteuttaminen ilman niiden uudelleenlähetystä on erittäin sopimatonta.
Toteutamme sen viestien alla olevilla painikkeilla:
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)#в случае падения
Botin uudelleenkäynnistys:
killall python3
screen -dmS ServerBot python3 bot.py
Tarkistetaan vielä, että kaikki toimii oikein:
Painamalla viestin alla olevaa painiketta, botin on toistettava komento, josta tämä viesti lähetettiin.
Sen sijaan johtopäätös
Tämä menetelmä ei tietenkään väitä korvaavansa klassisia yhteysmenetelmiä, mutta sen avulla voit nopeasti selvittää palvelimen tilan ja lähettää sille komentoja, jotka eivät vaadi monimutkaista tulostusta.
Lähde: will.com