Hiel faak binne d'r situaasjes as tagong ta de tsjinner hjir en no nedich is. Ferbining fia SSH is lykwols net altyd de maklikste manier, om't jo miskien gjin SSH-kliïnt, serveradres of brûker/wachtwurdkombinaasje by de hân hawwe. Fansels hawwe
Dat ik besleat om in ienfâldige, mar ynteressante oplossing út te fieren. Nammentlik in Telegram-bot te skriuwen dy't, as it op 'e server sels wurdt lansearre, de kommando's sil útfiere dy't dernei stjoerd binne en it resultaat weromjaan. Studearre hawwen
Ik implementearre dit projekt op Ubuntu 16.04, mar foar in probleemfrije run op oare distribúsjes, besocht ik alles op in algemiene manier te meitsjen.
Bot registraasje
Registrearje in nije bot mei @BotFather. Wy stjoere him /newbot
en fierder yn 'e tekst. Wy sille in nij bot-token en jo id nedich hawwe (jo kinne it bygelyks krije fan
Python tarieding
Om de bot út te fieren, sille wy de bibleteek brûke telebot
(pip install pytelegrambotapi
). It brûken fan de biblioteek subprocess
wy sille kommando's útfiere op 'e tsjinner.
Bot lansearring
Meitsje in bot.py-bestân op de tsjinner:
nano bot.py
En plak de koade deryn:
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)#в случае падения
Wy ferfange it bot-token dêryn mei dejinge útjûn troch @BotFather, en user_id mei de id-wearde fan jo akkount. It kontrolearjen fan de brûkers-id is nedich, sadat de bot allinich tagong jout ta jo server. Funksje check_output()
fiert it opjûne kommando út en jout it resultaat werom.
It bliuwt allinich om de bot te begjinnen. Foar it útfieren fan prosessen op de tsjinner, ik leaver te brûken screen
(sudo apt-get install screen
):
screen -dmS ServerBot python3 bot.py
(wêr't "ServerBot" de proses-ID is)
It proses sil automatysk op 'e eftergrûn rinne. Litte wy nei it dialooch gean mei de bot en kontrolearje dat alles wurket sa't it moat:
Lokwinske! De bot útfiert de kommando's dy't dernei stjoerd binne. No, om tagong te krijen ta de tsjinner, moatte jo gewoan in dialooch iepenje mei de bot.
Kommando werhelling
Faak, om de steat fan 'e tsjinner te kontrolearjen, moatte jo deselde kommando's útfiere. Dêrom sil de ymplemintaasje fan it werheljen fan kommando's sûnder se opnij te ferstjoeren heul net plak wêze.
Wy sille it ymplementearje mei inline-knoppen ûnder de berjochten:
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)#в случае падения
De bot opnij starte:
killall python3
screen -dmS ServerBot python3 bot.py
Litte wy nochris kontrolearje dat alles goed wurket:
Troch op de knop ûnder it berjocht te drukken, moat de bot it kommando werhelje wêrfan dit berjocht ferstjoerd is.
Yn stee fan in konklúzje
Fansels, dizze metoade net pretend te wêzen in ferfanging foar de klassike ferbining metoaden, mar it makket it mooglik om fluch útfine oer de steat fan de tsjinner en stjoere kommando's dy't net nedich komplekse útfier.
Boarne: www.habr.com