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放到项目当中就可以使用了