paramiko简介:
模拟ssh客户端,使用ssh协议,基于sftp协议等做批量管理。例如处理用ssh登陆一千台机器执行
同一个命令,或下载上传文件等需求
基于用户名密码登录执行命令:
import paramiko #创建SSH对象 ssh = paramiko.SSHClient() #允许连接不在know_hosts文件中的主机,自动添加konw_host里面没有的主机 ssh.set_missing_hsot_key_policy(paramiko.AutoAddPolicy()) #连接服务器 ssh.connect(hostname='c1.salt.com',port=22,username='root',password='centos') #执行命令,标准输入,输出,错误,其中输出和错误只有一个有结果 stdin,stdout,stderr = ssh.exec_command('df') #获取标准输出的结果 result = stdout.read() print(result.decode()) #关闭连接 ssh.close()
基于用户名密码登录上传下载文件:
import paramiko ''' 模拟SCP命令传文件 ''' transport = paramiko.Transport(("hostname",22)) transport.connect(username='root', password='123') #把transport连接做为参数给SFTPClient 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()
上面的方式,用户名,密码写在列表里,循环连接这样是明文不安全 还有一种方式是用秘钥连接更安全
基于RSA公钥私钥连接执行命令:
import paramiko private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa') #创建SSH对象 ssh = paramiko.SSHClient() #允许连接不在know_host文件中的主机 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #连接服务器 ssh.connect(hostname='c1.salt.com',port=22,username='root',pkey=private_key) #执行命令 stdin, stdout, stderr = ssh.exec_command('df') result = stdout.read() print(result.decode())
基于RSA公钥私钥连接上传下载文件:
import paramiko private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa') transport = paramiko.Transport(('hostname',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()
注意事项:
错误说明:
not found konw_host文件
如果没有写这句话会报上面的错:ssh.set_missing_hsot_key_policy(paramiko.AutoAddPolicy())
在Linux里,用户家目录里有ls .ssh/know_host
10.0.0.31-->10.0.0.41
私钥 公钥
想连别的机器不用密码,就把公钥给别人放别人的家目录,私钥自己拿着
私钥和公钥成对出现,类似于对暗号的形式