подпроцесс stdout и stderr при выполнении ssh

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