Mara nyingi kuna hali wakati ufikiaji wa seva unahitajika hapa na sasa. Walakini, kuunganisha kupitia SSH sio njia rahisi kila wakati, kwa sababu unaweza usiwe na mteja wa SSH, anwani ya seva, au mchanganyiko wa mtumiaji/nenosiri karibu. Bila shaka kuwa
Kwa hiyo niliamua kutekeleza suluhisho rahisi lakini la kuvutia. Yaani, kuandika bot ya Telegram ambayo, ikizinduliwa kwenye seva yenyewe, itatekeleza amri zilizotumwa kwake na kurudisha matokeo. Baada ya kusoma
Nilitekeleza mradi huu kwenye Ubuntu 16.04, lakini kwa kukimbia bila shida kwenye usambazaji mwingine, nilijaribu kufanya kila kitu kwa njia ya jumla.
Usajili wa kijibu
Sajili roboti mpya na @BotFather. Tunamtuma /newbot
na zaidi katika maandishi. Tutahitaji tokeni mpya ya bot na kitambulisho chako (unaweza kuipata, kwa mfano, kutoka
Maandalizi ya chatu
Ili kuendesha bot, tutatumia maktaba telebot
(pip install pytelegrambotapi
) Kwa kutumia maktaba subprocess
tutafanya amri kwenye seva.
Uzinduzi wa bot
Unda faili ya bot.py kwenye seva:
nano bot.py
Na ubandike msimbo ndani yake:
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)#Π² ΡΠ»ΡΡΠ°Π΅ ΠΏΠ°Π΄Π΅Π½ΠΈΡ
Tunabadilisha tokeni ya roboti ndani yake na ile iliyotolewa na @BotFather, na user_id na thamani ya kitambulisho cha akaunti yako. Kuangalia kitambulisho cha mtumiaji inahitajika ili bot kutoa ufikiaji wa seva yako kwako tu. Kazi check_output()
hutekeleza amri uliyopewa na kurudisha matokeo.
Inabakia tu kuanza bot. Kwa kuendesha michakato kwenye seva, napendelea kutumia screen
(sudo apt-get install screen
):
screen -dmS ServerBot python3 bot.py
(ambapo "ServerBot" ndio kitambulisho cha mchakato)
Mchakato utaendesha kiotomatiki nyuma. Wacha tuende kwenye mazungumzo na roboti na angalia ikiwa kila kitu kinafanya kazi kama inavyopaswa:
Hongera! Kijibu hutekeleza amri zilizotumwa kwake. Sasa, ili kufikia seva, unahitaji tu kufungua mazungumzo na bot.
Amri kurudia
Mara nyingi, kufuatilia hali ya seva, unapaswa kutekeleza amri sawa. Kwa hiyo, utekelezaji wa kurudia amri bila kuwatuma tena utakuwa nje ya mahali.
Tutaitekeleza kwa kutumia vifungo vya ndani chini ya ujumbe:
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)#Π² ΡΠ»ΡΡΠ°Π΅ ΠΏΠ°Π΄Π΅Π½ΠΈΡ
Kuanzisha upya bot:
killall python3
screen -dmS ServerBot python3 bot.py
Wacha tuangalie tena ikiwa kila kitu kinafanya kazi kwa usahihi:
Kwa kushinikiza kifungo chini ya ujumbe, bot lazima kurudia amri ambayo ujumbe huu ulitumwa.
Badala ya hitimisho
Kwa kweli, njia hii haijifanya kuwa mbadala wa njia za uunganisho wa kawaida, hata hivyo, hukuruhusu kujua haraka hali ya seva na kutuma amri kwake ambazo haziitaji pato ngumu.
Chanzo: mapenzi.com