python 使用 quota cmd 子处理输出

python subprocess output with quota cmd

1我正在尝试通过 ssh 将配额命令的结果输入 python,我正在使用:

cmd = 'quota -gsl user1'
try:
    output = subprocess.check_output(
        cmd,
        stderr=subprocess.STDOUT,
        timeout=5,
        shell=True,
        universal_newlines=True
    )
except subprocess.CalledProcessError as e:
    exit()

如果 user1 在配额范围内并且 return类似于

,则此方法工作正常
Disk quotas for group user1 (gid 9999): 
     Filesystem   space   quota   limit   grace   files   quota   limit   grace
      /dev/sda2    666M  10240M  12560M            1141       0       0

但如果用户超过配额,则不会return

Disk quotas for group user1 (gid 9999): 
     Filesystem   space   quota   limit   grace   files   quota   limit   grace
      /dev/sda2    11000M*  10240M  12560M            1141       0       0

output 只有 False。甚至当我使用 quota -q 时也是如此,其中 return 是一个更简单的输出,仅用于超过配额。我也用 quota -gslq 2>&1 尝试过,但没有用,我认为 stderr=subprocess.STDOUT, 应该已经解决了这个问题。那么为什么我无法获得超过配额用户的结果?

Quoth the manpage for quota:

Diagnostics
If quota exits with a non-zero status, one or more filesystems are over quota.

您正在使用 check_output,它结合了 check_call()(当命令 returns 为非零状态时会出错)和 getoutput()(不会t检查错误代码)。

您不妨使用 getstatusoutput() shorthand:

status, output = subprocess.getstatusoutput("quota -gsl user1")

或者用你原来的调用拼写出来(如果超时很重要),

cmd = 'quota -gsl user1'
try:
    output = subprocess.check_output(
        cmd,
        stderr=subprocess.STDOUT,
        timeout=5,
        shell=True,
        universal_newlines=True
    )
    status = 0
except subprocess.CalledProcessError as e:
    status = e.returncode
    output = e.output
print(status, output)