0

Python プログラム (以下) があり、実行すると次のエラーが発生します。

% 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)

それを修正する考えはありますか?

よろしく。

4

1 に答える 1

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"

そして、あなたの2番目の引数は次のとおりです。

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

ターミナルで起動bashし、その最初の引数を (引用符なしで) 入力し、その後に改行と ^D を入力すると、次のように表示されます。

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

これは、まさに Paramiko から返されたものです。

2 番目のエラーは、最初のコマンドでプロセスが開始されなかったため、killallという名前のプロセスが存在しないことを示しています。watch

をスペースに置き換えるだけ","で問題は解決しますが、なぜそこが必要だと思ったのかが","わからないと、実際に意図したとおりに機能するかどうかわかりません。

また、何をすべきかわかり'\''ません。なぜ への引数を三重引用符で囲みたいのですか、なぜawk単に と同等でなければならないのになぜそんなに複雑なことをしているのですか、なぜ最初の列を選択するために使用するためだけに複数の列を{ print $1 }明示的に要求しているのですか?または…</p> psawk

于 2013-04-01T18:25:45.340 に答える