【问题标题】:subprocess stdout and stderr while doing ssh在执行 ssh 时子进程 stdout 和 stderr
【发布时间】:2014-07-04 12:14:06
【问题描述】:

我想知道远程服务器的磁盘使用情况,我想用 ssh 来做 这是我到目前为止所做的:-

def disk_usage(server):
    msg=""
    ps = subprocess.Popen(["ssh", "-o", "BatchMode=yes", "-l", "mygroup", server, "df -k /some/directory"], stdout=subprocess.PIPE)
    out, err = ps.communicate()
    if err != None:
        msg += "\n"+err
    else:
        msg = out
    return msg

Final_msg = ""
server_list= ['server A','server B','server C']

for server in server_list:
   Final_msg+="For Server :"+server+"\n"+disk_usage(server)
print Final_msg

脚本运行良好,但问题是当任何服务器的 ssh 未配置时,它只会显示该服务器的空白输出

输出:-

For Server A :
Filesystem           1K-blocks      Used     Available     Use%   Mounted on
/dev/cfd/ace      8064048         3581524   4072892         47%     /app
For Server B :

For server C :
Filesystem           1K-blocks      Used     Available      Use%   Mounted on
/dev/wsa/ace      306423            244524   23243434       90%     /app

这里没有配置服务器 B 的 ssh,所以我得到一个空白输出,因为所有 ssh 连接的批处理模式都打开 (BatchMode=yes),但我希望用户知道为什么没有输出。

当我在未配置 ssh 的服务器的 shell 上运行相同的命令时,我收到以下错误:

 Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).

我希望在未配置 ssh 的特定服务器的脚本输出中出现相同的错误。

有什么想法吗?

【问题讨论】:

    标签: python subprocess stdout stderr


    【解决方案1】:

    要检测发生了错误,您应该检查 Popen 对象 (ps) 的 returncode 属性。

    要从stderr 获取输出,您必须将stderr=subprocess.PIPE 传递给Popen,就像您为stdout 所做的那样。

    【讨论】:

      【解决方案2】:

      如果您的本地机器有静态 IP,我建议您使用套接字,这样您的数据使用脚本将连接到您的本地机器并传送数据。 或者如果您有域可以通过 urllib 将您的服务器信息发布到您的网络应用程序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-16
        • 2023-04-06
        • 1970-01-01
        • 1970-01-01
        • 2011-07-07
        • 2020-06-23
        • 1970-01-01
        • 2018-07-31
        相关资源
        最近更新 更多