2016-02-03 23 views
5

W moim poniższym programie, wyjście jest przekierowywane do pliku test1.txt, ale gdy otwieram plik, mam trzy problemy tutaj:Standardowe wyjście przekierowane do pliku pokazuje różni się od faktycznej

  1. widzę poleceń podobnie jak ls, pwd są poniżej znaku zachęty (sw0: FID128: root>).
  2. monit powinien wyświetlać "sw0: FID128: root>", ale pokazuje "sw0: FID128: root"
  3. jeśli rzeczywiste wyjście ma 2 zakładki, plik pokazuje tylko jedną kartę.

Zasadniczo chcę, aby porównać z innym plikiem, więc nie powiedzie się, jeśli liczba kart są różne.

telconn=pexpect.spawn('telnet 10.24.12.109') 
telconn.logfile = sys.stdout 
telconn.expect(":") 
telconn.send("user" + "\r") 
telconn.expect(":") 
telconn.send("pass" + "\r\r\r\r\n\n\n") 
telconn.expect("key to proceed.") 
telconn.send ("\003") 
telconn.expect("root>") 
prev_std= sys.stdout 
sys.stdout=open("test1.txt","w") 

print "Telnet connection is done" 

telconn.sendline('\n'); 
telconn.expect (['>',pexpect.EOF]) 
ls = telconn.before 

telconn.sendline('ls -al'); 
telconn.expect (['>',pexpect.EOF]) 
ls = telconn.before 

telconn.sendline('pwd'); 
telconn.expect (['>',pexpect.EOF]) 
pwd = telconn.before 

telconn.sendline('noscli'); 
telconn.expect (['#',pexpect.EOF]) 
nos = telconn.before 

telconn.sendline('terminal length 0'); 
telconn.expect (['#',pexpect.EOF]) 
term = telconn.before 

telconn.sendline('\n\n'); 

telconn .sendline('exit'); 
telconn.close() 

print ls 
print pwd 
print nos 
print term 

#print "Ended session" 


sys.stdout.close() 
sys.stdout =prev_std 

fo = open("test1.txt", "r+") 
str = fo.read(); 
print "Read String is : ", str 
# Close opend file 
fo.close() 

Przykładowe wyjście wygląda tak

Telnet connection is done 
^M 
sw0:FID128:root 
ls -al^M 
total 32^M 
pwddrwx------ 3 root root 4096 Feb 2 11:07 ./^M 
^M 
drwxr-xr-x 28 root root 4096 Feb 3 05:58 ../^M 
-rw-r--r-- 1 root sys 507 Feb 1 06:47 .bash_logout^M 
-rw-r--r-- 1 root sys 27 Feb 1 06:47 .inputrc^M 
-rw-r--r-- 1 root sys 1220 Feb 1 06:47 .profile^M 
-rw-r--r-- 1 root sys 2551 Feb 1 06:47 .rhosts^M 
drwxr-xr-x 2 root sys 4096 Feb 1 09:51 .ssh/^M 
-rw-r--r-- 1 root sys 617 Feb 1 06:47 .toprc^M 
-rw-r--r-- 1 root root 0 Feb 3 06:01 mcast_trc^M 
-rw-r--r-- 1 root root 0 Feb 3 06:01 sysdiag_trc^M 
sw0:FID128:root 
pwd^M 
/root^M 

Odpowiedz

0

widzę poleceń takich jak ls, pwd są poniżej wiersza

Twój wyjściowy ma niejednolite znaki końca wiersza (^M jest CR). Oznacza to, że niektóre części twojego zespołu podają CR+LF, inne - po prostu LF. Trudno powiedzieć, który z nich jest właśnie z pojedynczego wyjścia. Oddziel je i przekonaj się sam.

spodziewać się monit, aby wyświetlić "SW0: FID128: root>" ale pokazuje "SW0: FID128: root"

Możliwe przyczyny:

  1. nie są wierne przechwytywanie wyników. Na przykład. coś zostanie wydrukowane również dla stderr.
    • użycie 2>&1 lub równoważne lub inaczej zobaczyć obu wyjść jakoś
  2. kiedy przekierowany wyjście rzeczywiście różni się od tego, co będzie widoczne na konsoli. Niektóre programy robią to, używając funkcji isatty(), aby je odróżnić. Uzasadnieniem jest zazwyczaj lepsze dopasowanie wyjścia do odczytu ludzkiego lub maszynowego. Wiele takich programów ma przełączniki, które wyraźnie określają wyjściowy smak.
    • można użyć coś podobnego | cat (dla przekierowania wyjścia) lub cat <command_file> | (dla przekierowania wejściowego) w celu sprawdzenia, czy jest to przypadek

Z telnet, może to być albo. > to wiersz polecenia. Zazwyczaj jest drukowany pod numerem stderr. Może być nadal tam drukowany lub w ogóle nie drukowany, gdy nastąpi przekierowanie.

jeśli rzeczywiste wyjście ma 2 zakładki, plik pokazuje tylko jedną kartę.

Prawdopodobnie taki sam jak 2).Może coś, przez co przechodzą dane wyjściowe, również powoduje konwersję kart.

+0

dla mojego pierwszego punktu, na przykład ls -al jest przekazywane z linii wysyłania i łączna wartość 7736 drwx ------ 3 root root 4096 Feb 5 05:19 ./ drwxr-xr-x 28 root 4096 5 lutego 05:30 ../ -rw-r - r-- 1 root sys 507 Feb 1 06:47 .bash_logout -rw-r - r-- 1 root sys 27 lutego 1 06:47 .inputrc -rw-r - r-- 1 root sys 1220 Feb 1 06:47 .profile -rw-r - r-- 1 root sys 2551 Feb 1 06:47 .rhosts drwxr-xr-x 2 root sys 4096 kwi 22 2015 .ssh/ -rw-r - r-- 1 root sys 617 Feb 1 06:47 .toprc – Suma

+0

@Suma Widzę to już. Samotny "LF" jest po znaku zachęty. Zbadaj szczegółowo, co dzieje się w tym momencie - skąd pochodzi ten "LF". –