Paramiko
paramiko模块,基于SSH用于连接远程服务器并执行相关操作。.
远程连接服务器执行上传下载
1 import paramiko 2 class SSH: 3 def __init__(self, host,port,user,pwd): 4 self.host = host 5 self.port = port 6 self.user = user 7 self.pwd = pwd 8 self.transport = None 9 def connect(self): 10 self.transport = paramiko.Transport((self.host, self.port,)) 11 self.transport.connect(username=self.user, password=self.pwd) 12 13 def cmd(self,cmd): 14 ssh = paramiko.SSHClient() 15 ssh._transport = self.transport 16 stdin, stdout, stderr = ssh.exec_command(cmd) 17 return stdout.read() 18 19 def download(self,server_path,local_path): 20 sftp = paramiko.SFTPClient.from_transport(self.transport) 21 # 将location.py 上传至服务器 /tmp/test.py 22 # sftp.put('/tmp/location.py', '/tmp/test.py') 23 # 将remove_path 下载到本地 local_path 24 sftp.get(server_path, local_path) 25 26 def upload(self,server_path,local_path): 27 sftp = paramiko.SFTPClient.from_transport(self.transport) 28 # 将location.py 上传至服务器 /tmp/test.py 29 # sftp.put('/tmp/location.py', '/tmp/test.py') 30 # 将remove_path 下载到本地 local_path 31 sftp.put(local_path, server_path) 32 33 34 def close(self): 35 self.transport.close() 36 37 obj = SSH('192.168.100.1',22,'root','123') 38 obj.connect() 39 # v = obj.cmd('ls') 40 v = obj.cmd('df -h') 41 print(v) 42 obj.close()
1 import paramiko 2 import uuid 3 4 class SSHConnection(object): 5 6 def __init__(self, host='192.168.11.61', port=22, username='alex',pwd='alex3714'): 7 self.host = host 8 self.port = port 9 self.username = username 10 self.pwd = pwd 11 self.__k = None 12 13 def run(self): 14 self.connect() 15 pass 16 self.close() 17 18 def connect(self): 19 transport = paramiko.Transport((self.host,self.port)) 20 transport.connect(username=self.username,password=self.pwd) 21 self.__transport = transport 22 23 def close(self): 24 self.__transport.close() 25 26 def cmd(self, command): 27 ssh = paramiko.SSHClient() 28 ssh._transport = self.__transport 29 # 执行命令 30 stdin, stdout, stderr = ssh.exec_command(command) 31 # 获取命令结果 32 result = stdout.read() 33 return result 34 35 def upload(self,local_path, target_path): 36 # 连接,上传 37 sftp = paramiko.SFTPClient.from_transport(self.__transport) 38 # 将location.py 上传至服务器 /tmp/test.py 39 sftp.put(local_path, target_path) 40 41 ssh = SSHConnection() 42 ssh.connect() 43 r1 = ssh.cmd('df') 44 ssh.upload('s2.py', "/home/alex/s7.py") 45 ssh.close() 46 47 Demo
堡垒机流程
- 管理员为用户在服务器上创建账号(将公钥放置服务器,或者使用用户名密码)
- 用户登陆堡垒机,输入堡垒机用户名密码,现实当前用户管理的服务器列表
- 用户选择服务器,并自动登陆
- 执行操作并同时将用户操作记录
完整版
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 import paramiko 4 import sys 5 import os 6 import socket 7 import getpass 8 import termios 9 import tty 10 import select 11 from paramiko.py3compat import u 12 13 14 def interactive_shell(chan): 15 # 获取原tty属性 16 oldtty = termios.tcgetattr(sys.stdin) 17 try: 18 # 为tty设置新属性 19 # 默认当前tty设备属性: 20 # 输入一行回车,执行 21 # CTRL+C 进程退出,遇到特殊字符,特殊处理。 22 23 # 这是为原始模式,不认识所有特殊符号 24 # 放置特殊字符应用在当前终端,如此设置,将所有的用户输入均发送到远程服务器 25 tty.setraw(sys.stdin.fileno()) 26 tty.setcbreak(sys.stdin.fileno()) 27 chan.settimeout(0.0) 28 29 log = open('handle.log', 'a+', encoding='utf-8') 30 flag = False 31 temp_list = [] 32 33 while True: 34 r, w, e = select.select([chan, sys.stdin], [], []) 35 if chan in r: 36 try: 37 x = u(chan.recv(1024)) 38 if len(x) == 0: 39 sys.stdout.write('\r\n*** EOF\r\n') 40 break 41 # 如果用户上一次点击的是tab键,则获取返回的内容写入在记录中 42 if flag: 43 if x.startswith('\r\n'): 44 pass 45 else: 46 temp_list.append(x) 47 flag = False 48 sys.stdout.write(x) 49 sys.stdout.flush() 50 except socket.timeout: 51 pass 52 if sys.stdin in r: 53 # 读取用户在终端数据每一个字符 54 x = sys.stdin.read(1) 55 if len(x) == 0: 56 break 57 # 如果用户点击TAB键 58 if x == '\t': 59 flag = True 60 else: 61 # 未点击TAB键,则将每个操作字符记录添加到列表中,以便之后写入文件 62 temp_list.append(x) 63 64 # 如果用户敲回车,则将操作记录写入文件 65 if x == '\r': 66 log.write(''.join(temp_list)) 67 log.flush() 68 temp_list.clear() 69 chan.send(x) 70 71 finally: 72 # 重新设置终端属性 73 termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty) 74 75 76 def run(): 77 db_dict = { 78 'c1.salt.com': { 79 'root': {'user': 'root', 'auth': 'r', "cert": 'key路径'}, 80 'alex': {'user': 'alex', 'auth': 'p', "cert": '密码'}, 81 }, 82 'c2.salt.com': { 83 'root': {'user': 'root', 'auth': 'r', "cert": 'key路径'}, 84 'alex': {'user': 'alex', 'auth': 'p', "cert": '密码'}, 85 }, 86 87 } 88 89 for row in db_dict.keys(): 90 print(row) 91 92 hostname = input('请选择主机: ') 93 tran = paramiko.Transport((hostname, 22,)) 94 tran.start_client() 95 96 for item in db_dict[hostname].keys(): 97 print(item) 98 99 username = input('请输入用户: ') 100 101 user_dict = db_dict[hostname][username] 102 if username['auth'] == 'r': 103 key = paramiko.RSAKey.from_private_key_file(user_dict['cert']) 104 tran.auth_publickey(username, key) 105 else: 106 pw = user_dict['cert'] 107 tran.auth_password(username, pw) 108 109 # 打开一个通道 110 chan = tran.open_session() 111 # 获取一个终端 112 chan.get_pty() 113 # 激活器 114 chan.invoke_shell() 115 116 interactive_shell(chan) 117 118 chan.close() 119 tran.close() 120 121 122 if __name__ == '__main__': 123 run() 124 125 提示用户选择主机和用户(记录操作日志)
HTML
HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言(标记)。相当于定义统一的一套规则,大家都来遵守他,这样就可以让浏览器根据标记语言的规则去解释它。
浏览器负责将标签翻译成用户“看得懂”的格式,呈现给用户!
Doctype告诉浏览器使用什么样的html或xhtml规范来解析html文档, dtd文件则包含了标记、attributes 、properties、约束规则。
html包含head和body两部分
<!DOCTYPE html> <html lang="en"> <!-- 标签属性--> <head> <meta http-equiv="content-type" content="text/html;charset=UTF-8"> <title>oldboy</title> <!--meta http-equiv="Referer" content="5"--> <!--30s刷新一次--> <meta http-equiv="Referer" Content="5; Url=http://www.baidu.com"/> <meta name="keywords" content="星际2,老男孩,专访"> <meta name="description" content="汽车之家"> <!--描述--> <meta http-equiv="X-UA-COMPATIBLE" content="IE=edge"/> <!--如果用ie打开告诉ie用最新的模式渲染--> </head> <body style="margin: 0"> <!--使div标签填充顶部--> <!--块级标签;div--> <div style="height: 48px;background-color: #5e5e5e">asddd</div> <!--行内/内敛标签;a--> <a style="background-color: green">sdg e</a> <a><a></a> <p>abcd<br>defghij</p> <!--p表示段落,br表示换行--> <h1>大白</h1> <h6>小白</h6> <!--a标签用作跳转和锚点--> <a href="http://www.baidu.com" target="_blank">百度</a> <a href="#i1">第一章</a> <a href="#i2">第二章</a> <a href="#i3">第三章</a> <!--div块级标签 白板--> <div id="i1" style="background-color:green;height: 90px;"></div> <div id="i2" style="background-color:chartreuse;height: 80px;"></div> <div id="i3" style="background-color:red;height: 70px;"></div>
1 <!DOCTYPE html> 2 <html lang="en"> <!-- 标签属性--> 3 <head> 4 <meta http-equiv="content-type" content="text/html;charset=UTF-8"> 5 <title>oldboy</title> 6 <!--meta http-equiv="Referer" content="5"--> <!--30s刷新一次--> 7 <meta http-equiv="Referer" Content="5; Url=http://www.baidu.com"/> 8 <meta name="keywords" content="星际2,老男孩,专访"> 9 <meta name="description" content="汽车之家"> <!--描述--> 10 <meta http-equiv="X-UA-COMPATIBLE" content="IE=edge"/> <!--如果用ie打开告诉ie用最新的模式渲染--> 11 </head> 12 <body> 13 <div><label for="user">用户名:</label><input id="user" type="text"/></div> 14 <div>密 码:<input type="password"/></div> 15 <div>性别: 16 <div>男<input type="radio" name="geasf"/></div> 17 <div>女<input type="radio" name="geasf"/></div> 18 </div> 19 <div> 20 爱好: 21 <div>男<input type="checkbox"/></div> 22 <div>女<input type="checkbox"/></div> 23 <div>海涛<input type="checkbox"/></div> <!--checkbox复选框--> 24 </div> 25 <div>上传:<input type="file"/></div> 26 <div> 27 城市: 28 <select> <!--下拉框--> 29 <option>上海</option> 30 <option>北京</option> 31 <option>河南</option> 32 <option>沙河</option> 33 </select> 34 <select multiple size="10"> <!--下拉框--> 35 <optgroup label="河南"> 36 <option>郑州</option> 37 <option>商丘</option> 38 <option>周口</option> 39 </optgroup> 40 <optgroup label="河北"> 41 <option>石家庄</option> 42 <option>唐山</option> 43 <option>保定</option> 44 </optgroup> 45 <option>上海</option> 46 <option>beijing</option> 47 <option>nanjing</option> 48 <option>沙河</option> 49 </select> 50 </div> 51 <div> 52 简介: 53 <textarea></textarea> 54 </div> 55 </body> 56 </html>
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>oldboy</title> 6 </head> 7 <body style="margin: 0"> 8 <div style="height: 48px;background-color: #5e4b7c;"></div> 9 <!--form包裹内容数据--> 10 <form action="http://192.168.12.90:8000/index/" method="POST" enctype="multipart/form-data"> 11 <h1>用户登陆</h1> 12 <input type="file" name="upload"/> 13 <!--value指定默认用户名,placeholder提示字符--> 14 <!--<p>用户名: <input type="text" name="username" value="root"/></p>--> 15 <p>用户名: <input type="text" name="username" placeholder="pls int user"/></p> 16 <p>密码: <input type="password" name="pwd"/></p> 17 <dev>性别: 18 <div>男<input type="radio" name="g" value="1" checked="checked"/></div> 19 <div>女<input type="radio" name="g" value="0"/></div> 20 </dev> 21 <div> 22 爱好:男 <input type="checkbox" name="hobby" value="11"/> 23 女 <input type="checkbox" name="hobby" value="22"/> 24 海涛 <input type="checkbox" name="hobby" value="haitao"/> 25 </div> 26 <select name="city1"> 27 <option value="88">上海</option> 28 <option value="89">北京</option> 29 <option value="uu">河南</option> 30 </select> 31 <select name="city2" multiple> 32 <option value="uu" selected="selected">河南</option> 33 <option value="uu" selected="selected">河北</option> 34 <option value="12">沙河</option> 35 36 </select> 37 <textarea name="memo">来杯咖啡.....</textarea> 38 <input type="button" value="按钮"/> 39 <input type="submit" value="提交"/> 40 <input type="reset" value="重置"/> 41 </form> 42 </body> 43 </html>
tr、ul、ol、dl标签
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>老男孩</title> 6 </head> 7 <body> 8 <table border="1"> 9 <thead> 10 <tr> 11 <th>序号</th> 12 <th>用户名</th> 13 <th>密码</th> 14 <th>操作</th> 15 </tr> 16 </thead> 17 <tbody> 18 <tr> 19 <td>1</td> 20 <td><input type="text"/></td> 21 <td><select> 22 <option>上海</option> 23 </select></td> 24 <td> 25 <a href="#">删除</a>|<a href="http://www.baidu.com">编辑</a> 26 </td> 27 </tr> 28 </tbody> 29 </table> 30 <!--图片路径--,如果图片没有,显示我是图片--> 31 <img src="img/1.png" alt="我是图片" title="把鼠标拿走"> 32 <ul> 33 <li>小刘</li> 34 <li>小李</li> 35 <li>小张</li> 36 </ul> 37 <ol> 38 <li>小张</li> 39 <li>小李</li> 40 <li>张三</li> 41 </ol> 42 <dl> 43 <dt>北京</dt> <!--标题--> 44 <dd>丰台</dd> <!--内容--> 45 <dd>海淀</dd> 46 <dd>朝阳</dd> 47 </dl> 48 <table border="1"><!--表--> 49 <thead><!--表头--> 50 <tr> 51 <th>序号</th> <!--td代表一列--> 52 <th>用户名</th> <!--td代表一列--> 53 <th>密码</th> <!--td代表一列--> 54 </tr> <!--tr代表一行--> 55 </thead> 56 <tbody> 57 <tr> 58 <td>1</td> 59 <td>abc</td> 60 <td>123123</td> 61 <td> 62 <a href="#">删除</a>|<a href="http://www.baidu.com">编辑</a> 63 </td> 64 </tr> 65 <tr> 66 <td>2</td> 67 <td colspan="2">abd</td> 68 <td>123456</td> 69 </tr> 70 <tr> 71 <td rowspan="2">3</td> 72 <td>abe</td> 73 <td>123789</td> 74 </tr> 75 <tr> 76 77 <td>abf</td> 78 <td>123891</td> 79 </tr> 80 </tbody> 81 </table> 82 </body> 83 </html>
常用标签详解:
head部分:
meta定义编码、关键字、描述等信息
1 <head> 2 <meta http-equiv="content-type" content="text/html;charset=UTF-8"><!--编码--> 3 <title>oldboy</title> 4 <!--meta http-equiv="Referer" content="5"--> <!--5s刷新一次,跳转到百度--> 5 <meta http-equiv="Referer" Content="5; Url=http://www.baidu.com"/> 6 <meta name="keywords" content="星际2,老男孩,专访"> <!--关键字--> 7 <meta name="description" content="汽车之家"> <!--描述--> 8 <meta http-equiv="X-UA-COMPATIBLE" content="IE=edge"/> <!--如果用ie打开告诉ie用最新的模式渲染--> 9 </head>
body部分:
<div></div> 块级标签,占整行
<a></a>和<span></span> 行内/内敛标签,有多少占多少
<a><a></a> 代表<a>
<p></p> 表示段落
<br> 表示换行
<h1>test</h1> 字体显示又粗又大
<h6>test</h6> 字体又细又小
<a>标签用作跳转和锚点用,代码如下:
1 <!--a标签用作跳转和锚点--> 2 <a href="http://www.baidu.com" target="_blank">百度</a><!--自动跳转到百度,并单独新打开一个页面--> 3 <a href="#i1">第一章</a> 4 <a href="#i2">第二章</a> 5 <a href="#i3">第三章</a> 6 <div id="i1" style="background-color:green;height: 90px;"></div> 7 <div id="i2" style="background-color:chartreuse;height: 80px;"></div> 8 <div id="i3" style="background-color:red;height: 70px;"></div>
input标签 可以输入数据:
1 <div>用户名:<input type="test"/></div> <!--输入用户名--> 2 <div>密 码:<input type="password"/></div><!--输入密码,密文-->
type = radio 圆形,可选中
type = checkbox 四方框,可选中
<input type="button" value="按钮"/>
<input type="submit" value="提交"/> <!--提交form表单里面的数据-->
<input type="reset" value="重置"/>
1 <div>女<input type="radio" name="geasf"/></div> <!--圆形,复选框,name相同的情况下是互斥,只能单选--> 2 <div>海涛<input type="checkbox"/></div> <!--checkbox四方形,复选框--> 3 <div>上传:<input type="file"/></div> <!--可上传文件--> 4 <div><label for="user">用户名:</label><input id="user" type="text"/></div><!--label用来聚焦,点击用户名光标自动到输入框---> 5 <!--value指定默认用户名,placeholder提示字符--> 6 <!--<p>用户名: <input type="text" name="username" value="root"/></p>--> 7 <p>用户名: <input type="text" name="username" placeholder="pls int user"/></p>
<select></select>下拉框
multiple size="10" 显示前10个数据
<optgroup label="河北"> 分级菜单
<textarea name="memo">来杯咖啡.....</textarea> <!--简介,提示输入字符..-->
form标签 包裹内容数据,所有要提交的数据都要有name
<form action="http://192.168.12.90:8000/index/" method="POST" enctype="multipart/form-data"> <!--以post形式将from里面的数据提交到该地址-->
table标签,用于表单制作
<th> <td>分别代表表头和内容中的一列,镶嵌在tr中
<tr>代表一行
rowspan=2 占用两行
colspan =2占用两列
fieldset用法:
1 <fieldset> 2 <legend>登录</legend> <!--边框---> 3 <p>用户名:</p> 4 <p>密码:</p> 5 </fieldset>
css相关:
CSS前夕:
height: 48px 定义高度
width: 100px 定义宽度
background-color: #5e4b7c; 背景颜色
color: white; 字体颜色
line-height: 48px; 文本在48px中居中
text-align: left 调整当前文本在福标签中的位置
display: inline;
display: block;
display: inline-block