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