Python ssh远程操作:最佳实践与解决痛点

0 下载量 174 浏览量 更新于2024-08-29 收藏 236KB PDF 举报
本文主要探讨了使用Python进行SSH远程登录服务器的最佳实践,特别是在编写脚本时需要频繁执行远程命令的情况。传统的shell命令行方式存在输出干扰信息和代码不够优雅的问题。 在shell环境下,我们通常使用`sshpass`配合`ssh`命令来登录服务器并执行命令,例如`sshpass -p ${passwd} ssh -p ${port} -l ${user} -o StrictHostKeyChecking=no xx.xx.xx.xx ls -l`。然而,这种方式会输出一些不必要的信息,如主机名、端口、警告信息以及可能的登录失败提示。 在Python中,可以使用`subprocess`模块来执行shell命令,但这样做会同时捕获标准输出和标准错误,导致额外的清理工作。例如: ```python import subprocess ssh_cmd = "sshpass -p${passwd} ssh -p 22 -l root -o StrictHostKeyChecking=no xx.xx.xx.xx 'ls -l'" status, output = subprocess.getstatusoutput(ssh_cmd) # 数据清理和格式化操作... ``` 然而,这种方式存在以下痛点: 1. 必须额外安装`sshpass`,如果未配置免密登录的话。 2. 输出中包含大量干扰信息,需要编写额外的代码进行数据清理和格式化。 3. 代码实现不够简洁和优雅。 为了解决这些问题,Python社区提供了一些专门用于SSH连接的库,如`paramiko`和`Fabric`,它们提供了更高级别的接口,使得远程执行命令变得更加方便和可控。 `paramiko`是一个纯Python实现的SSHv2协议库,它可以用来创建SSH客户端或服务器。使用`paramiko`,我们可以直接执行远程命令,而无需关心shell级别的输出清理。下面是一个使用`paramiko`的例子: ```python import paramiko ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect('xx.xx.xx.xx', port=22, username='root', password='${passwd}') stdin, stdout, stderr = ssh.exec_command('ls -l') output = stdout.read().decode('utf-8') ssh.close() ``` `Fabric`是在`paramiko`基础上构建的一个高级接口,它简化了远程执行命令和文件传输的任务。通过`Fabric`,你可以编写更清晰的脚本,如下所示: ```python from fabric.api import run def remote_command(): with settings(host_string='xx.xx.xx.xx', user='root', password='${passwd}'): result = run('ls -l') print(result) ``` 使用这些库,不仅可以避免干扰信息,还能提高代码可读性和维护性。此外,它们还支持更复杂的操作,如文件传输、错误处理和并发执行。因此,在Python中进行SSH远程登录时,推荐使用`paramiko`或`Fabric`这样的库,以获得更好的体验和控制。