paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接,一般应用在多服务器管理即堡垒机中。
apt install python3-pip #安装Python3的pip
pip3 install paramiko #将paramiko模块安装到Python3中
RSA ——非对称密钥验证
公钥 public key
私钥 private key
Server1 ------> Server2
私钥 公钥
生成ssh密钥
输入ssh-keygen后会提示你选择将私钥保存在哪个路径,留空则使用默认路径,然后提示你是否设置私钥的密码,留空为不设置,为了实现无密码登陆,这里不设置,然后会生成一个public公钥。
由于密钥的发送是单向的,也就是server1 将公钥发送给 server2的某个用户之后,server1只能登陆server2的某个用户,而server2不能反向登陆server1,那你说,我就是要登陆server1的root用户,怎么搞?别急,听我慢慢道来。
上面存在2个问题;(1)server1生成了私钥和公钥后,私钥自己保管,公钥怎么发送给server2的用户?(2)发送之后怎么登陆?
问题1的解决方法,可以查看server1生成的id_rsa.pub公钥的内容,然后复制粘贴到server2用户的.ssh/authorized_keys文件中,新创建的用户需要自己创建。(这是一种很low的方式,下面说一种比较帅气的方式)
生成公钥之后,直接通过 ssh-copy-id "user@host" 的方式发送公钥。
问题2的解决方法,通过ssh user@host的方式直接连接,例如 ssh [email protected],成功的话是不需要输入密码的,如果提示输入密码就说明公钥没有生效,建议把公钥先复制在文本编辑器然后删掉换行再粘贴到authorized_keys中。
paramiko ssh_client demo
#!/usr/bin/python
#-*- coding:utf-8 -*-
__author__ = "Replaceroot"
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname='47.52.106.2', port=22, username='replaceroot', password='123456')
stdin, stdout, stderr = ssh.exec_command('ifconfig')
"""
获取命令结果
stdin,显示输入的信息
stdout,显示输出的信息
stderr,显示错误信息
"""
res, err = stdout.read(), stderr.read()
result = res if res else err #三元运算
print(result.decode())
ssh.close()
paramkio ssh_sftp demo
#!/usr/bin/python
#-*- coding:utf-8 -*-
__author__ = "Replaceroot"
import paramiko
transport = paramiko.Transport(("47.52.106.2", 22))
transport.connect(username="replaceroot", password="123456")
sftp = paramiko.SFTPClient.from_transport(transport)
sftp.put("home/replaceroot/Backdoor.exe", "/home/replaceroot/sftp/Backdoor.exe")
#sftp.get("remove_path", "local_path")
transport.close()
paramiko rsa_ssh_client demo
#!/usr/bin/python
#-*- coding:utf-8 -*-
__author__ = "Replaceroot"
import paramiko
private_key = paramiko.RSAKey.from_private_key_file('id_rsa102.txt')
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname = '192.168.0.104', port=22, username="root", pkey=private_key)
stdin, stdout, stderr = ssh.exec_command('ifconfig')
result = stdout.read()
print(result.decode())
ssh.close()
paramiko rsa_ssh_sftp demo
#!/usr/bin/python
#-*- coding:utf-8 -*-
__author__ = "Replaceroot"
"""程序基于公钥密钥上传下载"""
import paramiko
private_key = paramiko.RSAKey.from_private_key_file("id_rsa102.txt")
transport = paramiko.Transport(('192.168.0.104', 22))
transport.connect(username="alice", pkey=private_key)
sftp = paramiko.SFTPClient.from_transport(transport)
#将Backdoor.exe 上传到192.168.0.104 '/tmp/Backdoor.exe'
#sftp.put('c:\\Backdoor.exe','/tmp/Backdoor.exe')
sftp.get('/tmp/Backdoor.exe', 'D:\\Backdoor.exe')
transport.close()