Strona 1 z 1

skrypt lub aplikacja wykokonujący polecenie

: 13 maja 2016, 15:16
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

: 13 maja 2016, 15:48
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

: 13 maja 2016, 22:05
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.

: 17 maja 2016, 09:45
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.

: 17 maja 2016, 18:24
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 ;)

: 17 maja 2016, 19:27
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

: 17 maja 2016, 20:23
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.

Re:

: 18 maja 2016, 06:10
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 )

Re:

: 18 maja 2016, 06:18
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

Re: skrypt lub aplikacja wykokonujący polecenie

: 18 maja 2016, 08:44
autor: mierztom
zamiast Pythona, probowałeś napisać zwykły skrypt batchowy w oparciu o "plink" z pakietu Putty?

Re: skrypt lub aplikacja wykokonujący polecenie

: 19 maja 2016, 08:30
autor: JakubS
Celna rada. Dzięki.
Skrypt batchowy był by dobry. Popatrze o co chodzi z "plink".

Re: skrypt lub aplikacja wykokonujący polecenie

: 19 maja 2016, 08:55
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

Re: skrypt lub aplikacja wykokonujący polecenie

: 19 maja 2016, 14:27
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

Re: skrypt lub aplikacja wykokonujący polecenie

: 19 maja 2016, 14:36
autor: JakubS
A jak ma wyglądać skrypt w mtputty? Zaczyna mi się plątać ;)

Re: skrypt lub aplikacja wykokonujący polecenie

: 19 maja 2016, 15:16
autor: JakubS
Dobra. Wszystko gra jak potrzeba. Dziękuje za pomoc.
Powyższego pytania nie było :)
Problem rozwiązany. Zwycięzcą zostaje mtputty.