我尝试使用paramiko列出计算机上使用的所有TCP端口。我发现了一个很好的bash命令here:
netstat -ant | sed -e '/^tcp/ !d' -e 's/^[^ ]* *[^ ]* *[^ ]* *.*[\.:]\([0-9]*\) .*$/\1/' | sort -g | uniq
当我直接在putty中输入它时,此命令可以正常工作。但是,当与paramiko一起使用时,不会显示输出。
以下是示例代码:
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, username='demo', password='password')
command = "netstat -ant | sed -e '/^tcp/ !d' -e 's/^[^ ]* *[^ ]* *[^ ]* *.*[\.:]\([0-9]*\) .*$/\1/' | sort -g | uniq"
stdin, stdout, stderr = ssh.exec_command(command)
print stdout.read()
如果我更改命令如下,stdout会显示结果,但这不是我想要的。所以我猜这可能是paramiko的正则表达式问题。有什么想法吗?
command = "netstat -ant | sed -e '/^tcp/ !d'"
答案 0 :(得分:1)
'\1'
与'\x01'
相同。你应该逃避\1
。
>>> '\1'
'\x01'
>>> print '\1'
>>> '\\1'
'\\1'
>>> print '\\1'
\1
>>> r'\1'
'\\1'
>>> print r'\1'
\1
使用原始字符串(r'...'
)解决您的问题:
command = r"netstat -ant | sed -e '/^tcp/ !d' -e 's/^[^ ]* *[^ ]* *[^ ]* *.*[\.:]\([0-9]*\) .*$/\1/' | sort -g | uniq"