Mynediad i weinydd linux gan ddefnyddio Telegram bot yn Python

Yn aml iawn mae sefyllfaoedd pan fo angen mynediad i'r gweinydd yn y fan a'r lle. Fodd bynnag, nid cysylltu trwy SSH yw'r ffordd fwyaf cyfleus bob amser, oherwydd efallai nad oes gennych gleient SSH, cyfeiriad gweinydd, na chyfuniad defnyddiwr / cyfrinair wrth law. Wrth gwrs wedi Webmin, sy'n symleiddio gweinyddiaeth, ond nid yw hefyd yn darparu mynediad ar unwaith.

Felly penderfynais roi ateb syml ond diddorol ar waith. Sef, ysgrifennu bot Telegram a fydd, pan gaiff ei lansio ar y gweinydd ei hun, yn gweithredu'r gorchmynion a anfonwyd ato ac yn dychwelyd y canlyniad. Wedi astudio rhai erthyglau ar y pwnc hwn, sylweddolais nad oes neb eto wedi disgrifio gweithrediadau o'r fath.

Gweithredais y prosiect hwn ar Ubuntu 16.04, ond ar gyfer rhediad di-drafferth ar ddosbarthiadau eraill, ceisiais wneud popeth mewn ffordd gyffredinol.

Cofrestru bot

Cofrestrwch bot newydd gyda @BotFather. Anfonwn ef /newbot ac yn mhellach yn y testyn. Bydd angen tocyn bot newydd arnom a'ch ID (gallwch ei gael, er enghraifft, oddi wrth @userinfobot).

Paratoi Python

I redeg y bot, byddwn yn defnyddio'r llyfrgell telebot (pip install pytelegrambotapi). Defnyddio'r llyfrgell subprocess byddwn yn gweithredu gorchmynion ar y gweinydd.

Lansio bot

Creu ffeil bot.py ar y gweinydd:
nano bot.py

A gludwch y cod i mewn iddo:

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)#Π² случаС падСния

Rydym yn disodli'r tocyn bot ynddo gyda'r un a gyhoeddwyd gan @BotFather, a user_id gyda gwerth id eich cyfrif. Mae angen gwirio'r ID defnyddiwr fel bod y bot yn darparu mynediad i'ch gweinydd i chi yn unig. Swyddogaeth check_output() yn gweithredu'r gorchymyn a roddwyd ac yn dychwelyd y canlyniad.

Erys dim ond i gychwyn y bot. Ar gyfer rhedeg prosesau ar y gweinydd, mae'n well gen i ddefnyddio screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(lle mae "ServerBot" yn ID y broses)

Bydd y broses yn rhedeg yn awtomatig yn y cefndir. Gadewch i ni fynd i'r ddeialog gyda'r bot a gwirio bod popeth yn gweithio fel y dylai:

Mynediad i weinydd linux gan ddefnyddio Telegram bot yn Python

Llongyfarchiadau! Mae'r bot yn gweithredu'r gorchmynion a anfonwyd ato. Nawr, er mwyn cyrchu'r gweinydd, does ond angen i chi agor deialog gyda'r bot.

Ailadrodd gorchymyn

Yn aml, i fonitro cyflwr y gweinydd, mae'n rhaid i chi weithredu'r un gorchmynion. Felly, bydd gweithredu ail-wneud gorchmynion heb eu hail-anfon yn gwbl allan o le.

Byddwn yn ei weithredu gan ddefnyddio botymau mewnol o dan y negeseuon:

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)#Π² случаС падСния

Wrthi'n ailgychwyn y bot:

killall python3
screen -dmS ServerBot python3 bot.py

Gadewch i ni wirio eto bod popeth yn gweithio'n iawn:

Mynediad i weinydd linux gan ddefnyddio Telegram bot yn Python

Trwy wasgu'r botwm o dan y neges, rhaid i'r bot ailadrodd y gorchymyn yr anfonwyd y neges hon ohono.

Yn hytrach na i gasgliad

Wrth gwrs, nid yw'r dull hwn yn esgus bod yn lle'r dulliau cysylltu clasurol, fodd bynnag, mae'n caniatΓ‘u ichi ddarganfod yn gyflym am gyflwr y gweinydd ac anfon gorchmynion ato nad oes angen allbwn cymhleth arnynt.

Ffynhonnell: hab.com

Ychwanegu sylw