Python使用paramiko连接Linux:密码与密钥认证详解

陆遥
陆遥
发布时间:2026-10-13 | 2人浏览过
原创

本文详解Python中paramiko模块连接Linux服务器的两种核心方式:密码认证与SSH密钥免密登录。通过具体代码示例展示如何执行远程命令及SFTP文件传输,并深入解析SSH密钥生成、公钥分发原理及常见认证错误排查,帮助开发者实现安全的远程主机批量管理。

paramiko模块基础介绍

当Python程序需要与Linux系统进行交互时,通常需要通过密码或密钥验证来登录操作系统,从而执行命令或进行文件传输。在Python生态中,paramiko模块是实现这一功能的标准工具。以下是该模块的基础使用指南。

密码认证连接示例

接下来将通过代码示例,展示如何使用密码方式登录Linux并执行命令及传输文件。

密码认证代码实现


import paramiko
#python程序需要批量管理linux时需要借助paramilo模块登录linux执行命令或者传输文件,下面是最简单的登录主机执行命令
ssh_client = paramiko.SSHClient() #创建连接对象
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #允许连接不在know_hosts文件中的主机,首次登陆其它机器时会用到
ssh_client.connect(hostname="192.168.226.128", port=22, username="root", password="123456") #使用用户名密码连接主机
stdin, stdout, stderr = ssh_client.exec_command("df -h") #执行命令获取结果
#获取命令结果
res,err = stdout.read(),stderr.read()
result = res if res else err  ##这里我们使用三元运算
print(result.decode(encoding="utf-8"))
ssh_client.close() #关闭ssh


#下面是传输文件
transport = paramiko.Transport(("192.168.226.128", 22))
transport.connect(username="root", password="123456")
my_sftp = paramiko.SFTPClient.from_transport(transport)
my_sftp.put("__init__.py", "/root/123.tst") #__init__.py是本地文件名,其它目录需要写绝对路径形式, /root/123.tst上传到128的root目录且命名为123.tst
my_sftp.get("/root/hello.py", "hello_get.py") #将远端的hello.py 下载到本地当前目录且重命名为hello_get.py
transport.close()

SSH密钥认证配置

在代码中直接使用明文密码不仅存在安全隐患,也不符合安全编程规范。为了提高安全性,推荐使用SSH密钥进行身份验证。

免密登录配置步骤

首先,在两台Linux机器上执行特定配置后,即可实现从IP为192.168.226.128的主机免密登录到192.168.226.129的主机。

1、在正常配置下,从128主机通过SSH连接129机器时,整个过程需要输入密码进行身份验证。

2、执行ssh-keygen命令后,所有提示项直接回车确认。系统会在当前登录用户的家目录下的.ssh文件夹中生成两个文件:id_rsa(私钥)和id_rsa.pub(公钥)。

3、使用ssh-copy-id命令可以将本地生成的公钥自动追加到129主机root用户家目录下的authorized_keys文件中。

4、完成上述操作后,128主机即可免密登录129主机。但此时反向连接(129登录128)仍需密码;若需双向免密,129主机也需执行相同操作。实现免密的核心在于128主机的id_rsa私钥能与129主机authorized_keys文件中存储的对应公钥匹配成功。

5、如果仅执行了上述单向配置,Windows机器可以利用128主机的id_rsa私钥实现免密登录129主机。具体实现方法如下所示。

密钥认证代码实现


import paramiko
#python程序需要批量管理linux时需要借助paramilo模块登录linux执行命令或者传输文件,下面是最简单的登录主机执行命令
private_key = paramiko.RSAKey.from_private_key_file("id_rsa")
ssh = paramiko.SSHClient() #创建连接对象
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #允许连接不在know_hosts文件中的主机
ssh.connect(hostname="192.168.226.129", port=22, username="root", pkey=private_key) #使用用户名密码连接主机
stdin, stdout, stderr = ssh.exec_command("df -h") #执行命令获取结果
#获取命令结果
res,err = stdout.read(),stderr.read()
result = res if res else err  ##这里我们使用三元运算
print(result.decode(encoding="utf-8"))
ssh.close() #关闭ssh


#下面是传输文件
transport = paramiko.Transport(("192.168.226.129", 22))
transport.connect(username="root", pkey=private_key)
my_sftp = paramiko.SFTPClient.from_transport(transport)
my_sftp.put("__init__.py", "/root/123.tst")
my_sftp.get("/root/hello.py", "hello_get129.py")
transport.close()

常见问题与注意事项

注意事项:

1、尽管拥有128主机的私钥,但无法直接免密登录128主机。尝试登录时会抛出认证失败异常:paramiko.ssh_exception.AuthenticationException: Authentication failed。此时仍需通过密码登录128,或者将129主机生成的公钥拷贝给128主机,利用129的私钥进行登录。

2、不能使用128主机的公钥来登录129主机。Windows机器模拟的是128主机免密登录129,因此必须使用128的私钥。如果尝试使用公钥登录,由于无法与129主机本地文件中存储的128公钥配对,会报错:paramiko.ssh_exception.SSHException: not a valid RSA private key file。

以上就是关于Python使用paramiko连接Linux的全部内容,希望对读者有所帮助,欢迎继续支持本站。

本站声明

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

Python 相关产品和应用

全部下载

专题列表