【问题标题】:python subprocess output with quota cmd带有配额cmd的python子进程输出
【发布时间】:2023-03-23 08:13:01
【问题描述】:

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 在配额范围内,这可以正常工作,并且返回类似

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

但如果用户超过配额,它不会返回

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

但只有False 用于output。甚至当我使用quota -q 时也是如此,它仅在超过配额时才返回更简单的输出。我也用quota -gslq 2>&1 试过这个,但没有用,我认为stderr=subprocess.STDOUT, 应该已经处理了这个问题。那么为什么我不能得到超额用户的结果呢?

【问题讨论】:

    标签: python ssh subprocess quota


    【解决方案1】:

    Qthe manpage for quota:

    诊断
    如果配额以非零状态退出,则一个或多个文件系统超出配额。

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

    您可能希望使用getstatusoutput() 速记:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-19
      • 2011-02-04
      • 2017-08-01
      • 2016-07-25
      • 1970-01-01
      • 2016-08-11
      相关资源
      最近更新 更多