Python执行远程ssh命令

时间:2015-01-29 19:20:32

标签: python linux ssh

我正在写一个python nagios检查以检查上次更新文件的时间戳,但是我需要在我的脚本中检查两个单独的主机,所以我想使用远程ssh命令来返回时间戳到stdout并使用它来确保脚本在过去24小时内完成,因为当脚本完成时它会触及文件。

当我从命令提示符运行命令时,它可以工作但是当我从我的python代码运行它时,它不会将输出返回给我的程序。

Grants-MacBook-Pro:test GrantZukel$ ssh ubuntu@hostname sudo ls -la /home/ubuntu/ | grep code_regen_complete

The authenticity of host 'ec2-54-144-160-238.compute-1.amazonaws.com (54.144.160.238)' can't be established.

RSA key fingerprint is hidden.

Are you sure you want to continue connecting (yes/no)? yes

Failed to add the host to the list of known hosts (/Users/GrantZukel/.ssh/known_hosts).

-rw-r--r-- 1 root   root       0 Jan 29 17:23 code_regen_complete

Grants-MacBook-Pro:test GrantZukel$ 

python是:

def get_code_time(): 
    p = subprocess.Popen(['ssh','ubuntu@hostname', '"sudo ls -la /home/ubuntu/ | grep code_regen_complete"'], stdout=subprocess.PIPE)
    out, err = p.communicate()
    m = re.search('\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2}', out)
    return m.group(0) 

然而,当我使用调试器时,out或err vars完全是空的。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

您需要在命令中传递shell=True

p = subprocess.Popen(['ssh','ubuntu@hostname', '"sudo ls -la /home/ubuntu/ | grep code_regen_complete"'], stdout=subprocess.PIPE,shell=True)

答案 1 :(得分:1)

删除ls命令周围的双引号:

p = subprocess.Popen(['ssh','ubuntu@hostname', 'sudo ls -la /home/ubuntu/code_regen_complete'], stdout=subprocess.PIPE)

您可能还想尝试Fabric