Python paramiko实现SSH连接与文件传输完整指南
本文详解Python中paramiko库的两种核心用法:基于用户名密码的SSH连接与基于SSH密钥的免密登录。涵盖生成公钥、配置authorized_keys、使用ssh-copy-id命令以及通过SFTP上传文件的完整代码示例,帮助开发者快速实现远程服务器操作与文件传输。
基于用户名密码的SSH连接与文件上传
首先介绍使用用户名和密码进行SSH连接的方式。这种方式适用于没有配置密钥对的环境,通过指定目标主机地址、用户名及密码建立连接。
import paramiko
paramiko.util.log_to_file('paramiko.log') # 记录日志文件
ssh = paramiko.SSHClient()
try:
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('139.xx.xx.xx', username='work', password='***')
cmd = 'ls' # 需要执行的Linux命名
stdin, stdout, stderr = ssh.exec_command(cmd) #执行命令后的结构
print(stdout.readlines())
print(stdout.read().decode())
except Exception as e:
print("%s:%s" % (e.__class__, e))
finally:
# 关闭
ssh.close()
基于SSH密钥的免密登录与文件上传
接着介绍基于SSH密钥的免密登录方式。这种方式安全性更高,无需每次输入密码,通过加载本地私钥文件进行身份认证,适合自动化脚本和长期运行的服务。
import paramiko
ssh = paramiko.SSHClient()
SSH_PRIVATE_KEY ='/Users/xueerhuan/.ssh/id_rsa' #本地密钥文件路径
try:
key = paramiko.RSAKey.from_private_key_file(SSH_PRIVATE_KEY) # 无解密密码时
#key = paramiko.RSAKey.from_private_key_file(SSH_PRIVATE_KEY, password='******') # 有解密密码时,
ssh.load_system_host_keys() #通过known_hosts 方式进行认证可以用这个,如果known_hosts 文件未定义还需要定义 known_hosts
#ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 通过公共方式进行认证 (不需要在known_hosts 文件中存在)
ssh.connect(hostname='139.XX.XX.XX', port=22, username='root', pkey=key)
stdin, stdout, stderr = ssh.exec_command("ps")
# 获取命令结果
result = stdout.read()
# 打印输出
print(result.decode())
except Exception as e:
print("%s:%s" % (e.__class__, e))
finally:
# 关闭
ssh.close()
SSH密钥生成与配置指南
在配置免密登录前,需要先生成SSH密钥对。以下是生成密钥的具体步骤和注意事项。
首先,进入本地用户目录下的.ssh文件夹。在终端中执行命令:cd .ssh/
然后,使用ssh-keygen工具生成本地的公钥和私钥对。执行命令:ssh-keygen
执行上述命令后,在当前目录下会生成id_rsa(私钥)和id_rsa.pub(公钥)两个文件。例如:xueerhuan@ubuntu:~/.ssh$ ls id_rsa id_rsa.pub
接下来,将生成的id_rsa.pub文件中的内容复制到目标服务器的.ssh/authorized_keys文件中。如果目标服务器上没有authorized_keys文件,需要手动创建。请注意,authorized_keys文件的权限必须设置为600,否则SSH服务可能会拒绝读取。
或者,可以直接在本地终端使用一条命令自动完成公钥的复制。执行ssh-copy-id命令,后面跟上支持免密登录的目标用户地址,例如:ssh-copy-id user@host_ip。
morra@ubuntu:~/.ssh$ ssh-copy-id "morra@192.168.1.42"
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/morra/.ssh/id_rsa.pub"
The authenticity of host '192.168.1.42 (192.168.1.42)' can't be established.
ECDSA key fingerprint is SHA256:/ufx+/OLtdsYy7vsdk4KDu9xJsBp6zHonRAf2jjT0GI.
Are you sure you want to continue connecting (yes/no)? n^H
Please type 'yes' or 'no': yes
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
Password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'morra@192.168.1.42'" and check to make sure that only the key(s) you wanted were added.
#去目标机器下,检查authorized_keys文件
localhost:.ssh morra$ cat authorized_keys
以下是使用用户名和密码上传文件的Python代码示例。通过paramiko库建立连接后,获取transport对象并创建SFTP客户端,最后调用put方法上传本地文件到远程服务器。
import os
import paramiko
ssh = paramiko.SSHClient()
SSH_PRIVATE_KEY ='/Users/xueerhuan/.ssh/id_rsa' #本地密钥文件路径
key = paramiko.RSAKey.from_private_key_file(SSH_PRIVATE_KEY)
paramiko.util.log_to_file('paramiko.log')
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('139.XX.XX.XX', username='root', password='***')
t = ssh.get_transport()
sftp = paramiko.SFTPClient.from_transport(t)
d = sftp.put("mm.txt", "/home/work/.ssh/mm.txt")
print(d)
以下是使用SSH密钥进行免密上传文件的Python代码示例。与密码登录类似,但在连接时指定了私钥路径(pkey=key),无需提供密码参数,实现了更安全、自动化的文件传输。
import os
import paramiko
ssh = paramiko.SSHClient()
SSH_PRIVATE_KEY ='/Users/xueerhuan/.ssh/id_rsa' #本地密钥文件路径
key = paramiko.RSAKey.from_private_key_file(SSH_PRIVATE_KEY)
paramiko.util.log_to_file('paramiko.log')
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname='139.XX.XX.XX', port=22, username='root', pkey=key)
t = ssh.get_transport()
sftp = paramiko.SFTPClient.from_transport(t)
d = sftp.put("mm.txt", "/home/work/.ssh/mm.txt")
print(d)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









