SSH模块-paramiko

Zss 发表于:

paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接

官方文档:http://www.paramiko.org/

安装方法:

pip install PyCrypto  (PyCrypto是使用Python编写的加密工具包)

pip install paramiko /easy_install paramiko

paramiko主要包含核心组件,一个是SSHClient类,另一个是SFTPClient类

可以对远程服务器进行ssh连接,远程操作,上传下载

1.实现远程服务器进行操作,执行多条命令可以使用cd /;ls,中间使用;隔开或者&&隔开  ,通过账号密码来登陆

#coding:utf-8
import paramiko

trans = paramiko.Transport('hostip', 22) # 建立连接  host_ip和端口号
trans.connect(username='账号', password='密码')  #账号 密码
ssh = paramiko.SSHClient()# 将sshclient的对象的transport指定为以上的trans
ssh._transport = trans# 执行命令,和传统方法一样
cmd = raw_input('请输入命令')
stdin, stdout, stderr = ssh.exec_command(cmd)# 获取结果
print(stdout.read().decode())#获取错误提示(stdout、stderr只会输出其中一个)
print(stderr.read().decode())# stderr为错误信息的返回,stdout为正确的信息返回
trans.close()# 关闭连接

2.基于sftp来实现文件上传下载,通过账号密码来登陆

host = '。。。。'
port = 22
uersname = 'root'
password = '。。。。'
client = paramiko.Transport(host, port)
client.connect(username=uersname, password=password)
sftp = paramiko.SFTPClient.from_transport(client)
sftp.get('/home/test/test.log','D:/BaiduNetdiskDownload/test2.log')
# 从服务器下载到本地  第1个参数表示需要下载的文件在服务器上的path,第2个参数表示下载到哪里,文件名自定义
sftp.put('D:/BaiduNetdiskDownload/test2.log','/home/test/test3.log')
# 从本地上传到服务器   第1个参数表示需要上传的文件在本地的path   第2个参数表示上传到服务器的哪里,文件名自定义

3.通过密钥来登陆

import paramiko
private_key = paramiko.RSAKey.from_private_key_file('id_rsa31')
# 创建SSH对象
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='192.168.79.9', port=22, username='root', pkey=private_key)
stdin, stdout, stderr = ssh.exec_command('ifconfig')
res_out = stdout.read()
print(res_out.decode())
ssh.close()

4.通过密钥登陆实现的上传下载

import paramiko
private_key = paramiko.RSAKey.from_private_key_file('id_rsa31')
# 连接虚拟机centos上的ip及端口
transport = paramiko.Transport(("192.168.79.9", 22))
transport.connect(username="root", pkey=private_key)
# 将实例化的Transport作为参数传入SFTPClient中
sftp = paramiko.SFTPClient.from_transport(transport)
# 将“calculator.py”上传到filelist文件夹中
sftp.put('D:\python库\Python_shell\day05\calculator.py', '/filedir/calculator.py')
# 将centos中的aaa.txt文件下载到桌面
sftp.get('/filedir/oldtext.txt', r'C:\Users\duany_000\Desktop\oldtext.txt')
transport.close()

5.普通用户切换到root用户

import paramiko
def verification_ssh(host,username,password,port,root_pwd,cmd):
    s=paramiko.SSHClient()
    s.load_system_host_keys()
    s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    s.connect(hostname = host,port=int(port),username=username, password=password)
    if username != 'root':
        ssh = s.invoke_shell()
        time.sleep(0.1)
        ssh.send('su - \n')
        buff = ''
        while not buff.endswith('Password: '):
            resp = ssh.recv(9999)
            buff +=resp
        ssh.send(root_pwd)
        ssh.send('\n')
        buff = ''
        while not buff.endswith('# '):
            resp = ssh.recv(9999)
            buff +=resp
        ssh.send(cmd)
        ssh.send('\n')
        buff = ''
        while not buff.endswith('# '):
            resp = ssh.recv(9999)
            buff +=resp
        s.close()
        result = buff
    else:
        stdin, stdout, stderr = s.exec_command(cmd)
        result = stdout.read()
        s.close()
    return result

host = '。。。。'
port = 22
username = 'test'
password = '。。。。'
result = verification_ssh(host,username,password,port,password,cmd='df')
print(result)

一、SSHClient类的主要方法

1、Connect方法

Connect实现了远程SSH的连接并校验。

Connect(self,hostname,port,username,password,pkey,key_filename,timeout,allow_agent,look_for_keys ,compress)

参数含义:

Hostname  str :主机ip

Port  int :端口

Username  str:用户名

Password  str :密码

Pkey  pkey: 秘钥

Timeout  float: 超时时间

Allow_agent  boool :当为flase时,禁用连到ssh代理

Look_for_keys  bool : flase时,禁用在~/.ssh中搜索秘钥文件

Compress    bool : true时打开压缩。

2、exec_command方法

远程命令执行的方法

exec_command(self,command,bufsize=-1)

参数:

Command  str :命令串

Bufsize  int:文件缓冲区大小,默认-1没有限制

 

3、load_system_host_keys

加载本地公秘钥校验文件,默认为~/.ssh/known_hosts

load_system_host_keys(self,filename)

fielname  str :制定远程主机公钥记录文件

4、set_missing_host_key_policy

连接主机没有本地主机秘钥或者HostKeys对象时策略,目前支持三种:AutoAddPolicy,RejectPolicy,WarningPolicy

AutoAddPolicy:自动添加主机名以及主机秘钥

RejectPolicy(默认):自动拒绝未知的主机名和秘钥

WarningPolicy: 用于记录一个未知主机秘钥的Python警告

ssh = paramiko.SSHClient()

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

二、SFTPClient类——实现远程操作文件

1、from_transport方法

创建一个已经连通的sftp客户端通道

2、put函数

上传文件到服务器

Put(self,localpath,remotepath,callback=none,confirm=none)

Localpath  str : 上传文件本地源

Remotepath  str : 远程路径

Callback(function(int,int)) 获取已经接受的字节数以及总传输字节数。

Confirm  bool : 文件上传完毕后是否调用start()函数,以便确认文件大小。

3、get方法

从远程主机端下载文件同put

4、其他方法

Mkdir 创建目录 sftp.mkdr(‘/home/user’,0755)

Remove 删除主机端指定目录 sftp.remove(‘/home/user’)

Rename 从命名服务端的文件或者目录 sftp.rename(“/home/test.sh”,”/home/newtest.sh”)

Listdir  获取远程SFTP服务器端指定的目录列表,返回list形式  sftp.listdir(“/home”)

Stat 获取远程主机指定文件信息 sftp.stat(“/home/test.sh”)