【发布时间】:2017-07-10 14:35:04
【问题描述】:
我正在尝试制作一个脚本来处理来自其他脚本的错误和警告,它可以是其他 python 或 bash 脚本。
我发现这样做的唯一方法是使用 Popen,我使用 Popen 执行脚本并将 stderr 存储到变量中。
检查 Popen 的返回码我可以说 stderr 是警告(返回码 0,脚本运行成功)还是实际上是错误(返回码 1,脚本没有成功运行)。
但是有些脚本即使出现错误也会继续执行命令,因此返回码为 0,就像是一些警告或脚本确实运行成功一样。这种事情怎么办?
这里有一些示例可以让您全面了解:
sshpass -p password sftp -q username@host << EOF
cd Export
get file.csv
EOF
这个 bash 脚本给我一个错误,它找不到 file.csv,好的。
File "/Export/file.csv" not found.
这个python脚本执行上面的脚本。
script = 'bash_script'
proc = subprocess.Popen("bash {}.sh ".format(script), stderr=subprocess.PIPE, shell=True)
(stdout, stderr) = proc.communicate()
if (proc.returncode) and (stderr != ''):
print("\n[ERROR]:\n" + str(stderr))
elif (not proc.returncode) and (stderr != ''):
print("\n[WARNING]:\n" + str(stderr))
else # (not proc.returncode) and (stderr == '')
print("\n[SUCCESS]\n")
但是执行上面的脚本我得到:
[WARNING]:
File "/Export/file.csv" not found
什么时候应该:
[ERROR]:
File "/Export/file.csv" not found
发生这种情况是因为返回码为 0 并且错误按预期转到了 stderr。
我该如何处理这种情况?区分错误和警告的最佳方法是什么?为什么 sftp 命令应该返回 1 却返回 0 对应一个错误?
【问题讨论】:
-
你为什么使用命令行
ssh?使用 Python SSH 库。 -
这只是一个 bash 脚本示例,它给了我一个意外的返回码。我的脚本的目标是运行 pyhton 和 bash 脚本。我可以在新脚本中使用 Python SSH,但我不能将服务器上的每个脚本都更改为使用 Python,明白吗?
-
好,那么我将删除 sftp 标签,因为您的问题与 SFTP 无关。