模块 paramiko
paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,值得一说的是,fabric和ansible内部的远程管理就是使用的paramiko来现实。
1、下载安装
windows和Linux平台都建议使用pip 安装,
pip3 install paramiko
2、pycharm第三方库安装
来介绍一下PyCharm 安装使用第三方库的安装,因为是第一次安装第三方库,仪式感很重要。
打开pycharm,在File->Settings->Project: ->Project Interpreter 里,点右边的+号。
在搜索框输出入第三方库名,选中后点左下角的“Install Package”进行安装。
3、paramiko模块使用
远程执行命令:
import paramiko ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy) ssh.connect('192.168.0.172',22,'Ljohn','1356236') stdin,stdout,stderr = ssh.exec_command('uptime') print(stdout.read()) ssh.close()
从上面可以看到输出的结果是byte字节类型需要转换,完善一下上面代码:
import paramiko # 创建SSH对象 ssh = paramiko.SSHClient() # 允许连接不在know_hosts文件中的主机 ssh.set_missing_host_key_policy(paramiko.MissingHostKeyPolicy()) # 连接服务器,下面改一下登陆信息 ssh.connect(hostname='192.168.0.172',port=22,username='Ljohn',password='1356236') # 执行命令,写死命令或者用下面的获取输入 stdin,stdout,stderr = ssh.exec_command('ls -la /etc/paswd') # 获取命令结果,标准输出和标准错误应该同事只有一个值 res,err = stdout.read(),stderr.read() if res: print('res:\n',res.decode()) if err: print('err:\n',err.decode()) # 关闭连接 ssh.close()
参数说明:上面例子中的第二句 ssh.set_missing_host_key_policy(paramiko.MissingHostKeyPolicy()) ,设置允许没有host_key的连接策略。如果找不到know_hosts文件,或者文件中没有这台主机,如果没有这句,就会报错。如果有这句,那么就执行作为参数的那个方法的策略。作为参数的 paramiko.MissingHostKeyPolicy() 还有另外3个方法。
- MissingHostKeyPolicy: 这个是下面3个参数的父类,直接就一句pass,就是什么也不做。所以可以正常运行
- AutoAddPolicy: 自动添加到know_hosts中,那么下次就不会找不到了。如果找不到know_host文件的话,就和上面一样了
- RejectPolicy: 直接拒绝,会抛出一个错误。默认就是这个,所以不写这句会报错。
- WarningPolicy: 发出警告,会先报个错,但是不中断,程序还会继续执行
SFTP远程上传下载文件:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
import paramiko transport = paramiko.Transport(('192.168.1.123', 22)) transport.connect(username='Ljohn', password='123456') # 建立sftp连接 sftp = paramiko.SFTPClient.from_transport(transport) # 上传文件:源文件,目的文件 sftp.put('local.txt', '/tmp/server.txt') # 下载文件:源文件,目的文件 sftp.get('/tmp/server.txt', 'from_server.txt') transport.close()
基于密钥验证
在paramiko模块里也是以后,使用pkey来代替passwod进行登录
远程执行命令:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
import paramiko # 使用命令从文件获取密钥,注意修改文件路径 private_key = paramiko.RSAKey.from_private_key_file('id_rsa') ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.MissingHostKeyPolicy()) # 连接服务器,这里要改一下,注意参数 ssh.connect(hostname='192.168.0.172', port=22, username='Ljohn', pkey=private_key) # 执行命令测试一下 stdin, stdout, stderr = ssh.exec_command('df') res, err = stdout.read(), stderr.read() if res: print('res:\n', res.decode()) # 如果有标准输出,则打印出来 if err: print('err:\n', err.decode()) # 如果有标准错误,则打印出来 ssh.close()
sftp 上传下载文件:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
import paramiko pravie_key_path = '/home/Ljohn/.ssh/id_rsa' key = paramiko.RSAKey.from_private_key_file(pravie_key_path) t = paramiko.Transport(('192.168.0.172',22)) t.connect(username='Ljohn',pkey=key) sftp = paramiko.SFTPClient.from_transport(t) sftp.put('/tmp/test3.py','/tmp/test3.py') sftp.get('/tmp/test3.py','/tmp/test4.py') t.close()