#python #subprocess #stdout #stderr
#python #подпроцесс #стандартный вывод #stderr
Вопрос:
Я хочу знать использование диска удаленными серверами, и я подумал о том, чтобы сделать это с помощью ssh, вот что я сделал до сих пор:-
def disk_usage(server):
msg=""
ps = subprocess.Popen(["ssh", "-o", "BatchMode=yes", "-l", "mygroup", server, "df -k /some/directory"], stdout=subprocess.PIPE)
out, err = ps.communicate()
if err != None:
msg = "n" err
else:
msg = out
return msg
Final_msg = ""
server_list= ['server A','server B','server C']
for server in server_list:
Final_msg ="For Server :" server "n" disk_usage(server)
print Final_msg
Скрипт работает нормально, но проблема в том, что когда ssh для любого сервера не настроен, он просто отображает пустой вывод для этого сервера
Вывод:-
For Server A :
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/cfd/ace 8064048 3581524 4072892 47% /app
For Server B :
For server C :
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/wsa/ace 306423 244524 23243434 90% /app
Здесь ssh для сервера B не настроен, поэтому я получаю пустой вывод, потому что batchmode включен ( BatchMode=yes
) для всех ssh-соединений, но я хочу, чтобы пользователь знал, почему не было вывода.
когда я запускаю ту же команду в командной строке для сервера, где ssh не настроен, я получаю приведенную ниже ошибку:
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
Я хочу, чтобы в моем выводе скрипта была такая же ошибка для этого конкретного сервера, где ssh не настроен.
есть идеи?
Ответ №1:
Чтобы обнаружить, что произошла ошибка, вы должны проверить returncode
атрибут объекта Popen ( ps
).
Чтобы получить выходные данные из stderr
, вы должны передать stderr=subprocess.PIPE
в Popen, точно так же, как вы делаете для stdout
.
Ответ №2:
если ваша локальная машина имеет статический ip, я бы рекомендовал использовать сокеты, чтобы ваш скрипт использования данных подключался к вашей локальной машине и доставлял данные. или, если у вас есть домен, чтобы публиковать информацию о вашем сервере в вашем веб-приложении через urllib.