Python之Paramiko、前端之html学习_Day14

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
View Code

堡垒机流程

  1. 管理员为用户在服务器上创建账号(将公钥放置服务器,或者使用用户名密码)
  2. 用户登陆堡垒机,输入堡垒机用户名密码,现实当前用户管理的服务器列表
  3. 用户选择服务器,并自动登陆
  4. 执行操作并同时将用户操作记录

完整版

  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('
*** EOF
')
 40                         break
 41                     # 如果用户上一次点击的是tab键,则获取返回的内容写入在记录中
 42                     if flag:
 43                         if x.startswith('
'):
 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 == '	':
 59                     flag = True
 60                 else:
 61                     # 未点击TAB键,则将每个操作字符记录添加到列表中,以便之后写入文件
 62                     temp_list.append(x)
 63 
 64                 # 如果用户敲回车,则将操作记录写入文件
 65                 if x == '
':
 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&nbspe</a>
<a>&lt;a&gt;</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>
View Code

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>&lt;a&gt;</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>
View Code

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>
View Code

<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 定义高度
100px 定义宽度
background-color: #5e4b7c; 背景颜色
color: white; 字体颜色
line-height: 48px; 文本在48px中居中
text-align: left 调整当前文本在福标签中的位置
display: inline;
display: block;
display: inline-block
原文地址:https://www.cnblogs.com/liumj0305/p/6306090.html