Python自动化开发学习9-paramiko模块

简介:

第三方库的安装

下面要讲的paramiko是一个第三方库。这是第一次使用到第三方库,要使用第三方库需要先进行安装。不过现在安装过程比较简单,一条命令便可以完成库的下载和安装。下面就用paramiko模块举例安装的方法。

使用系统命令行安装

安装第三方库,建议直接用pip安装。Windows和Linux都适用
pip命令不在环境变量中,所以无法直接运行。可以将pip加到环境变量中,或者cd到 Python\Scripts 目录下,之后使用命令
$ pip install paramiko 等待安装完毕即可使用。

通过pacharm安装

如果使用pacharm,也可以用pacharm来安装。在File->Settings->Project: ->Project Interpreter 里,点右边的+号。
Python自动化开发学习9-paramiko模块
然后在搜索框搜索你要的第三方库,选中后点左下角的“Install Package”进行安装。
Python自动化开发学习9-paramiko模块

paramiko模块

paramiko模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。

SSHClient

可以实现连接远程服务器并执行基本命令

import paramiko
# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.MissingHostKeyPolicy())
# 连接服务器,下面改一下登录信息
ssh.connect(hostname='192.168.100.11', port=22, username='test', password='123456')
# 执行命令,写死命令或者用下面的获取用户输入
stdin, stdout, stderr = ssh.exec_command('df')
# cmd = input(">>")
# stdin, stdout, stderr = ssh.exec_command(cmd)
# 获取命令结果,标准输出和标准错误应该同时只有一个有值
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: 发出警告,会先报个错,但是不中断,程序还会继续执行

know_hosts文件

在linux系统中,用户家目录下会有一个隐藏文件夹“.ssh”。如果你这台机器没有使用过ssh,可能还没有自动创建这个文件夹。可以在家目录使用命令 $ ls -a 查看到。
模块中是使用 filename = os.path.expanduser('~/.ssh/known_hosts') 来查找到文件,然后获取到其中的主机的。也就是查找用户家目录下.ssh文件夹的know_hosts文件。当然也可以用命令指定查找别处的文件,并且可以调用多次,会将所有的内容合并。比如windows系统中可能没有这个文件,或者不在用户家目录中。如果你有安装的第三方ssh应用,可能会在别的地方。
linux系统中,可以用命令 $ ssh-keygen -R 清理掉已经记录的主机。

连接用Transport封装

模块另外还提供一种连接方式,使用Transport封装。先获取主机名和端口号,然后连接(其实这部分底层就是socket)。直接将这个已经封装好的连接,赋值给SSHClinet的实例。

import paramiko
# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.MissingHostKeyPolicy())
# 连接服务器,下面改一下登录信息
# ssh.connect(hostname='192.168.100.11', port=22, username='test', password='123456')
# 用下面这段代码代替上面的也能连接
transport = paramiko.Transport(('192.168.100.11', 22))
transport.connect(username='test', password='123456')
ssh._transport = transport
# 执行命令,写死命令或者用下面的获取用户输入
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传文件

通过paramiko模块还可以使用sftp进行上传和下载

import paramiko
# 根据实际情况修改你的连接信息
transport = paramiko.Transport(('192.168.100.11', 22))
transport.connect(username='test', 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()

ssh密钥验证

如果要自动登录,那么需要把用户名和密码事先存放在文件中。这样的做法很不安全,如果让别人读取到这个文件,就有了你所有的机器的访问权限。
这种情况下可以使用密钥认证,实现无密码登录。
这部分是RHCSA学过的内容
生成一对公钥-私钥对,私钥自己保存,公钥发送给需要登录的机器上。完成以上步骤,每次登录就不需要密码了。
ssh-keygen 在本地生成公钥-私钥对
ssh-copy-id [user@]host 将你的公钥发送到需要无密钥登录的主机。缺省user的话就是使用你当前这台机器使用的user
windowns中也可以使用,只需要使用工具先生成一对公钥和私钥。比如CRT
上面的是准备工作。完成后,在paramiko模块里也是以后,使用pkey来代替passwod进行登录。

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.100.11', port=22, username='test', 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()

如果是使用Transport封装,也是一样,把password参数换成pkey。看下面sftp的例子就可以了

sftp也可以使用密钥验证

到这里,应该就没太多问题了

import paramiko
private_key = paramiko.RSAKey.from_private_key_file('id_rsa')
transport = paramiko.Transport(('192.168.100.11', 22))
transport.connect(username='test', password='123456')
sftp = paramiko.SFTPClient.from_transport(transport)
# 上传文件:原文件,目的文件
sftp.put('local.txt', '/tmp/server.txt')
# 下载文件:原文件,目的文件
sftp.get('/root/.ssh/id_rsa', 'id_rsa')
transport.close()








本文转自骑士救兵51CTO博客,原文链接:http://blog.51cto.com/steed/2053138,如需转载请自行联系原作者
相关文章
|
4天前
|
机器学习/深度学习 分布式计算 物联网
【Python机器学习专栏】联邦学习:保护隐私的机器学习新趋势
【4月更文挑战第30天】联邦学习是保障数据隐私的分布式机器学习方法,允许设备在本地训练数据并仅共享模型,保护用户隐私。其优势包括数据隐私、分布式计算和模型泛化。应用于医疗、金融和物联网等领域,未来将发展更高效的数据隐私保护、提升可解释性和可靠性的,并与其他技术融合,为机器学习带来新机遇。
|
4天前
|
机器学习/深度学习 自然语言处理 搜索推荐
【Python机器学习专栏】迁移学习在机器学习中的应用
【4月更文挑战第30天】迁移学习是利用已有知识解决新问题的机器学习方法,尤其在数据稀缺或资源有限时展现优势。本文介绍了迁移学习的基本概念,包括源域和目标域,并探讨了其在图像识别、自然语言处理和推荐系统的应用。在Python中,可使用Keras或TensorFlow实现迁移学习,如示例所示,通过预训练的VGG16模型进行图像识别。迁移学习提高了学习效率和性能,随着技术发展,其应用前景广阔。
|
4天前
|
机器学习/深度学习 算法 前端开发
【Python机器学习专栏】集成学习中的Bagging与Boosting
【4月更文挑战第30天】本文介绍了集成学习中的两种主要策略:Bagging和Boosting。Bagging通过自助采样构建多个基学习器并以投票或平均法集成,降低模型方差,增强稳定性。在Python中可使用`BaggingClassifier`实现。而Boosting是串行学习,不断调整基学习器权重以优化拟合,适合弱学习器。Python中可利用`AdaBoostClassifier`等实现。示例代码展示了如何在实践中运用这两种方法。
|
4天前
|
机器学习/深度学习 算法 数据挖掘
【Python机器学习专栏】关联规则学习:Apriori算法详解
【4月更文挑战第30天】Apriori算法是一种用于关联规则学习的经典算法,尤其适用于购物篮分析,以发现商品间的购买关联。该算法基于支持度和置信度指标,通过迭代生成频繁项集并提取满足阈值的规则。Python中可借助mlxtend库实现Apriori,例如处理购物篮数据,设置支持度和置信度阈值,找出相关规则。
|
4天前
|
机器学习/深度学习 算法 前端开发
【Python机器学习专栏】集成学习算法的原理与应用
【4月更文挑战第30天】集成学习通过组合多个基学习器提升预测准确性,广泛应用于分类、回归等问题。主要步骤包括生成基学习器、训练和结合预测结果。算法类型有Bagging(如随机森林)、Boosting(如AdaBoost)和Stacking。Python中可使用scikit-learn实现,如示例代码展示的随机森林分类。集成学习能降低模型方差,缓解过拟合,提高预测性能。
|
4天前
|
前端开发 测试技术 持续交付
【Flutter 前端技术开发专栏】Flutter 中的 UI 测试与自动化测试
【4月更文挑战第30天】本文探讨了 Flutter 应用中UI测试和自动化测试的重要性,包括保障质量、提高效率和增强开发信心。Flutter提供`flutter_test`库进行Widget测试,以及`flutter_driver`进行集成测试。UI测试涵盖界面布局、交互和状态变化的验证,最佳实践建议尽早引入测试、保持用例简洁,并结合手动测试。未来,随着Flutter技术发展,UI测试和自动化测试将更加完善,助力开发高质量应用。
【Flutter 前端技术开发专栏】Flutter 中的 UI 测试与自动化测试
|
4天前
|
JSON 数据格式 Python
Python标准库中包含了json模块,可以帮助你轻松处理JSON数据
【4月更文挑战第30天】Python的json模块简化了JSON数据与Python对象之间的转换。使用`json.dumps()`可将字典转为JSON字符串,如`{"name": "John", "age": 30, "city": "New York"}`,而`json.loads()`则能将JSON字符串转回字典。通过`json.load()`从文件读取JSON数据,`json.dump()`则用于将数据写入文件。
10 1
|
6天前
|
Python 容器
python内置函数、数学模块、随机模块(二)
python内置函数、数学模块、随机模块(二)
|
22天前
|
数据采集 存储 API
网络爬虫与数据采集:使用Python自动化获取网页数据
【4月更文挑战第12天】本文介绍了Python网络爬虫的基础知识,包括网络爬虫概念(请求网页、解析、存储数据和处理异常)和Python常用的爬虫库requests(发送HTTP请求)与BeautifulSoup(解析HTML)。通过基本流程示例展示了如何导入库、发送请求、解析网页、提取数据、存储数据及处理异常。还提到了Python爬虫的实际应用,如获取新闻数据和商品信息。
|
2月前
|
Web App开发 Python
在ModelScope中,你可以使用Python的浏览器自动化库
在ModelScope中,你可以使用Python的浏览器自动化库
18 2