paramiko模块提供了进行远程登陆服务器执行命令和上传下载功能。使用之前要进行安装:pip install paramiko
(1)基于用户名和密码的连接
import paramiko ssh = paramiko.SSHClient() #建立一个sshclient对象 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #允许将信任的主机自动加入到host_allow列表 ssh.connect('10.100.46.101',22,'root','123456') #连接主机 stdin,stdout,stderr = ssh.exec_command('df -h') #执行命令 print(stdout.read().decode()) #结果放到stdout中,如果有错误放到stderr中,一定要添加decode() ssh.close()
使用类封装,同时将主机信息放到config.ini配置文件中。
import paramiko import configparser class ParamikoClient(): def __init__(self,ini_file): self.ssh = paramiko.SSHClient() self.config = configparser.ConfigParser() self.config.read(ini_file) self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) self.ssh.connect(hostname=self.config.get('ssh','host'),port=self.config.getint('ssh','port'),username=self.config.get('ssh','usr'),password=self.config.get('ssh','pwd'),timeout=self.config.getfloat('ssh','timeout')) def run_command(self,cmd_str): stdin,stdout,stderr = self.ssh.exec_command(cmd_str) print(stdout.read().decode()) self.ssh.close() client = ParamikoClient('config.ini') client.run_command('df -h')
(2)文件上传和下载
import os,sys import paramiko t = paramiko.Transport('10.100.46.101',22) #建立一个加密的传输管道 t.connect(username='root',password='123456') #建立连接 sftp = paramiko.SFTPClient.from_transport(t) #建立一个sftp客户端对象,通过ssh transport操作远程文件 #sftp.put('config.ini','/tmp/config.ini') #上传本地文件到远程主机 sftp.get('/tmp/test.txt','test.txt') #从远程主机上下载文件到本地 t.close()
(3)通过SSH连接服务器
import paramiko s = paramiko.SSHClient() s.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #允许连接不在know_hosts文件中的主机 key = paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa') #建立私钥文件连接 s.connect(hostname='10.100.46.101',port=22,username='root',pkey=key) #通过私钥验证的方式远程登陆主机 stdin,stdout,stderr = s.exec_command('df -h') print(stdout.read().decode())
(4)多线程进行文件上传和下载
from threading import Thread import paramiko import configparser #使用多线程进行文件上传和下载 class ParamikoClient(): def __init__(self,file_ini): self.t = paramiko.Transport('10.100.46.106',22) self.config = configparser.ConfigParser() self.config.read(file_ini) self.t.connect(username=self.config.get('ssh','usr'),password=self.config.get('ssh','pwd')) self.sftp = paramiko.SFTPClient.from_transport(self.t) # self.t.close() def run_upload(): client = ParamikoClient('config1.ini') client.sftp.put('ajax01.html','/tmp/ajax02.html') client.t.close() def run_download(): client = ParamikoClient('config1.ini') client.sftp.get('/tmp/ajax01.html','ajax02.html') client.t.close() t = Thread(target=run_upload()) t1 = Thread(target=run_download()) t.start() t1.start()