python

时间:2015-07-22 08:45:49

标签: python

我正在尝试使用子进程执行远程命令:

import subprocess
x=subprocess.Popen(['ssh','15.24.13.14', ' ps -ef | grep -i upgrade | wc -l'],stdout=subprocess.PIPE)
y=x.stdout.read()
print y
print '\n'
z=int(y)
print z

我需要通过'升级'以他们的名义。但由于某种原因,脚本执行得不好。我收到消息: "警告:永久添加' 15.24.13.14' (RSA)到已知主机列表。" 然后什么都没发生。 问题在哪里?

2 个答案:

答案 0 :(得分:2)

问题是,如果您是第一次通过ssh连接到给定主机,它会要求您将此主机添加到已知主机列表中,用户必须通过按“' y”来确认这一点。 。既然你没有,那就不会挂起而什么也不做。

你应该:

  • 关闭主机验证:ssh -o "StrictHostKeyChecking no" user@host
  • 发送' y'到ssh输入,或
  • 手动将此主机添加到已知主机或
  • 更改执行远程调用的方法。

答案 1 :(得分:0)

由于您未向subprocess.Popen指定任何Warning: Permanently added '<hostname>' (ECDSA) to the list of known hosts.,标准错误将直接打印到您的显示器。这就是为什么在明确将stderr重定向到subprocess.PIPE(或/ dev / null)之前,您始终会收到from subprocess import Popen, PIPE p = Popen(['ssh', '-o', 'UserKnownHostsFile=/dev/null', '-o', 'StrictHostKeyChecking=no', hostname, 'ps aux | grep -i upgrade | wc -l'], stdout=PIPE, stderr=PIPE) result = int(p.communicate()[0][:-1]) # don't forget there's the \n at the end. 消息

另外,为了避免主机文件问题,这里有一个小技巧(小心它,它有点危险):

<form action="" method="get">

GET<br />
<input type="checkbox" name="formDoor1[]" value="A" />Acorn Building<br />
<input type="checkbox" name="formDoor1[]" value="B" />Brown Hall<br />
<input type="checkbox" name="formDoor1[]" value="C" />Carnegie Complex<br />
<input type="checkbox" name="formDoor1[]" value="D" />Drake Commons<br />
<input type="checkbox" name="formDoor1[]" value="E" />Elliot House

<input type="submit" name="formSubmit" value="Submit" />

</form>

为什么危险?因为在MITM attack的情况下,您没有任何远程知识库,因此您将攻击者视为远程目标。过度使用此功能时要小心。