Python执行远程ssh命令

Python执行远程ssh命令,python,linux,ssh,Python,Linux,Ssh,我正在编写一个python nagios检查来检查文件上次更新时的时间戳,但是,我需要检查脚本中的两个独立主机,因此我希望使用远程ssh命令将时间戳返回到stdout,并使用该命令确保脚本在过去24小时内完成,因为脚本完成时会涉及一个文件 当我从命令提示符运行命令时,它会工作,但是当我从python代码运行命令时,它不会将输出返回到程序 Grants-MacBook-Pro:test GrantZukel$ ssh ubuntu@hostname sudo ls -la /home/ubuntu

我正在编写一个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变量是完全空的。有什么想法吗?

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

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

去掉
ls
命令周围的双引号:

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

您可能也想试试。

不相关,但如果您以
ubuntu
身份登录,为什么你需要
sudo
来列出
/home/ubuntu
?为什么你不直接
ls-l/home/ubuntu/code\u regen\u完成
?谢谢这项工作,我仍然需要修改一些东西,但这最终是有帮助的,谢谢。还有一个qeustion thosudo sshubuntu@hostssudogit日志-1--date=iso | grep^date:| awk'{print$2','$3,$4}'如何对/var/www/vhosts/webdirectorylocal_repo_date=compare_codebase(“sudo ssh”)执行该命令ubuntu@hostname“cd/var/www/vhosts/bazumedia.com/”sudo git log-1--date=iso | grep^date“”)我找到了nvm