问题描述
我有一个下面的 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]