python 的paramiko 模块,改模块是基于ssh用于连接远程服务器并执行相关操作
SSHClient
用于连接远程服务器并执行基本命令:
基于用户名密码的连接:
1 import paramiko 2 3 # 创建SSH对象 4 ssh = paramiko.SSHClient() 5 # 允许连接不在know_hosts文件中的主机 6 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 7 # 连接服务器 8 ssh.connect(hostname='0.0.0.0', port=22, username='root', password='123456') 9 10 # 执行命令 11 stdin, stdout, stderr = ssh.exec_command('df') 12 # 获取命令结果 13 #标准输出只有在正确的情况下才会有输出,错误的情况下没有 14 res,err = stdout.read(),stderr.read() 15 result = res if res else err 16 print(result.decode()) 17 # 关闭连接 18 ssh.close()
如果遇到这样的问题
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())这个函数就能够能好的解决
解释:
在linux中直接通过ssh去登录远程,会出现如下的问题:
输入yes之后:
输入密码就可以登录。
在linux中如果有一个文件 /root/.ssh/known_hosts
里面就有一个10.0.0.41的相关rsa信息,如果这个文件里有这个安全的签名认证,就可以直接输入密码连接,否则就需要自己做判断是否加入known_hosts
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())就是解决了这个问题,自动添加认证
在这里,不能执行“top”命令,只能让他执行那种一次性执行完毕的命令
SFtpClient
ssh远程传文件命令:
#r即使是目录也会传,p是会把文件的权限也传过去
scp -rp -P52113 文件名 root@10.0.0.41:/tmp/
查看文件内容,目录内容可以用:more ****
用于连接远程服务器并执行上传和下载
基于用户名密码上传下载
import paramiko transport = paramiko.Transport(('192.168.5.9', 22)) transport.connect(username='root', password='123456') sftp = paramiko.SFTPClient.from_transport(transport) # 将location.py 上传至服务器 /tmp/test.py sftp.put('笔记', '/tmp/test_from_win') # 将remove_path 下载到本地 local_path sftp.get('/root/test.txt', 'fromlinux.txt') transport.close()
put()方法是上传文件,get()方法是下载文件
上面两种方式都是用了明文用户名密码,这个是很不安全的。所以可以用密钥去连接
ssh密钥-----RSA非对称密钥验证
公钥(public key):是给别人的
私钥(private key)
10.0.0.31 ----------》10.0.0.41 这样就可以无密码连接
私钥 公钥
在linux中:
a. linux中生成公钥私钥对:#ssh-keygen(默认保存在/root/.ssh/id_rsa)
私钥在id_rsa中,公钥在id_rsa.pub中
b.将本地的公钥添加到远程机器的authorized_keys中,从而实现SSH无密码登录。ssh-copy-id "-p22 root@192.168.5.9"
c.利用ssh远程无密码登录:ssh root@192.168.5.9 -p22
在windows中:
import paramiko private_key = paramiko.RSAKey.from_private_key_file('id_rsa9.txt') # 创建SSH对象 ssh = paramiko.SSHClient() # 允许连接不在know_hosts文件中的主机 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接服务器 ssh.connect(hostname='192.168.5.12', port=22, username='xiaoming', pkey=private_key) # 执行命令 stdin, stdout, stderr = ssh.exec_command('df') # 获取命令结果 result = stdout.read() print(result.decode()) # 关闭连接 ssh.close()
使用rz/sz命令可以将linux生成的公钥上传到windows上:sz ~/.ssh/id_rsa
安装rz/sz命令:yum install lrzsz
然后将得到的id_rsa放到项目当中就可以使用了