通过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模块实现堡垒机的更多相关文章

  1. python远程连接paramiko 模块和堡垒机实现

    paramiko使用 paramiko模块是基于python实现了SSH2远程安全连接,支持认证和密钥方式,可以实现远程连接.命令执行.文件传输.中间SSH代理功能 安装 pip install pa ...

  2. 利用paramiko模块实现堡垒机+审计功能

    paramiko模块是一个远程连接服务器,全真模拟ssh2协议的python模块,借助paramiko源码包中的demos目录下:demo.py和interactive.py两个模块实现简单的堡垒机+ ...

  3. Python自动化运维之19、Paramiko模块和堡垒机实战

    paramiko模块 paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,值得一说的是,fabric和ansible内部的远程管理就是使用的paramiko来现实 ...

  4. Python----Paramiko模块和堡垒机实战

    paramiko模块 paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,值得一说的是,fabric和ansible内部的远程管理就是使用的paramiko来现实 ...

  5. 审计系统---堡垒机python下ssh的使用

    堡垒机python下ssh的使用 [堡垒机更多参考]http://www.cnblogs.com/alex3714/articles/5286889.html [paramiko的Demo实例]htt ...

  6. Pyhton开发堡垒机之paramiko模块

    堡垒机前戏 开发堡垒机之前,先来学习Python的paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作 SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: + ...

  7. 堡垒机--paramiko模块

    做堡垒机之前,来了解一下paramiko模块. 实际上底层封装的SSH. SSHclient(1) import paramiko #实例化一个ssh ssh = paramiko.SSHClient ...

  8. python2.0 s12 day8 _ 堡垒机前戏paramiko模块

    堡垒机前戏 开发堡垒机之前,先来学习Python的paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作 paramiko模块是做主机管理的,他模拟了一个ssh. 有两种形式连接形式, ...

  9. 堡垒机初识--paramiko模块

    一.paramiko模块 Python的paramiko模块基于SSH用于连接远程服务器并执行相关的操作. 1.1 在windows上安装paramiko模块 测试环境: win10 , python ...

随机推荐

  1. Webform Repeater的灵活运用

    案例:模拟购物列表 封装实体类:   数据访问类: 用Repeater展示: 1 <%@ Page Language="C#" AutoEventWireup="t ...

  2. 把谷歌等webkit内核浏览器变为输入文本编辑器的方法

    只需要在地址栏输入 data:text/html, <html contenteditable> 回车后即可看到效果

  3. CSS3实现兼容性的渐变背景效果

    一.CSS3实现兼容性渐变背景效果,兼容FF.chrome.IE 渐变效果,现在主流的浏览器FF.Chrome.Opera.IE8+都可以通过带有私有前缀的CSS3属性来轻松滴实现渐变效果,IE7及以 ...

  4. 英文Ubantu系统安装中文输入法

    以前都是安装的中文Ubantu,但是有时候用命令行的时候中文识别不好,会出现错误,所以这次安装了英文版,但是安装后发现输入法不好用,于是就要自己安装输入法. 安装环境为Ubantu13.04 1.卸载 ...

  5. hdu4488 Faulhaber’s Triangle(模拟题)

    Faulhaber’s Triangle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  6. hibernate中持久化对象的生命周期(三态:自由态,持久态,游离态 之间的转换)

    三态的基本概念: 1,  暂时状态(Transient):也叫自由态,仅仅存在于内存中,而在数据库中没有对应数据.用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫暂时对象 ...

  7. tty、pty、pts等(小记)

    http://blog.csdn.net/dbzhang800/article/details/6939742 1> tty(终端设备的统称):tty一词源于Teletypes,或者telety ...

  8. 高性能爬虫为什么使用定制DNS客户端?

    DNS 解析是高性能网络爬虫的瓶颈,主要是因为: 1. 由于域名服务的分布式的特性,DNS解析可能需要多次的请求转发,有时需要几秒甚至更长的时间来解析出相应的IP 地址. 2. 现有的标准库对DNS解 ...

  9. Android开发之显示通知

    Toast类可以用来显示消息给用户,虽然它很方便,但是有不能持久.它只是在屏幕上显示几秒后就自动消失掉了.对于重要的信息或消息,要使用更加持久的方法.这种情形下,就应当使用通知,即使用Notifica ...

  10. Android切换页面--setContentView

    setContentView 一般切换页面,通过Intent,startActivity可以实现,但系统创建Activity是非常耗时的,如果对切换画面时间有要求,只能用setContentView在 ...