Python Paramiko实现Linux远程登录与SFTP文件传输详解

拾柒
拾柒
发布时间:2026-10-13 | 4人浏览过
原创

本文详细介绍如何使用Python的Paramiko库实现Linux服务器的远程登录及SFTP文件传输。对比了Shell命令、subprocess模块与Paramiko的优劣,重点讲解了基于用户名密码和公钥认证的四种连接方式(SSHClient与Transport),并提供了SFTP上传下载的具体代码示例,帮助开发者高效管理远程服务器。

Paramiko简介与优势

Paramiko是一个基于Python语言编写的模块,遵循SSH2协议,支持以加密和认证方式连接远程服务器,可用于执行远程命令或进行文件操作。

得益于Python的跨平台特性,Paramiko支持Linux、Solaris、BSD、macOS X和Windows等多种操作系统。若需在不同平台间通过SSH进行系列操作,Paramiko是理想的选择。

本文将重点介绍如何利用Paramiko通过Python实现Linux远程登录及SFTP文件传输操作。

传统SSH命令与subprocess的局限性

1. 使用Shell命令

$ sshpass -p ${passwd} ssh -p ${port} -l ${user} -o StrictHostKeyChecking=no xx.xx.xx.xx "ls -l"

执行上述命令时,输出结果中往往包含大量无需且难以去除的干扰信息。对于Shell命令,可通过管道或重定向标准输出至文件来获取执行结果,但这种方式处理起来较为繁琐。

2. 使用subprocess模块

在Python中,可通过os.popen、os.system、commands或subprocess等库间接获取系统信息。这些方法返回的output不仅包含标准输出,还混杂标准错误信息,因此每次都需要对output进行数据清理和格式化整理,才能得到期望的数据。


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) 
# 数据清理

综上所述,间接使用SSH命令存在以下问题:

1. 若不使用免密登录,需额外安装sshpass工具; 2. 干扰信息过多,数据清理和格式化工作繁琐; 3. 代码实现不够优雅,可读性较差; 4. SSH连接无法复用,一次连接仅能执行一次命令; 5. 代码不具备全平台兼容性,仅能在Linux和OSX上使用。

Paramiko安装与连接方式详解

3. 使用Paramiko库

安装Paramiko

python3 -m pip install paramiko

方法1:基于用户名和密码的SSHClient方式登录

该方式无法复用SSH连接。


import paramiko 
ssh = paramiko.SSHClient() 
# 允许连接不在know_hosts文件中的主机 
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
# 建立连接 
ssh.connect("xx.xx.xx.xx", username="root", port=22, password="you_password") 
# 使用这个连接执行命令 
ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command("ls -l") 
# 获取输出 
print(ssh_stdout.read()) 
# 关闭连接 
ssh.close() 

方法2:基于用户名和密码的Transport方式登录

该方式支持连接复用。


import paramiko 
# 建立连接 
trans = paramiko.Transport(("xx.xx.xx.xx", 22)) 
trans.connect(username="root", password="you_passwd") 
ssh = paramiko.SSHClient() 
ssh._transport = trans 
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command("ls -l") 
print(ssh_stdout.read()) 
# 关闭连接 
trans.close()

方法3:基于公钥的SSHClient方式登录

该方式无法复用SSH连接。


import paramiko 
# 指定本地的RSA私钥文件 
# 如果建立密钥对时设置了密码,password为passphrase。如果没有passphrase则无需指定password参数。
pkey = paramiko.RSAKey.from_private_key_file('/home/you_username/.ssh/id_rsa', password='12345') 
# 建立连接 
ssh = paramiko.SSHClient() 
ssh.connect(hostname='xx.xx.xx.xx', 
      port=22, 
      username='you_username', 
      pkey=pkey) 
# 执行命令 
stdin, stdout, stderr = ssh.exec_command('ls -l') 
# 结果放到stdout中,如果有错误将放到stderr中 
print(stdout.read()) 
# 关闭连接 
ssh.close() 

方法4:基于公钥的Transport方式登录

该方式支持连接复用。


import paramiko 
# 指定本地的RSA私钥文件 
# 如果建立密钥对时设置了密码,password为passphrase。如果没有passphrase则无需指定password参数。 
pkey = paramiko.RSAKey.from_private_key_file('/home/you_username/.ssh/id_rsa', password='12345') 
# 建立连接 
trans = paramiko.Transport(('xx.xx.xx.xx', 22)) 
trans.connect(username='you_username', pkey=pkey) 
ssh = paramiko.SSHClient() 
ssh._transport = trans 
# 执行命令,和传统方法一样 
stdin, stdout, stderr = ssh.exec_command('df -hl') 
print(stdout.read().decode()) 
# 关闭连接 
trans.close() 

SFTP文件传输操作

SFTP文件传输


import paramiko 
trans = paramiko.Transport(('xx.xx.xx.xx', 22)) 
# 建立连接 
trans.connect(username='you_username', password='you_passwd') 
# 实例化一个 sftp对象,指定连接的通道 
sftp = paramiko.SFTPClient.from_transport(trans) 
# 发送文件 
sftp.put(localpath='/tmp/11.txt', remotepath='/tmp/22.txt') 
# 下载文件 
sftp.get(remotepath='/tmp/22.txt', localpath='/tmp/33.txt') 
trans.close() 

参考

https://www.linuxprobe.com/log-in-to-remote-service-python.html

总结

至此,关于借助Paramiko通过Python实现Linux远程登录及SFTP操作的介绍已完成。如需了解更多Python Paramiko实现远程登录和SFTP的相关内容,请搜索本站历史文章或继续浏览后续文章。感谢大家的支持!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表