skrypt lub aplikacja wykokonujący polecenie

Problemy związane ze switchingiem
Wiadomość
Autor
JakubS
member
member
Posty: 21
Rejestracja: 11 paź 2015, 21:42
Lokalizacja: 51.418083, 21.169213

skrypt lub aplikacja wykokonujący polecenie

#1

#1 Post autor: JakubS »

Dzień dobry.
Czy ma ktoś pomysł na wykonanie polecenia:
conf t
interface fa 0/1
shut
end
exit

Założenie jest takie że połączenie z przełącznikiem musi zostać nawiązane przez ssh z hosta z systemem Windows.
Użytkownik uruchomi skrypt lub aplikację która wyłączy lub włączy interfejs przełącznika.
Parę lat wstecz bawiłem się czymś takim przy wyłączaniu kiosku multimedialnego. Korzystałem z aplikacji Kitty, tam były na sztywno wpisane dane do autoryzacji i polecenie bodajże poweroff. Wtedy nie było problemu bo aplikacja wysyłała pojedynczą komendę i po sprawie, teraz sytuacja zmusza mnie do wysłania kilku linijek więcej. Chciał bym to w jakiś sposób zautomatyzować.

Pozdrawiam
Jakub

excubitor
wannabe
wannabe
Posty: 72
Rejestracja: 16 cze 2014, 13:18
Lokalizacja: Lublin

#2

#2 Post autor: excubitor »

Paramiko SSH i skrypt w Pythonie.
Nie jestem w stanie znaleźć w tej chwili tutoriala, w którym był na to gotowiec, ale gdzieś na Pynet powinno być.

e: trochę inne rozwiązanie: http://www.electricmonk.nl/log/2014/07/ ... nd-expect/
https://www.linickx.com/automating-cisc ... -c-r-a-ssh
https://pynet.twb-tech.com/blog/python/ ... part1.html

JakubS
member
member
Posty: 21
Rejestracja: 11 paź 2015, 21:42
Lokalizacja: 51.418083, 21.169213

#3

#3 Post autor: JakubS »

Dzięki za informację. Przyjrzę się temu i być może coś wymyślę. Nie miałem wcześniej styczności z Pythonem.

JakubS
member
member
Posty: 21
Rejestracja: 11 paź 2015, 21:42
Lokalizacja: 51.418083, 21.169213

#4

#4 Post autor: JakubS »

excubitor chyba nie pójdzie mi gładko :|
Serdeczne dzięki za przybycie z pomocą.
Pomyślałem że rozwiąże to gotową wklejką shut/no shut którą wrzuci osoba zainteresowana.
Stworzę do tego celu lokalnego użytkownika i przytnę wyższe uprawnienia.

freel4ncer
wannabe
wannabe
Posty: 581
Rejestracja: 27 wrz 2007, 01:13

#5

#5 Post autor: freel4ncer »

Kod: Zaznacz cały

#!/usr/bin/env python 

import paramiko
import time

host = '1.1.1.1'
user = 'admin'
pass = 'password'
interface = 'fa0/1'

connect = paramiko.SSHClient()
connect.set_missing_host_key_policy(paramiko.AutoAddPolicy())
connect.connect(host, username=user, password=pass, look_for_keys=False, allow_agent=False)


shell = connect.invoke_shell()

shell.send('\n')
time.sleep(2)
shell.send('conf t\n')
time.sleep(2)
shell.send('int %s\n') % interface
time.sleep(2)
shell.send('shut\n') 
time.sleep(2)
shell.send('end\n') 
connect.close()


Taki tam dirty script napisany w 2 minuty nieprzetestowany ale powinien dzialac ;) (ale do produkcji to zamalo ) pobaw sie i dodaj np przekazywanie hosta, interface , usera i passworda jako atrybut w command line , jakis logging i error handling etc

jesli masz lenia to musisz znalezc kogos kto ci to napisze :P ja rybki dawac nie bede :P tylko wedke na start ;)

horac
wannabe
wannabe
Posty: 72
Rejestracja: 18 kwie 2016, 21:04
Lokalizacja: CCIE

#6

#6 Post autor: horac »

brakuje sprawdzenia w petli czy otrzymales odpowiedni prompt. Dopiero jak masz pewnosc ze zczytasz calosc promptu do buforu wydajesz komende. Sprawdzasz znowu prompt na exec mode, komenda i sprawdzasz na config prompt.

Z racji tego ze prompy sa rozne w CLI, to wypadaloby napisac funkcje i jako parametr podac jej prompt i wywolac przed kazdym wprowadzeniem komend.

Kod: Zaznacz cały

def do_enable(self):
		output = ''
		self.remote_conn.send('enable\n')
		output = self.wait_for_password()
		if not "ERROR" in output:
			if opt.enable:
				self.remote_conn.send(opt.enable+'\n')
				output = self.wait_for_enable()
				if not "ERROR" in output:
					print "[+] Enable password correct"
					temp = output.splitlines()
					self.prompt = temp[-1]
					print self.prompt
					if '#' in self.prompt:
						#print "True returned"
						return True
				else:
					print "[-] Enable failed"
					return False
		if '#' in self.prompt:
				return True
						
	'''Core method used to check prompts each time when command is sent
	   Includes while loop that recievs packets and check prompt '''

	def wait_for_output(self,new_prompt):
		complete = False
		temp = ''
		packet = ''
		while not complete:
			packet += self.remote_conn.recv(65535)
			#print "IN WAIT FOR OUTPUT PROMPT: ",self.prompt
			'''!!!! print packet important for debbuging problems !!!'''
			#print packet				
			if new_prompt in packet:
				self.prompt = new_prompt
				#print "NEW_PROMPT:",self.prompt
				complete = True
			if self.prompt in packet:
				#print "Error"
				#print "SELF PROMPT:",self.prompt
				complete = True
		#print packet
		return packet

	'''Method used to check if "Password" appears after enable command'''

	def wait_for_password(self):
		complete = False
		temp = ''
		packet = ''
		#print "wait_for_password"
		while not complete:
			packet += self.remote_conn.recv(65535)
			#print "PACKET: ",packet
			if "Password" in packet:
				complete = True
			if "%" in packet:
				complete = True
				return "ERROR"
			if "#" in packet:
				complete =True
		#print packet
		return packet

	'''Method checks prompt for enable password'''
	
	def wait_for_enable(self):
		complete = False
		temp = ''
		packet = ''
		#print "wait_for_password"
		while not complete:
			packet += self.remote_conn.recv(65535)
			#print "PACKET: ",packet
			if "#" in packet:
				complete = True
			if ">" in packet:
				complete = True
				return "ERROR"
		return packet
Dalej pinokio idzie sam

mzb
wannabe
wannabe
Posty: 163
Rejestracja: 16 cze 2009, 14:14

#7

#7 Post autor: mzb »

excubitor pisze:Paramiko SSH i skrypt w Pythonie.
Osobiście uważam paramiko za jeden z najbardziej przereklamowanych modułów pythonowych - jak już się zejdzie do optymalizacji (tutaj kolega już zaproponował serię sleepów po 2 sekundy, ot taka natura paramiko, że lubi sleep'y) i rozpozna naturę send/recv i operowania na paramikowych buforach, to nie wygląda to tak dobrze.

-- M.

freel4ncer
wannabe
wannabe
Posty: 581
Rejestracja: 27 wrz 2007, 01:13

Re:

#8

#8 Post autor: freel4ncer »

horac pisze:brakuje sprawdzenia w petli czy otrzymales odpowiedni prompt.
W tym co napisalem brakuje duzooo rzeczy ale nie chcialem zniechecac autora wiec napisalem najprostszy mozliwy kod w ktorym widac co sie dzieje i pokazac ze juz dzieki paru linijkom mozna cos zdizalac (taka zacheta do nauki )

freel4ncer
wannabe
wannabe
Posty: 581
Rejestracja: 27 wrz 2007, 01:13

Re:

#9

#9 Post autor: freel4ncer »

mzb pisze:
excubitor pisze:Paramiko SSH i skrypt w Pythonie.
Osobiście uważam paramiko za jeden z najbardziej przereklamowanych modułów pythonowych - jak już się zejdzie do optymalizacji (tutaj kolega już zaproponował serię sleepów po 2 sekundy, ot taka natura paramiko, że lubi sleep'y) i rozpozna naturę send/recv i operowania na paramikowych buforach, to nie wygląda to tak dobrze.

-- M.
Generalnie nie uzywam Paramiko bezposrednio , pisze w 100% pod junipera i uzywam jego bibliotek ale i tak mam swiadomosc ze paramiko jest w nich wykorzystywane. Kiedys bawilem sie pexpectem ale paramiko jest duzo lepsze.
Na bank sa jakies gotowe biblioteki wspomagajace takie taski jak configuracje itp (vide pyez od junipera) ale to i tak wszystko ma Paramiko za dependency jednym slowem bez Paramiko ani rusz :D

mierztom
member
member
Posty: 19
Rejestracja: 20 lis 2008, 11:25
Lokalizacja: Heidelberg

Re: skrypt lub aplikacja wykokonujący polecenie

#10

#10 Post autor: mierztom »

zamiast Pythona, probowałeś napisać zwykły skrypt batchowy w oparciu o "plink" z pakietu Putty?

JakubS
member
member
Posty: 21
Rejestracja: 11 paź 2015, 21:42
Lokalizacja: 51.418083, 21.169213

Re: skrypt lub aplikacja wykokonujący polecenie

#11

#11 Post autor: JakubS »

Celna rada. Dzięki.
Skrypt batchowy był by dobry. Popatrze o co chodzi z "plink".

freel4ncer
wannabe
wannabe
Posty: 581
Rejestracja: 27 wrz 2007, 01:13

Re: skrypt lub aplikacja wykokonujący polecenie

#12

#12 Post autor: freel4ncer »

mierztom pisze:zamiast Pythona, probowałeś napisać zwykły skrypt batchowy w oparciu o "plink" z pakietu Putty?
Ehh NIeee ;) :roll: To jest slaby pomysl

Awatar użytkownika
zet69
wannabe
wannabe
Posty: 138
Rejestracja: 20 cze 2007, 08:53

Re: skrypt lub aplikacja wykokonujący polecenie

#13

#13 Post autor: zet69 »

To ja dorzuce od siebie jeszcze dwie mozliwosci, mtputty - tutaj na szybko mozesz zdefiniowac komendy ktore chcesz wykonac (tools->send script). Albo mozesz uzyc linuxowego expecta, ponizej masz przyklad:

Kod: Zaznacz cały

#!/usr/bin/expect

set user user
set workingdir .
set pass haslo
set LOG [open "$workingdir/RESULT" a]
set RTR [open "$workingdir/RTR_LIST" r]
set PROMPT "#|]"
set timeout 60000
match_max -d 2000000

while {[gets $RTR router] != -1} {
   if {[ string range $router 0 0 ] != "#"} {
set timeout 30
#set LOG [open "$workingdir/RESULT" a]
spawn ssh $user@$router
expect "password:"
send "$pass\r"
expect -re $PROMPT

send "sh ver | inc System image \r"
expect -re $PROMPT
puts $LOG "$expect_out(buffer)"
send "sh ver | inc uptime \r"
expect -re $PROMPT
puts $LOG "$expect_out(buffer)"
send "quit \r"
    }
}
close $RTR; close $LOG

JakubS
member
member
Posty: 21
Rejestracja: 11 paź 2015, 21:42
Lokalizacja: 51.418083, 21.169213

Re: skrypt lub aplikacja wykokonujący polecenie

#14

#14 Post autor: JakubS »

A jak ma wyglądać skrypt w mtputty? Zaczyna mi się plątać ;)

JakubS
member
member
Posty: 21
Rejestracja: 11 paź 2015, 21:42
Lokalizacja: 51.418083, 21.169213

Re: skrypt lub aplikacja wykokonujący polecenie

#15

#15 Post autor: JakubS »

Dobra. Wszystko gra jak potrzeba. Dziękuje za pomoc.
Powyższego pytania nie było :)
Problem rozwiązany. Zwycięzcą zostaje mtputty.

ODPOWIEDZ