вывод подпроцесса python с помощью командной строки квоты

#python #ssh #subprocess #quota

Вопрос:

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()
 

это отлично работает, если пользователь1 находится в пределах квоты и возвращает что-то вроде

 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>amp;1 сделать, но это не сработало, и я подумал stderr=subprocess.STDOUT, , что уже должен разобраться с этим. Так почему же я не могу получить результат для пользователей с превышением квоты?

Ответ №1:

Спросите на странице для 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)