返回通过嵌入在 python 选项 1:选项 2:

问题描述

我有一个下面的 python 脚本,其中我正在使用 expect 执行远程 SSH 命令。在这里,即使目标文件是否包含字符串“error”,退出代码总是作为成功返回,因为 ssh 连接只是检查。如何获取 grep 命令的状态?

#! /usr/bin/python

import subprocess

def execute(cmd):
    proc = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
    _output,_error = proc.communicate()
    _code = proc.returncode
    return _output,_error,_code

host = "localhost"
passwd = "kube"

cmd="/usr/bin/expect -c 'spawn ssh "+host+" \"cat /home/kube/f1 | grep -qi error\"; expect \"password:\" { send \""+passwd+"\r\"} ;interact' "
_output,return_code = execute(cmd)
print cmd + "\n" + _output + "\n" + _error

if (return_code == 0):
    print "no error"
else:
    print "contains error"

解决方法

选项 1:

让远程命令输出一些指示您成功/失败的内容。例如:

ssh user@host "/some/command | grep -q some-string && echo MAGIC-SUCCESS || echo MAGIC-FAILURE"

在 Python 中,您可以获取输出并对其进行解析。

选项 2:

根据man expect

  • 等待 [参数]

    [...] wait 通常返回四个整数的列表。 第一个 整数是等待的进程的 pid。 second 整数是相应的生成 ID。 第三 整数是 -1(如果发生操作系统错误),否则为 0。如果第三 整数是0,则第四 整数是派生进程返回的状态。如果第三整数是-1,则第四整数是操作系统设置的errno的值。 [...]

因此您的 Expect 代码可以检查 wait 结果,然后具有不同值的 exit 和 Python 代码可以获得退出状态。

对于 Expect 部分,它是这样的:

spawn ...
...
expect eof
set result [wait]
exit [lindex $result 3]