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
ja rybki dawac nie bede
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
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
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.