2013-04-01 3 views
0

나는 파이썬 프로그램 (아래)이 있고 내가 그것을 실행할 때 다음과 같은 오류 얻을 :stderr에서 오류가 발생했습니다. 어떻게 해결합니까?

% python SSH_Prog.py 
About to connect... 
stderr: ["bash: -c: line 0: unexpected EOF while looking for matching `''\n", 'bash: -c: line 1: syntax error: unexpected end of file\n'] 
pwd: [] 
stderr: ['watch: no process found\n'] 
pwd: [] 
^CTraceback (most recent call last): 
    File "SSH_Prog.py", line 32, in <module> 
    time.sleep(3) 
KeyboardInterrupt 

나는 아마 이스케이프 시퀀스와 함께 할 생각하고, 표준 입력에서 "\ n"문자 만을 나는 그것을 다루는 경험이 부족하다.

import os 
import sys 
import time 
import paramiko 
#from ssh import SSHClient 

# Define remote machine 
host="<ip>" 
user="<usrnm>" 
passw="<passw>" 
client = paramiko.SSHClient() 
#client.load_system_host_keys() 
client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
# Try SSH connection, catch exception 
#if not 
print('About to connect...') 

client.connect(host, username=user, password=passw) 
# ForLoop to iterate through the interactions 
for x in range(10): 
    xx = str(x) 
    # Commands to execute on local machine 
    f = os.popen3('tshark -i eth0 -f snmp -F pcapng -w ~/Desktop/traf_logs/n'+(xx)) 
    # commands to execute on remote machine 
    stdin, stdout, stderr = client.exec_command("watch -n 0.1 'ps -p $(pgrep -d"," -x snmpd) -o rss= | awk '\''{ i += $1 } END { print i }'\'' >> ~/Desktop/mem_logs/mem_"+(xx)+";")   
    print "stderr: ", stderr.readlines() 
    print "pwd: ", stdout.readlines() 

    g = os.popen3('snmpget -v 2c -c communitystring <ip> sysContact.0')  
    time.sleep(3) 

    stdin, stdout, stderr = client.exec_command('killall watch;')   
    print "stderr: ", stderr.readlines() 
    print "pwd: ", stdout.readlines() 

    ff = os.popen3('killall tshark')   
# terminate connection 
client.close() 
exit(0) 

당신이 그것을 해결하기 위해 어떤 생각을 가지고 있습니까 : 여기

프로그램입니까?

감사합니다.

+2

'os.popen'과 패밀리를 사용하는 대신'subprocess.Popen'을 체크 아웃하십시오. 요즘 사용하는 것이 좋습니다 - 그건 단지 일반적인 논평 일뿐입니다. 문제의 해결책 일 필요는 없습니다 – mgilson

+0

이것은'exec_command '내의'watch'가 올바른 프로세스를 찾을 수없는 이유와 관련이 있습니다. 부분적으로 실행하고 결과물이 있어야하는지 확인하십시오. –

+0

실제로 무엇을 하려는지 설명하고,'ssh' 연결의 다른 끝에 도착하는 명령 줄이 어떤 모습인지 예상 할 수 있습니까? – abarnert

답변

1

exec_command은 다음과 같이 첫 번째 보이는 당신의 :

"watch -n 0.1 'ps -p $(pgrep -d" 

그리고 당신의 두 번째 인수는 다음과 같습니다 : 즉

stdin, stdout, stderr = client.exec_command("watch -n 0.1 'ps -p $(pgrep -d"," -x snmpd) -o rss= | awk '\''{ i += $1 } END { print i }'\'' >> ~/Desktop/mem_logs/mem_"+(xx)+";")   

, 첫 번째 인수는

" -x snmpd) -o rss= | awk '\''{ i += $1 } END { print i }'\'' >> ~/Desktop/mem_logs/mem_"+(xx)+";" 

것은 당신이 불 경우 터미널에 bash을 입력하고 첫 번째 인수 (따옴표 제외)를 입력 한 다음 ne w^a^D라고하면 다음과 같이 알려줍니다.

> -bash: unexpected EOF while looking for matching `'' 
-bash: syntax error: unexpected end of file 

정확하게 Paramiko에서 돌아 오는 것입니다.

그리고 두 번째 오류는 watch이라는 프로세스가 없다는 것을 알려주는 killall입니다. 첫 번째 명령은 아무 것도 시작하지 않았기 때문입니다.

방금 ​​","을 공백으로 바꾼다면 문제가 해결 될 것입니다. 그러나 ","을 원한다고 생각하는 이유를 알지 못하면 실제로 의도 한대로 할 수 있을지 확신 할 수 없습니다.

나는 또한 '\''이 무엇을 해야할지 잘 모르겠습니다. 왜 awk에 대한 인수를 삼중 인용하고 싶습니까? 또는 단지 { print $1 }과 동등해야 할 때 매우 복잡한 작업을 수행하는 이유, 또는 복수 열에 대해 ps에 명시 적으로 묻는 이유는 awk을 사용해야합니다. 첫 번째 것 또는 ...

+0

그 대답은 그것을하는 두 가지 더 좋은 방법을 제안했으며, 이것을 "단 하나 따옴표로 고집하는 것을 선호한다면"제안하고, 끝에 단 한 개만 쓸 필요는 없다고 설명했습니다. 그러나 괜찮습니다. 나머지 질문은 어떻습니까? 그 awk 프로그램이'{print $ 1} '과 다른 뭔가를해야합니까? 그렇다면, 무엇? 더 중요한 것은, 어떤 이유로 명령의 중간에'',''를 추가 했습니까? 그렇다면 어떤 이유가 있습니까? – abarnert

+0

알겠습니다. 나는 다른 곳에서 본보기를 취한 것처럼 시계 명령에서'',''>를 사용했다. 나는 코더가 아니다.어쨌든 그것을 제거하고 그것은 더 나은없이 작동합니다. ''\ ''는 다른 사용자가 내가 여기에있는 문제에 대해 제안했습니다 : http://stackoverflow.com/questions/15713344/what-is-wrong-with-this-command –

+0

" 왜 awk에 대한 인수를 삼중 따옴표로 묶고 싶습니까? 전체 명령에서'watch -n 0.1 'ps -p $ (pgrep -d -x snmpd) -o rss = | awk "{i + = $ 1} END {print i}" ''* awk *는 따옴표 ""를 사용하여 실행되지 않습니다. 그것은 싱글 ''에서만 작동합니다. 시도 해봐. "... {print $ 1}과 동등해야합니다."정말로, 어떻게? "... 또는 왜 awk를 사용하여 첫 번째 열을 선택할 지 명시 적으로 ps에 요청하는 중입니다 ..." RSS 값만 필요하기 때문에. –

관련 문제