zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Python编程:paramiko模块远程登录

Python模块编程 远程 登录 paramiko
2023-09-14 09:07:12 时间

SSH:安全外壳协议 SSH: Secure Shell Protocol
安全外壳协议(SSH)是一种在不安全网络上提供安全远程登录及其它安全网络服务的协议。

说明:以下代码使用windows访问linux(centos)

安装第三方库

pip install paramiko	

1. SSHClient方式

1.1 基于用户名和密码

import paramiko

# 建立一个sshclient对象
ssh = paramiko.SSHClient()

# 允许将信任的主机自动加入到host_allow 列表,此方法必须放在connect方法的前面
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# 调用connect方法连接服务器
ssh.connect(hostname="hostaddress", port=22, username="root", password="password")

# 执行命令 加入参数 get_pty=True 可执行多条指令(分号;隔开)
stdin, stdout, stderr = ssh.exec_command("df")

# 结果放到stdout中,如果有错误将放到stderr中
stdout = stdout.read().decode("utf-8")
stderr = stderr.read().decode("utf-8")
print(stdout)
print(stderr)

# 关闭连接
ssh.close()

1.2 基于公钥密钥连接

import paramiko

# 导入文件中的私钥
private_key = paramiko.RSAKey.from_private_key_file("private_key.txt")

# 建立一个sshclient对象
ssh = paramiko.SSHClient()

# 允许将信任的主机自动加入到host_allow 列表,此方法必须放在connect方法的前面
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# 调用connect方法连接服务器
ssh.connect(hostname="hostaddress", port=22, username="root", pkey=private_key)

# 执行命令
stdin, stdout, stderr = ssh.exec_command("df")

# 结果放到stdout中,如果有错误将放到stderr中
res_out = stdout.read().decode("utf-8")
res_err = stderr.read().decode("utf-8")

result = res_out if res_out else res_err
print(result)

# 关闭连接
ssh.close()

2. SFTPClient方式

2.1 基于用户名密码上传下载文件

import paramiko

transport = paramiko.Transport(("hostaddress", 22))

transport.connect(username="root", password="password")

sftp = paramiko.SFTPClient.from_transport(transport)

# 上传服务器
sftp.put("登鹳雀楼", "登鹳雀楼")

# 从服务器下载
sftp.get("登鹳雀楼", "1.txt")

transport.close()

print("ok")

2.2 基于公钥密钥上传下载文件

import paramiko

# 导入文件中的私钥
private_key = paramiko.RSAKey.from_private_key_file("private_key.txt")

transport = paramiko.Transport(("hostaddress", 22))

transport.connect(username="root", pkey=private_key)

sftp = paramiko.SFTPClient.from_transport(transport)

# 上传服务器
sftp.put("登鹳雀楼", "登鹳雀楼")

# 从服务器下载
sftp.get("登鹳雀楼", "2.txt")

transport.close()

print("ok")

关于RSA非对称加密

A 电脑 --登陆–> B 电脑
A: private key 私钥
B: public key 公钥

以root用户为例:

linux 生成公钥私钥对 (密码均为空):ssh-keygen
进入目录:cd ~/.ssh
拷贝一份公钥(推荐,不要复制粘贴,有坑):cat id_dsa.pub >> authorized_keys
修改权限:chmod 600 authorized_keys

421
rwx rwx rwx
属主 属组 其他

将私钥复制出来拷贝到客户端,保存为private_key.txt (名字可以随意取)

参考文章:

  1. 《使用ssh公钥实现免密码登录》
  2. 《python模块之 paramiko》
  3. paramiko SSHClient调用sudo权限和执行多条指令的方法