paramiko连接远程服务器实现ssh客户端和使用秘钥无密码登录

Paramiko 模块
用python 实现ssh客户端 (用于连接远程服务器)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#  Author: Diedline
"""最简单的ssh执行命令"""

import paramiko
# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='10.0.0.31', port=22, username='root', password='123456')
# 执行df命令
stdin, stdout, stderr = ssh.exec_command('df')
"""
获取命令结果
stdin 标准输入
stdout 标准输出 所以stdout和stderr两个只有一个有结果
stderr 标准错误 正确stdout 错误stderr
"""
res,err = stdout.read(),stderr.read()
"""
获取标准输出和标准错误的结果
"""
result = res if res else err

print(result.decode())

# 关闭连接
ssh.close()

1
2
3
4
5
6
7
8
9
10
11
#  Author: Diedline
import paramiko
transport = paramiko.Transport(('192.168.167.128', 22))
transport.connect(username="root",password="123456")
sftp = paramiko.SFTPClient.from_transport(transport)
#将location.py 上传至本地服务器 /tmp/test.py
sftp.put("test.txt","/tmp/test.txt")
#将remove_path 下载到本地 local_path
# sftp.get("remove_path","local_path")

transport.close()

成功上传到linux

1
2
3
4
5
6
7
8
9
10
11
#  Author: Diedline
import paramiko
transport = paramiko.Transport(('192.168.167.128', 22))
transport.connect(username="root",password="dljyxx225")
sftp = paramiko.SFTPClient.from_transport(transport)
#将location.py 上传至本地服务器 /tmp/test.py
# sftp.put("test.txt","/tmp/test.txt")
#将remove_path 下载到本地 local_path
sftp.get("/root/test.py","test.py")

transport.close()

成功下载linux上文件

直接写用户名密码在配置文件里是不安全的,可以不用密码,用秘钥来连接
ssh秘钥
RSA —非对称秘钥验证

公钥 public key
私钥 private key
10.0.0.31 ——>10.0.0.41
私钥 公钥
rwx rwx rwx r读w写x执行 用数字表示rwx—>421
属主 属组 others
chmod 777 authorized_key 改变权限变成777
所以改变权限变成777所有人都能访问 你要自己才能读写要改成600
先生成一对公钥私钥


生成公钥私钥 上面是私钥不能给别人看到
下面公钥
打开的类似Md5的私钥

生成的公钥

你把公钥放到root目录就是管理员权限,放到其他目录就是能登录其他的权限,当你发现复制过去的公钥无效的时候并且dd只能删除一行的时候,可能是因为你的公钥有多行自动换行了,你需要把它变成一行复制进去(这只是一个单项的,登录不需要密码)
ssh-copy-id “-p20 root@192.168.167.128
用秘钥登录 不需要密码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#  Author: Diedline


import paramiko
# 创建SSH对象
private_key = paramiko.RSAKey.from_private_key_file("id_rsa")
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='192.168.167.128', port=22, username='root', pkey= private_key)
# 执行命令

# 执行命令
stdin, stdout, stderr = ssh.exec_command('df')
result = stdout.read()
print(result.decode())
stdin, stdout2, stderr = ssh.exec_command('ifconfig')
# 获取命令结果
result2 = stdout2.read()
print(result2.decode())

# 关闭连接
ssh.close()