2013-04-01 1 views
0

У меня есть программа на Python (ниже), и когда я запускаю его я получаю следующее сообщение об ошибке:Ошибка от 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 

Я думаю, что это связано с последовательностью побега, вероятно, и «\ п» символ из стандартного ввода, но Мне не хватает опыта, чтобы справиться с этим.

Вот программа:

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

Это связано с тем, почему 'watch' внутри' exec_command' не может найти нужный процесс. Сначала запустите его в частях и проверьте, является ли результат тем, чем он должен быть. –

+0

Можете ли вы объяснить, что вы на самом деле пытаетесь сделать, дать пример того, что вы ожидаете от командной строки, которая появляется на другом конце соединения 'ssh', чтобы выглядеть и т. Д.? – abarnert

ответ

1

Ваш первый exec_command выглядит следующим образом:

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)+";")   

Другими словами, первый аргумент:

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

И ваш второй аргумент:

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

Если огонь up bash в терминале и введите этот первый аргумент (без кавычек), за которым следует ne wline и a^D, он скажет вам следующее:

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

Это именно то, что вы возвращаете из Парамико.

И вторая ошибка - это только killall, сообщающая вам, что нет процесса с именем watch, потому что ваша первая команда никогда не запускала его.

Если вы просто замените "," пробелом, это решит эту проблему ... но не зная, почему вы считали, что хотите получить ",", я не уверен, что он сделает то, что вы на самом деле собираетесь делать.

Я также не уверен, что должен делать '\''. Почему вы хотите triple-quote аргументы awk или почему вы делаете что-то настолько сложное, когда оно должно быть эквивалентно только { print $1 } или почему вы явно запрашиваете ps для нескольких столбцов, чтобы использовать только awk, чтобы выбрать первый, или ...

+0

Этот ответ предложил два лучших способа сделать это, и предложил это только «если вы предпочитаете придерживаться одинарных кавычек» и объяснил, что вам не нужны они для одного в конце ... но ОК. Как насчет остальных моих вопросов? Предполагается, что программа 'awk' должна делать что-то отличное от просто' {print $ 1} '? Если да, то? Что еще более важно, вы почему-то добавили '', ''в середину своей команды? Если да, то какая причина? – abarnert

+0

Я вижу. Я использовал команду '', ''> в команде watch, поскольку я привел пример из другого места. Я не кодер.Я все равно удалил его, и он работает лучше. Пользователь '' \ '' предложил другому пользователю проблему, которую я имел здесь: http://stackoverflow.com/questions/15713344/what-is-wrong-with-this-command –

+0

«Я также не уверен, что «\» должен делать. Почему вы хотите triple-quote аргументы awk? Потому что в полной команде, то есть: 'watch -n 0.1 'ps -p $ (pgrep -d -x snmpd) -o rss = | awk "{i + = $ 1} END {print i}" ''* awk * не будет запускаться с использованием кавычек" ". Он будет работать только с одним ". Попробуй. «... это должно быть эквивалентно просто {print $ 1},« Действительно, как? «... или почему вы явно просите ps для нескольких столбцов просто использовать awk для выбора первого ...» Потому что мне нужно только значение RSS. –