首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python中的子进程远程命令执行

python中的子进程远程命令执行
EN

Stack Overflow用户
提问于 2015-07-22 16:45:49
回答 2查看 1.8K关注 0票数 1

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

代码语言:javascript
复制
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)添加到已知主机列表中。”然后什么都没发生。问题出在哪里?

EN

回答 2

Stack Overflow用户

发布于 2015-07-22 17:19:25

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

您应该:

ssh

  • 关闭主机验证:将'y‘添加到ssh输入,或

  • 手动将此主机添加到已知主机,或

  • 更改执行远程调用的方法。
票数 2
EN

Stack Overflow用户

发布于 2015-07-22 17:29:37

因为您没有为subprocess.Popen指定任何stderr,所以标准错误将直接打印到您的显示器上。这就是为什么在明确将stderr重定向到subprocess.PIPE (或/dev/ Warning: Permanently added '<hostname>' (ECDSA) to the list of known hosts. )之前,您始终会收到空消息。

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

代码语言:javascript
复制
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.

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31558225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档