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.transport16 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.py22 # sftp.put('/tmp/location.py', '/tmp/test.py')23 # 将remove_path 下载到本地 local_path24 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.py29 # sftp.put('/tmp/location.py', '/tmp/test.py')30 # 将remove_path 下载到本地 local_path31 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 = username10 self.pwd = pwd11 self.__k = None12 13 def run(self):14 self.connect()15 pass16 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 = transport22 23 def close(self):24 self.__transport.close()25 26 def cmd(self, command):27 ssh = paramiko.SSHClient()28 ssh._transport = self.__transport29 # 执行命令30 stdin, stdout, stderr = ssh.exec_command(command)31 # 获取命令结果32 result = stdout.read()33 return result34 35 def upload(self,local_path, target_path):36 # 连接,上传37 sftp = paramiko.SFTPClient.from_transport(self.__transport)38 # 将location.py 上传至服务器 /tmp/test.py39 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两部分
1 2 3 4 5oldboy 6 7 8 9 10 11 12 1314密 码:15性别:1619男17女1820 爱好:2125男22女23海涛24上传:2627 城市:28 34 505152 简介:53 5455 56
1 2 3 4 542 43oldboy 6 7 8 9 10
tr、ul、ol、dl标签
1 2 3 4 5老男孩 6 7 8
序号 | 12用户名 | 13密码 | 14操作 | 15
---|---|---|---|
1 | 2021 | 24 | 25 删除|编辑26 | 27
- 33
- 小刘 34
- 小李 35
- 小张 36
- 38
- 小张 39
- 小李 40
- 张三 41
- 43
- 北京 44
- 丰台 45
- 海淀 46
- 朝阳 47
序号 | 52用户名 | 53密码 | 54|
---|---|---|---|
1 | 59abc | 60123123 | 6162 删除|编辑63 | 64
2 | 67abd | 68123456 | 69|
3 | 72abe | 73123789 | 74|
abf | 78123891 | 79
常用标签详解:
head部分:
meta定义编码、关键字、描述等信息
1 2 3oldboy 4 5 6 7 8 9
body部分:
<div></div> 块级标签,占整行
<a></a>和<span></span> 行内/内敛标签,有多少占多少
<a><a></a> 代表<a>
<p></p> 表示段落
<br> 表示换行
<h1>test</h1> 字体显示又粗又大
<h6>test</h6> 字体又细又小
<a>标签用作跳转和锚点用,代码如下:
input标签 可以输入数据:
1用户名:2密 码:
type = radio 圆形,可选中
type = checkbox 四方框,可选中
1女2海涛3上传:45 6 7用户名:
<select></select>下拉框
multiple size="10" 显示前10个数据
form标签 包裹内容数据,所有要提交的数据都要有name
table标签,用于表单制作
<th> <td>分别代表表头和内容中的一列,镶嵌在tr中
<tr>代表一行
rowspan=2 占用两行
colspan =2占用两列
fieldset用法:
1
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