该模块可以模拟ssh连接服务器,也可以实现sftp的上传下载功能:
登录时有两种方式,一是用户名密码登录,二是通过RSA非对称秘钥对实现免密登录
首先介绍一下哎服务器上怎么实现免密登录:
1.生成秘钥命令:ssh-keygen(中间没有空格) public_key 公钥,发送给需要连接的服务 ,生成位置一般为:/root/.ssh/id_rsa.pub, 发给其他机器存放位置/.ssh/authorized_keys文件中,复制时注意换行问题 private_key 秘钥,留在自己的机器上,生成位置一般为:/root/.ssh/id_rsa 2.免密连接命令 ssh 用户名@IP地址
下面逐一介绍,并附上源码:
一、利用paramiko实现ssh功能
1.用户名密码登录
# !usr/bin/env python # -*-coding:utf-8-*- import paramiko ssh_client = paramiko.SSHClient() #允许连接不在know_hosts中的主机 ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy) #连接服务器 ssh_client.connect(hostname="10.10.10.10",port=22,username="root",password="root") #执行指定命令,返回三个结果,标准输入,标准输出,标准错误,标准输出和标准错误不同时存在 stdin,stdout,stderr = ssh_client.exec_command("df") #读取输出结果 std_out = stdout.read() std_err = stderr.read() if len(std_out) == 0: print(std_err) else: print(std_out) #关闭服务 ssh_client.close()
2.RSA免密登录
import paramiko private_key = paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa') # 创建SSH对象 ssh = paramiko.SSHClient() # 允许连接不在know_hosts文件中的主机 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接服务器 ssh.connect(hostname='10.10.10.10', port=22, username='root', pkey=private_key) # 执行命令 stdin, stdout, stderr = ssh.exec_command('df') # 获取命令结果 result = stdout.read() # 关闭连接 ssh.close()
二、利用paramiko.Transport实现ssh功能
1.利用用户名密码登录
import paramiko transport = paramiko.Transport(('10.10.10.10', 22)) transport.connect(username='root', password='root') ssh = paramiko.SSHClient() ssh._transport = transport stdin, stdout, stderr = ssh.exec_command('df') print(stdout.read()) transport.close()
2.利用RSA免密登录
import paramiko private_key = paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa') #私钥地址 公钥也在同目录下 id_rsa.pub transport = paramiko.Transport(('10.10.10.10', 22)) transport.connect(username='root', pkey=private_key) ssh = paramiko.SSHClient() ssh._transport = transport stdin, stdout, stderr = ssh.exec_command('df') std_out = stdout.read() std_err = stderr.read() if len(std_out) == 0: print(std_err) else: print(std_out) transport.close()
三、利用paramiko.Transport实现sftp功能
1.用户名密码登录
#!usr/bin/env python #-*-coding:utf-8-*- ''' 基于用户名密码上传下载 ''' import paramiko #模拟实现ssh中sco transport = paramiko.Transport(('10.10.10.10', 22)) transport.connect(username='root', password='root') sftp = paramiko.SFTPClient.from_transport(transport) #上传location.py至服务器temp/test.py 本地文件路径 ==> 上传至服务器路径,并且需要重新命名 sftp.put("location.py","/temp/test.py") #下载服务器test_path至本地local_path sftp.get("/temp/test_path","local_path") transport.close()
2.RSA免密登录
import paramiko ''' 基于公钥密钥上传下载 ''' private_key = paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa') transport = paramiko.Transport(('10.10.10.10', 22)) transport.connect(username='root', pkey=private_key) sftp = paramiko.SFTPClient.from_transport(transport) # 将location.py 上传至服务器 /tmp/test.py sftp.put('/tmp/location.py', '/tmp/test.py') # 将remove_path 下载到本地 local_path sftp.get('remove_path', 'local_path') transport.close()