os.system
最近有个需求就是页面上执行shell命令,第一想到的就是os.system
os.system('cat /proc/cpuinfo')
但是发现页面上打印的命令执行结果 0 或者 1,当然不满足需求了。
os.popen()
尝试第二种方案 os.popen()
output = os.popen('cat /proc/cpuinfo')
print output.read()
通过os.popen()返回的是 file read 的对象,对其进行读取 read() 操作可以看到执行的输出。但是无法读取程序执行的返回值。
commands.getstatusoutput()
尝试第三种方案 commands.getstatusoutput() 一个方法就可以获得到返回值和输出,非常好用。
(status, output) = commands.getstatusoutput('cat /proc/cpuinfo')
print status, output
Python Document 中给的一个例子,
>>> import commands
>>> commands.getstatusoutput('ls /bin/ls')
(0, '/bin/ls')
>>> commands.getstatusoutput('cat /bin/junk')
(256, 'cat: /bin/junk: No such file or directory')
>>> commands.getstatusoutput('/bin/junk')
(256, 'sh: /bin/junk: not found')
>>> commands.getoutput('ls /bin/ls')
'/bin/ls'
>>> commands.getstatus('/bin/ls')
'-rwxr-xr-x 1 root 13352 Oct 14 1994 /bin/ls'
python commands 模块在 python3.x 被 subprocess 取代
https://blog.csdn.net/ronnyjiang/article/details/53333538
paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,
值得一说的是,fabric 和 ansible 内部的远程管理就是使用的paramiko来现实。
《Python自动化运维技术与最佳实践》
下载安装
由于 paramiko 模块内部依赖pycrypto,所以先下载安装pycrypto
pip3 install pycrypto
pip3 install paramiko
使用示例:
import paramiko
if __name__ == '__main__':
ip = '172.28.11.132'
port = 22
user_name = "root"
user_password = r'123456'
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(ip, port, user_name, user_password)
cmd = 'ls /'
stdin, stdout, stderr = ssh.exec_command(cmd)
print stdout.readlines()
模块使用
执行命令,用户名+密码
#!/usr/bin/env python3
#执行命令,用户名+密码
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('192.168.101.2', 22, "root", '111111')
stdin, stdout, stderr = ssh.exec_command('df')
print(stdout.read())
ssh.close()
执行命令:python3 paramiko_test01.py
执行命令,密钥
#!/usr/bin/env python3
#执行命令,密钥
import paramiko
private_key_path = '/home/auto/.ssh/id_rsa'
key = paramiko.RSAKey.from_private_key_file(private_key_path)
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('192.168.101.2', 22, 'root', '111111')
stdin, stdout, stderr = ssh.exec_command('df')
print(stdout.read())
ssh.close()
上传或下载文件,用户名+密码
#!/sur/bin/env python3
#上传或下载文件,用户名+密码
import paramiko
import os,sys
t = paramiko.Transport(('192.168.101.2', 22))
t.connect(username='root',password='111111')
sftp = paramiko.SFTPClient.from_transport(t)
sftp.put('/tmp/test.py','/tmp/test.py') #第一个参数是本地上传的文件,第二个参数>时上传后目标机器保存的文件
t.close()
下载或上传文件,密钥
#!/usr/bin/env python3
#下载或上传文件,密钥
import paramiko
pravie_key_path = '/home/auto/.ssh/id_rsa'
key = paramiko.RSAKey.from+private_key_file(pravie_key_path)
t = paramiko.Transport(('192.168.101.2', 22))
t.connect(username='root',pkey=key)
sftp = paramiko.SFTPClient.from_transport(t)
sftp.put('/tmp/test2.py', '/tmp/test2.py')
t.close()