老男孩14期自动化运维day9随笔和作业(多线程批量管理主机)(一)

1.paramiko 通过python实现模拟ssh批量登录
在linux系统上 ssh本身也可以用来传文件,例如:使用 scp -r /opt/test root@remote_host:/opt 命令也可以执行传输文件到远程主机。
(小知识点:Linux中 l.可以查看隐藏文件,ls -a 查看所有文件(包含隐藏文件),密钥存放的位置id_rsa、id_rsa.pub和know_host的位置都在/root/.ssh目录下 .ssh表示隐藏目录)

以下是一个paramiko模拟ssh登录的写法:
步骤:(1)ssh=paramiko.SSHClient()
(2)ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy)
(3)ssh.connect(hostname=…,port=…,username=…,password=…)

#!/usr/bin/env python
# coding:utf-8
# Author:Yang


# 基于用户名密码登录 不安全
import paramiko
# 创建ssh对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts 文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy)
# 连接服务器
ssh.connect(hostname='172.16.95.132',port=22,username='root',password='960314')

# 执行命令
stdin,stdout,stderr= ssh.exec_command('ls')
res,err=stdout.read(),stderr.read()
result = res if res else err
# 获取命令结果
# result =stdout.read()
print(result.decode())

# 关闭连接
ssh.close()

注意:
(1)ssh.set_missing_host_key_policy(paramiko.AutoPolicy)是使用忽略know_host文件中主机的连接策略。当远程主机的know_host文件中缺少当前主机的host_key则不允许连接。使用上述策略后可以连接。
(2)stdin,stdout,stderr=ssh.exec.command(‘ls’)是将执行结果返回给三个值,把三目运算符 res if res else err 赋给result的目的是当输出为结果时返回,当输出为错误信息时也作为结果返回

2.paramiko 通过模拟sftp实现文件传输
要先实例化一个连接transport,参数是ip和端口,然后调用transport的connect方法参数为username和pwd来建立连接,最后将transport作为参数来实例化sftp才能进行传输。
步骤:(1)transport=paramiko.Transport((ip,port)) 注意参数为元组
(2)transport.connect(username=…,password=…)
(3)sftp=paramiko.SFTPClient.from_transport(transport)
以下为一个实现的例子:

#!/usr/bin/env python
# coding:utf-8
# Author:Yang

import paramiko

transport = paramiko.Transport(('172.16.95.132',22)) # transport 实例
transport.connect(username='root',password='960314') # 建立连接

sftp=paramiko.SFTPClient.from_transport(transport)
sftp.put('note.txt','/root/1.txt') # 上传
# sftp.get('/root/1.txt','note2.txt') # 下载

transport.close()

3.ssh 密钥
在代码中如果直接写ip的密码不够安全,为了解决这种不安全的问题,可以通过生成密钥的方式。
ssh 密钥 使用 RSA(非对称密钥验证)
(1)公钥(public key) 本机生成 给别人
(2)私钥(private key) 本机生成 放在本机
例如:
本机 目标机
10.0.0.31 ----->10.0.0.41
私钥 公钥(给别人) 这是单向登录 31可以无密码登41 41无法登31 必须在41用户目录生成私钥公钥,把公钥给31才能无密码登录
私钥和公钥是10.0.0.31本机生成的 是一对的(一起生成的)
(3)密钥生成
在linux上生成私钥公钥的命令为:ssh-keygen
/root/.ssh/id_rsa 私钥
/root/.ssh/id_rsa.pub 公钥将公钥复制到目标机要登录对应用户目录的.ssh目录下authorized_keys文件里 …
由于复制容易出现编码问题,这里有命令可以执行:ssh-copy-id “-p22 root@remote_host”(在centos7中貌似不是这样)

实践后具体的步骤为:
1.本机ssh-keygen 生成密钥对
2.ssh-copy-id -i /root/.ssh/id_rsa.pub -p22 remote_host
3.输入密码即可将公钥写入远程主机 ~/.ssh/authorized_key里实现无密码登录

注意:例如想要在windows上实现尝试密钥登录 在linux上执行sz /root/.ssh/id_rsa 把linux本机的私钥拷贝到python文件夹里,就能通过模拟该本机去密钥连接其他主机

(小知识点,文件的权限)
421 421 421
rwx rwx rwx chmod 777
属主 属组 others

以下为python实现密钥ssh登录:

#!/usr/bin/env python
# coding:utf-8
# Author:Yang


# 基于密钥的登录
import paramiko



#  例如想要在windows上尝试密钥登录 在linux上执行 sz /root/.ssh/id_rsa 就能拷贝到windows本地 ,使用paramiko_rsa.py里登录
# 172.16.95.132的私钥
private_key=paramiko.RSAKey.from_private_key_file('id_rsa.txt')
# 创建ssh对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts 文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy)
# 连接服务器
ssh.connect(hostname='172.16.95.132',port=22,username='root',pkey=private_key)

# 执行命令
stdin,stdout,stderr= ssh.exec_command('ls')
res,err=stdout.read(),stderr.read()
result = res if res else err
# 获取命令结果
# result =stdout.read()
print(result.decode())

# 关闭连接
ssh.close()

猜你喜欢

转载自blog.csdn.net/qq_33060225/article/details/84317242