该模块基于ssh,用于连接远程服务器并执行相关操作
1,sshCLIENT,基于用户名和密码连接
1.1
import paramiko # 该模块基于ssh,用于连接远程服务器并执行相关操作 ssh = paramiko.SSHClient() # 创建ssh对象 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 允许ssh连接不在known_hosts文件中的主机 ssh.connect(hostname="10.1.1.99", port=22, username="root", password="123456") # 连接服务器 stdin, stdout, stderr = ssh.exec_command("df -hT") # 执行命令 result = stdout.read() # 获取结果 print(result.decode()) ssh.close() # 关闭连接
1.2,sshclient封装transport
import paramiko transport = paramiko.Transport(('10.1.1.99', 22)) transport.connect(username='root', password='123456') ssh = paramiko.SSHClient() ssh._transport = transport stdin, stdout, stderr = ssh.exec_command("ip ro sh") # 执行命令 result = stdout.read() # 获取结果 print(result.decode()) ssh.close() # 关闭连接
2, SFTPclient用于连接远程服务器,执行上传下载
import paramiko transport = paramiko.Transport(('10.1.1.99', 22)) transport.connect(username='root', password='123456') sftp = paramiko.SFTPClient.from_transport(transport) sftp.put('paramiko-test.txt', '/root/yn/f1') # 上传本地文件到远程服务器 sftp.get('/root/yn/f1', 'paramiko-test.txt') # 把远程服务器的文件下载到本地 sftp.close()
# 注意不论是上传还是下载,目标location不能为目录,必须是文件。不然没法写入,会报错!
上述不论是登录执行命令还是上传和下载也好,密码都要明文输入,这样就带来了安全隐患。
3, 基于公钥密钥的连接
import paramiko private_key = paramiko.RSAKey.from_private_key_file('id_rsa') # 创建SSH对象 ssh = paramiko.SSHClient() # 允许连接不在know_hosts文件中的主机 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接服务器 ssh.connect(hostname='10.1.1.200', port=22, username='yn', pkey=private_key) # 执行命令 stdin, stdout, stderr = ssh.exec_command('free -m') # 获取命令结果 result = stdout.read() print(result.decode()) # 关闭连接 ssh.close()
注意思路:这里是把linux主机上的私钥拷贝过来的,也就相当于把window的公钥发给了linux,然后去连接,linux,(当然windows也可以利用Xshell来产生公钥进行连接linux)这里尤其要注意的点是在linux的主机上,一定不要忘了把自己的公钥拷贝到authorized_keys这个验证文件里面,否则会报错!这是浪费了一个下午的时间和精力得来的经验!!!
4, 基于公钥进行上传和下载
import paramiko private_key = paramiko.RSAKey.from_private_key_file('id_rsa') transport = paramiko.Transport(('10.1.1.200', 22)) transport.connect(username='yn', pkey=private_key) sftp = paramiko.SFTPClient.from_transport(transport) # sftp.put("paramiko-test.txt", "/home/yn/recv.txt") # 上传文件 sftp.get("/home/yn/recv.txt", "paramiko.txt") # 下载文件 transport.close()
注意:不管是上传还是下载目标文件必须要写。