paramiko模块实现堡垒机
通过SSHClient 执行命令
"""通过用户名密码验证""" import paramiko # 创建 SSH 对象
ssh = paramiko.SSHClient()
# 自动添加key到 known_hosts
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='10.211.55.5', port=22, username='root', password='')
# 执行命令
stdin, stdout, stderr = ssh.exec_command('ls')
# 获取命令结果
result = stdout.readlines()
print(result)
# 关闭连接
ssh.close()
"""通过秘钥验证""" import paramiko private_key = paramiko.RSAKey.from_private_key_file('/Users/wenchong/.ssh/id_rsa') ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 使用秘钥连接
ssh.connect(hostname='10.211.55.5', port=22, username='root', pkey=private_key)
stdin, stdout, stderr = ssh.exec_command('ls')
result = stdout.readlines()
print(result)
ssh.close()
"""SSHClient 封装 Transport""" import paramiko transport = paramiko.Transport(('10.211.55.5', 22))
# 通过密码验证
# transport.connect(username='root', password='111111') # 通过秘钥验证
private_key = paramiko.RSAKey.from_private_key_file('/Users/wenchong/.ssh/id_rsa')
transport.connect(username='root', pkey=private_key) ssh = paramiko.SSHClient()
ssh._transport = transport stdin, stdout, stderr = ssh.exec_command('ls')
result = stdout.readlines()
print(result)
transport.close()
通过 SFTPClient 上传下载文件
"""上传下载文件""" import paramiko transport = paramiko.Transport(('10.211.55.5', 22))
# 通过密码验证
# transport.connect(username='root', password='111111') # 通过秘钥验证
private_key = paramiko.RSAKey.from_private_key_file('/Users/wenchong/.ssh/id_rsa')
transport.connect(username='root', pkey=private_key) sftp = paramiko.SFTPClient.from_transport(transport)
# 将本地的 /tmp/local.py 上传到服务器,并重命名为 /tmp/remote.py
sftp.put('/tmp/local.py', '/tmp/remote.py')
# 从服务器的 /tmp/remote.py 下载文件到本地,并重命名为 /tmp/local.py
sftp.get('/tmp/remote.py', '/tmp/local.py') transport.close()
堡垒机的实现
1、在所有的服务器上创建账号,用户通过堡垒机管理该服务器
2、用户使用用户名密码登陆到堡垒机,并根据登陆的用户信息,在数据库中查找用户可管理的主机列表
3、用户选择服务器,并自动登陆
4、用户操作,并记录操作日志
在用户的 .bashrc 文件的最后一行执行该脚本,并在执行完成后退出shell。
echo -e "python3.5 demo.py\nlogout" .bashrc
# /user/bin/env python
__author__ = 'wenchong' """demo.py""" import getpass
import paramiko
import os
import sys
import socket
import logging from paramiko.py3compat import u # windows系统无 termios 模块
try:
import termios
import tty
has_termios = True
except ImportError:
has_termios = False # 成功登陆的用户名
USERNAME = None def log_write(msg):
"""记录日志"""
fh = logging.FileHandler(filename='log', mode='a', encoding='utf-8')
fmt = logging.Formatter(fmt='%(asctime)s - {} - %(name)s - %(message)s'.format(USERNAME))
fh.setFormatter(fmt)
logger = logging.Logger("Command", level=logging.DEBUG)
logger.addHandler(fh)
logger.info(msg) def interactive_shell(channel):
"""启动shell"""
if has_termios:
posix_shell(channel)
else:
windows_shell(channel) def login():
"""模拟登陆堡垒机"""
while True:
username = input("Username: ")
password = getpass.getpass("Password: ") if (username == 'wen' and password == '') or (username == 'chong' and password == ''):
global USERNAME
USERNAME = username
return username
else:
print("Username or Password is error. Please try again.") def select_host(username):
"""根据登陆的用户名列出主机并选择"""
hosts = {
'wen': [
'10.211.55.5',
'192.168.165.130',
],
'chong': [
'10.211.55.6',
'10.211.55.7',
]
} hosts_list = hosts.get(username) for index, host in enumerate(hosts_list, 1):
print(index, host) while True:
try:
user_input = input("Please select: ")
host = hosts_list[int(user_input) - 1]
return host
except KeyboardInterrupt as e:
exit("\n")
except Exception as e:
continue def posix_shell(channel):
"""启用 Linux shell"""
import select # 获取之前的 tty
fd = sys.stdin.fileno()
oldtty = termios.tcgetattr(fd) try:
tty.setraw(fd)
tty.setcbreak(fd) channel.settimeout(0.0) command_list = []
tab_flag = False while True:
r_list, w_list, e_list = select.select([channel, sys.stdin], [], [], 1)
if channel in r_list:
try:
x = u(channel.recv(1024))
if len(x) == 0:
print("\r\n*** EOF\r\n")
break # 输入 tab 后的返回值如果不换行则记录为命令[补全命令]
if tab_flag:
if not x.startswith("\r\n"):
command_list.append(x)
tab_flag = False sys.stdout.write(x)
sys.stdout.flush()
except socket.timeout:
pass if sys.stdin in r_list:
x = sys.stdin.read(1) if len(x) == 0:
break # 用户输入 tab 键
if x == "\t":
tab_flag = True
else:
command_list.append(x) if x == '\r':
command = ''.join(command_list)
# 发送的命令为空,即只有回车时忽略记录日志
if command != '\r':
log_write(command)
command_list.clear() channel.sendall(x) finally:
# 恢复之前的 tty
termios.tcsetattr(fd, termios.TCSADRAIN, oldtty) def windows_shell(channel):
"""windows shell, 未验证"""
import threading sys.stdout.write("Line-buffered terminal emulation. Press F6 or ^Z to send EOF.\r\n\r\n") def writeall(sock):
while True:
data = sock.recv(256)
if not data:
sys.stdout.write('\r\n*** EOF ***\r\n\r\n')
sys.stdout.flush()
break
sys.stdout.write(data)
sys.stdout.flush() writer = threading.Thread(target=writeall, args=(channel,))
writer.start() try:
while True:
d = sys.stdin.read(1)
if not d:
break
channel.send(d)
except EOFError:
# user hit ^Z or F6
pass def login_server(host):
"""通过 key 认证登陆到远程服务器"""
transport = paramiko.Transport((host, 22))
transport.start_client() default_path = os.path.join(os.environ['HOME'], '.ssh', 'id_rsa')
private_key = paramiko.RSAKey.from_private_key_file(default_path)
transport.auth_publickey(username='root', key=private_key) # 打开一个通道
channel = transport.open_session()
# 获取一个终端
channel.get_pty()
# 激活器
channel.invoke_shell() return channel def main():
username = login()
if username:
host = select_host(username) channel = login_server(host) interactive_shell(channel) if __name__ == '__main__': main()
堡垒机脚本 demo.py
paramiko模块实现堡垒机的更多相关文章
- python远程连接paramiko 模块和堡垒机实现
paramiko使用 paramiko模块是基于python实现了SSH2远程安全连接,支持认证和密钥方式,可以实现远程连接.命令执行.文件传输.中间SSH代理功能 安装 pip install pa ...
- 利用paramiko模块实现堡垒机+审计功能
paramiko模块是一个远程连接服务器,全真模拟ssh2协议的python模块,借助paramiko源码包中的demos目录下:demo.py和interactive.py两个模块实现简单的堡垒机+ ...
- Python自动化运维之19、Paramiko模块和堡垒机实战
paramiko模块 paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,值得一说的是,fabric和ansible内部的远程管理就是使用的paramiko来现实 ...
- Python----Paramiko模块和堡垒机实战
paramiko模块 paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,值得一说的是,fabric和ansible内部的远程管理就是使用的paramiko来现实 ...
- 审计系统---堡垒机python下ssh的使用
堡垒机python下ssh的使用 [堡垒机更多参考]http://www.cnblogs.com/alex3714/articles/5286889.html [paramiko的Demo实例]htt ...
- Pyhton开发堡垒机之paramiko模块
堡垒机前戏 开发堡垒机之前,先来学习Python的paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作 SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: + ...
- 堡垒机--paramiko模块
做堡垒机之前,来了解一下paramiko模块. 实际上底层封装的SSH. SSHclient(1) import paramiko #实例化一个ssh ssh = paramiko.SSHClient ...
- python2.0 s12 day8 _ 堡垒机前戏paramiko模块
堡垒机前戏 开发堡垒机之前,先来学习Python的paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作 paramiko模块是做主机管理的,他模拟了一个ssh. 有两种形式连接形式, ...
- 堡垒机初识--paramiko模块
一.paramiko模块 Python的paramiko模块基于SSH用于连接远程服务器并执行相关的操作. 1.1 在windows上安装paramiko模块 测试环境: win10 , python ...
随机推荐
- LINUX下mysql的大小写是否区分设置 转
一.Linux中MySQL大小写详情:1.数据库名严格区分大小写2.表名严格区分大小写的3.表的别名严格区分大小写4.变量名严格区分大小写5.列名在所有的情况下均忽略大小写6.列的别名在所有的情况下均 ...
- [置顶] 第二届微软CRM交流年会
第二届微软CRM交流会将在12月14日举行,亲们要是感兴趣可以查看下面的活动详情.Jeff也是第一次参加这类活动,作为本次活动的嘉宾我为大家带来一个挺有意思的分享主题<Dynamics CRM ...
- mongodb基本操作及存储图片显示方案
先介绍下mongodb的基本操作及使用 第一部:开启安全性验证 如果需要给MongoDB数据库使用安全验证,则需要用--auth开启安全性检查,则只有数据库认证的用户才能执行读写操作,开户安全性检查, ...
- shell脚本实现检測回文字符串
全部回文字的结构特征例如以下: 假设字符数是偶数,那么它在结构上表现为:一个字符序列连着还有一个字符同样但次序恰好相反的字符序列. 假设字符数为奇数,那么它在结构上表现为:一个字符序列连着还有一个字符 ...
- linux系统编程:进程间通信-mmap
进程间通信-mmap #include <sys/mman.h> void *mmap(void *addr, size_t length, int prot, int flags, in ...
- Android - 封装Fragment不依赖于Activity
封装Fragment不依赖于Activity 本文地址:http://blog.csdn.net/caroline_wendy Fragment直接托管activity的intent会破坏Fragme ...
- Maven tomcat插件配置和使用
pom.xml组态 <build> <plugins> <plugin> <groupId>org ...
- Android(java)学习笔记196:Android中Menu的使用(静态和动态)
1.使用xml定义Menu(静态方法) 菜单资源文件必须放在res/menu目录中.菜单资源文件必须使用<menu>标签作为根节点.除了<menu>标签外,还有另外两个标签用于 ...
- 基于bootstrap的datetimepicker插件
1.当时使用的资源地址:http://www.bootcss.com/p/bootstrap-datetimepicker/ 2.如何让时间只显示到日期,不显示具体时刻 控制显示精度的是datetim ...
- Android界面的View以及ViewGroup的区别
因为这个问题会经常成为面试的热点,所以我们来谈谈View以及ViewGroup的区别. 先看看View及ViewGroup类关系 Android View和ViewGroup从组成架构上看,似乎 ...