Python之路【第八篇】:堡壘機實例以及數據庫操作

Python之路【第八篇】:堡壘機實例以及數據庫操作

堡壘機前戲

開發堡壘機之前,先來學習Python的paramiko模塊,該模塊機遇SSH用于連接遠程服務器并執行相關操作

SSHClient

用于連接遠程服務器并執行基本命令

基于用戶名密碼連接:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import?paramiko
??
# 創建SSH對象
ssh?=?paramiko.SSHClient()
# 允許連接不在know_hosts文件中的主機
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 連接服務器
ssh.connect(hostname='c1.salt.com', port=22, username='wupeiqi', password='123')
??
# 執行命令
stdin, stdout, stderr?=?ssh.exec_command('df')
# 獲取命令結果
result?=?stdout.read()
??
# 關閉連接
ssh.close()
復制代碼
import paramikotransport = paramiko.Transport(('hostname', 22))
transport.connect(username='wupeiqi', password='123')ssh = paramiko.SSHClient()
ssh._transport = transportstdin, stdout, stderr = ssh.exec_command('df')
print stdout.read()transport.close()
復制代碼

基于公鑰密鑰連接:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import?paramiko
private_key?=?paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa')
# 創建SSH對象
ssh?=?paramiko.SSHClient()
# 允許連接不在know_hosts文件中的主機
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 連接服務器
ssh.connect(hostname='c1.salt.com', port=22, username='wupeiqi', key=private_key)
# 執行命令
stdin, stdout, stderr?=?ssh.exec_command('df')
# 獲取命令結果
result?=?stdout.read()
# 關閉連接
ssh.close()
復制代碼
import paramikoprivate_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa')transport = paramiko.Transport(('hostname', 22))
transport.connect(username='wupeiqi', pkey=private_key)ssh = paramiko.SSHClient()
ssh._transport = transportstdin, stdout, stderr = ssh.exec_command('df')transport.close()
復制代碼

SFTPClient

用于連接遠程服務器并執行上傳下載

基于用戶名密碼上傳下載

1
2
3
4
5
6
7
8
9
10
11
12
import?paramiko
transport?=?paramiko.Transport(('hostname',22))
transport.connect(username='wupeiqi',password='123')
sftp?=?paramiko.SFTPClient.from_transport(transport)
# 將location.py 上傳至服務器 /tmp/test.py
sftp.put('/tmp/location.py',?'/tmp/test.py')
# 將remove_path 下載到本地 local_path
sftp.get('remove_path',?'local_path')
transport.close()

基于公鑰密鑰上傳下載

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import?paramiko
private_key?=?paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa')
transport?=?paramiko.Transport(('hostname',?22))
transport.connect(username='wupeiqi', pkey=private_key )
sftp?=?paramiko.SFTPClient.from_transport(transport)
# 將location.py 上傳至服務器 /tmp/test.py
sftp.put('/tmp/location.py',?'/tmp/test.py')
# 將remove_path 下載到本地 local_path
sftp.get('remove_path',?'local_path')
transport.close()
復制代碼
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import paramiko
import uuidclass Haproxy(object):def __init__(self):self.host = '172.16.103.191'self.port = 22self.username = 'wupeiqi'self.pwd = '123'self.__k = Nonedef create_file(self):file_name = str(uuid.uuid4())with open(file_name,'w') as f:f.write('sb')return file_namedef run(self):self.connect()self.upload()self.rename()self.close()def connect(self):transport = paramiko.Transport((self.host,self.port))transport.connect(username=self.username,password=self.pwd)self.__transport = transportdef close(self):self.__transport.close()def upload(self):# 連接,上傳file_name = self.create_file()sftp = paramiko.SFTPClient.from_transport(self.__transport)# 將location.py 上傳至服務器 /tmp/test.pysftp.put(file_name, '/home/wupeiqi/tttttttttttt.py')def rename(self):ssh = paramiko.SSHClient()ssh._transport = self.__transport# 執行命令stdin, stdout, stderr = ssh.exec_command('mv /home/wupeiqi/tttttttttttt.py /home/wupeiqi/ooooooooo.py')# 獲取命令結果result = stdout.read()ha = Haproxy()
ha.run()
復制代碼

堡壘機的實現?

實現思路:

堡壘機執行流程:

  1. 管理員為用戶在服務器上創建賬號(將公鑰放置服務器,或者使用用戶名密碼)
  2. 用戶登陸堡壘機,輸入堡壘機用戶名密碼,現實當前用戶管理的服務器列表
  3. 用戶選擇服務器,并自動登陸
  4. 執行操作并同時將用戶操作記錄

注:配置.brashrc實現ssh登陸后自動執行腳本,如:/usr/bin/python /home/wupeiqi/menu.py

實現過程

步驟一,實現用戶登陸

1
2
3
4
5
6
7
8
import?getpass
user?=?raw_input('username:')
pwd?=?getpass.getpass('password')
if?user?==?'alex'?and?pwd?==?'123':
????print?'登陸成功'
else:
????print?'登陸失敗'

步驟二,根據用戶獲取相關服務器列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
dic?=?{
????'alex': [
????????'172.16.103.189',
????????'c10.puppet.com',
????????'c11.puppet.com',
????],
????'eric': [
????????'c100.puppet.com',
????]
}
host_list?=?dic['alex']
print?'please select:'
for?index, item?in?enumerate(host_list,?1):
????print?index, item
inp?=?raw_input('your select (No):')
inp?=?int(inp)
hostname?=?host_list[inp-1]
port?=?22

步驟三,根據用戶名、私鑰登陸服務器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
tran?=?paramiko.Transport((hostname, port,))
tran.start_client()
default_path?=?os.path.join(os.environ['HOME'],?'.ssh',?'id_rsa')
key?=?paramiko.RSAKey.from_private_key_file(default_path)
tran.auth_publickey('wupeiqi', key)
# 打開一個通道
chan?=?tran.open_session()
# 獲取一個終端
chan.get_pty()
# 激活器
chan.invoke_shell()
#########
# 利用sys.stdin,肆意妄為執行操作
# 用戶在終端輸入內容,并將內容發送至遠程服務器
# 遠程服務器執行命令,并將結果返回
# 用戶終端顯示內容
#########
chan.close()
tran.close()
復制代碼
while True:# 監視用戶輸入和服務器返回數據# sys.stdin 處理用戶輸入# chan 是之前創建的通道,用于接收服務器返回信息readable, writeable, error = select.select([chan, sys.stdin, ],[],[],1)if chan in readable:try:x = chan.recv(1024)if len(x) == 0:print '\r\n*** EOF\r\n',breaksys.stdout.write(x)sys.stdout.flush()except socket.timeout:passif sys.stdin in readable:inp = sys.stdin.readline()chan.sendall(inp)
復制代碼
復制代碼
# 獲取原tty屬性
oldtty = termios.tcgetattr(sys.stdin)
try:# 為tty設置新屬性# 默認當前tty設備屬性:#   輸入一行回車,執行#   CTRL+C 進程退出,遇到特殊字符,特殊處理。# 這是為原始模式,不認識所有特殊符號# 放置特殊字符應用在當前終端,如此設置,將所有的用戶輸入均發送到遠程服務器tty.setraw(sys.stdin.fileno())chan.settimeout(0.0)while True:# 監視 用戶輸入 和 遠程服務器返回數據(socket)# 阻塞,直到句柄可讀r, w, e = select.select([chan, sys.stdin], [], [], 1)if chan in r:try:x = chan.recv(1024)if len(x) == 0:print '\r\n*** EOF\r\n',breaksys.stdout.write(x)sys.stdout.flush()except socket.timeout:passif sys.stdin in r:x = sys.stdin.read(1)if len(x) == 0:breakchan.send(x)finally:# 重新設置終端屬性termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty)
復制代碼
復制代碼
def windows_shell(chan):import threadingsys.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()breaksys.stdout.write(data)sys.stdout.flush()writer = threading.Thread(target=writeall, args=(chan,))writer.start()try:while True:d = sys.stdin.read(1)if not d:breakchan.send(d)except EOFError:# user hit ^Z or F6pass
復制代碼

注:密碼驗證 t.auth_password(username, pw)

詳見:paramiko源碼demo

數據庫操作

Python 操作 Mysql 模塊的安裝

1
2
3
4
5
linux:
????yum install MySQL-python
window:
????http://files.cnblogs.com/files/wupeiqi/py-mysql-win.zip

SQL基本使用

1、數據庫操作

1
2
3
show databases;
use [databasename];
create database? [name];

2、數據表操作

1
2
3
4
5
6
7
8
9
10
show tables;
create table students
????(
????????id?int??not?null auto_increment primary key,
????????name char(8)?not?null,
????????sex char(4)?not?null,
????????age tinyint unsigned?not?null,
????????tel char(13) null default?"-"
????);
復制代碼
CREATE TABLE `wb_blog` ( `id` smallint(8) unsigned NOT NULL, `catid` smallint(5) unsigned NOT NULL DEFAULT '0', `title` varchar(80) NOT NULL DEFAULT '', `content` text NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `catename` (`catid`) 
) ; 
復制代碼

3、數據操作

1
2
3
4
5
6
7
insert into students(name,sex,age,tel) values('alex','man',18,'151515151')
delete?from?students where?id?=2;
update students?set?name?=?'sb'?where?id?=1;
select?*?from?students

4、其他

1
2
3
主鍵
外鍵
左右連接

Python MySQL API

一、插入數據

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import?MySQLdb
??
conn?=?MySQLdb.connect(host='127.0.0.1',user='root',passwd='1234',db='mydb')
??
cur?=?conn.cursor()
??
reCount?=?cur.execute('insert into UserInfo(Name,Address) values(%s,%s)',('alex','usa'))
# reCount = cur.execute('insert into UserInfo(Name,Address) values(%(id)s, %(name)s)',{'id':12345,'name':'wupeiqi'})
??
conn.commit()
??
cur.close()
conn.close()
??
print?reCount
復制代碼
import MySQLdbconn = MySQLdb.connect(host='127.0.0.1',user='root',passwd='1234',db='mydb')cur = conn.cursor()li =[('alex','usa'),('sb','usa'),
]
reCount = cur.executemany('insert into UserInfo(Name,Address) values(%s,%s)',li)conn.commit()
cur.close()
conn.close()print reCount
復制代碼

注意:cur.lastrowid

二、刪除數據

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import?MySQLdb
conn?=?MySQLdb.connect(host='127.0.0.1',user='root',passwd='1234',db='mydb')
cur?=?conn.cursor()
reCount?=?cur.execute('delete from UserInfo')
conn.commit()
cur.close()
conn.close()
print?reCount

三、修改數據

1
2
3
4
5
6
7
8
9
10
11
12
13
import?MySQLdb
conn?=?MySQLdb.connect(host='127.0.0.1',user='root',passwd='1234',db='mydb')
cur?=?conn.cursor()
reCount?=?cur.execute('update UserInfo set Name = %s',('alin',))
conn.commit()
cur.close()
conn.close()
print?reCount

四、查數據

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# ############################## fetchone/fetchmany(num)? ##############################
import?MySQLdb
conn?=?MySQLdb.connect(host='127.0.0.1',user='root',passwd='1234',db='mydb')
cur?=?conn.cursor()
reCount?=?cur.execute('select * from UserInfo')
print?cur.fetchone()
print?cur.fetchone()
cur.scroll(-1,mode='relative')
print?cur.fetchone()
print?cur.fetchone()
cur.scroll(0,mode='absolute')
print?cur.fetchone()
print?cur.fetchone()
cur.close()
conn.close()
print?reCount
# ############################## fetchall? ##############################
import?MySQLdb
conn?=?MySQLdb.connect(host='127.0.0.1',user='root',passwd='1234',db='mydb')
#cur = conn.cursor(cursorclass = MySQLdb.cursors.DictCursor)
cur?=?conn.cursor()
reCount?=?cur.execute('select Name,Address from UserInfo')
nRet?=?cur.fetchall()
cur.close()
conn.close()
print?reCount
print?nRet
for?i?in?nRet:
????print?i[0],i[1]

?

轉載于:https://www.cnblogs.com/weiman3389/p/6224146.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373180.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373180.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373180.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關于typedef的使用方法

在計算機編程語言中用來為復雜的聲明定義簡單的別名。與宏定義有些差異。它本身是一種存儲類的keyword,與auto、extern、mutable、static、register等keyword不能出如今同一個表達式中。typedef聲明,簡稱typedef,為現有類型創建一個新的名字&…

ADF BC:創建綁定到業務組件的UI表

在此示例中,我們將展示如何創建綁定到業務組件的簡單UI表(af:table)。 我再次嘗試使用簡單的標準在網上進行搜索: “如何創建綁定到業務組件ADF 11g的af:table” 我必須承認我沒有得到我想要的答案。 信息…

linux驅動程序混合架構,嵌入式系統最小驅動框架(類似linux驅動程序架構)(示例代碼)...

2010年就打算把linux里的驅動框架核心代碼摳出來的,但是由于懶而且linux代碼量大,一直下不了手。最近調試的intel curie里驅動架構也類似linux,代碼就少多了,由于工作需要不得不梳理一下這一堆代碼,今天花了一下午&…

MyBaits 錯誤分析

錯誤原因:在DAO的映射文件中,在映射標簽中的type類型寫成DAO類了,應該寫成javaBean轉載于:https://www.cnblogs.com/shuaiandjun/p/5428847.html

超越JUnit –測試框架的替代方案

JUnit是事實上的Java單元測試框架,但是可能有一些新的(不是那么新的)框架可以用于Web開發。 在采用之前可能要問自己的問題: 它們是否快速,容易開發,因此成本低廉? 他們運行快并因此鼓勵采用嗎…

tensorflow mnist read_data_sets fails

下載處理mnist數據時出現如下錯誤 VisibleDeprecationWarning: converting an array with ndim > 0 to an index will result in an error in the future 解決方法: 在input_data.py文件中return numpy.frombuffer(bytestream.read(4), dtypedt) 后添加[0] retur…

斑馬打印機linux驅動安裝教程,linux-Zebra軟件包的基本安裝與配置

Zebra是一個路由軟件包,提供基于TCP/IP路由服務,支持RIPv1, RIPv2, RIPng, OSPFv2, OSPFv3, BGP- 4,和 BGP-4等眾多路由協議。Zebra還支持BGP特性路由反射器(Route Reflector)。除了傳統的 IPv4路由協議,Zebra也支持IPv6路由協議。如果運行的…

iOS 改變App狀態欄顏色為白色

默認狀態欄為黑色,對于某些App不是很美觀,變成白色很簡單,只需要兩個步驟。 1.在Info.plist中添加新項目,View controller-based status bar appearance,Boolean值為No. 2.在AppDelegate的- (BOOL)application:(UIAppl…

Java 7對抑制異常的支持

在JDK 7中 ,向Throwable類( Exception和Error類的父類)添加了一個新的構造函數和兩個新方法。 添加了新的構造函數和兩個新方法以支持“抑制的異常”(不要與吞咽或忽略異常的不良做法相混淆)。 在本文中,我…

linux 如何做共享磁盤陣列,在Linux上玩轉磁盤陣列分享

大部分用戶都會擔心,萬一硬盤發生故障,一、使用磁盤陣列可以帶來哪些好處?在具體如何配置磁盤陣列之前,筆者要先給大家介紹一下利用磁盤陣列的好處。先給大家一點動力,讓大家能夠繼續看下面的內容。第一個好處是磁盤陣列可以提高…

my-innodb-heavy-4g.cnf

my-innodb-heavy-4g.cnf轉載于:https://www.cnblogs.com/xiluhua/p/6231834.html

易于使用的單位和集成代碼

此示例說明如何使用Maven和Sonar生成單元測試和集成測試的覆蓋率。 它使用非常簡單的技術,只需10-15分鐘即可在任何現有的Maven構建中運行。 它可用于單元,集成,ATDD或任何其他類型的測試套件。 覆蓋率結果顯示在Sonar中。 有什么事嗎&#x…

Dij的堆優化

#include<algorithm> #include<iostream> #include<cstdio> #include<cstring> #include<queue> #define M 100000 #define pa pair<int,int>//優先比較第一個元素 using namespace std; int d[M],n,m,cnt,head[M],next[M],u[M],dis[M],n…

linux db2sysc 內存,db2sysc進程占用linux內存持續增長,請各位指點。

該服務器近期做過的變更情況&#xff1a;變更前&#xff0c;使用 sar -r 1 3 看內存使用率服務器內存使用率一直是70%該服務器原為獨立物理服務器&#xff0c;經過虛擬化遷移到EXS上成為虛擬服務器。遷移后發現swap無法啟動。原因是原物理服務器硬盤控制器為cciss。/etc/fstab …

k8s的探針

一、探針原理 分布式系統和微服務體系結構的挑戰之一是自動檢測不正常的應用程序&#xff0c;并將請求&#xff08;request&#xff09;重新路由到其他可用系統&#xff0c;恢復損壞的組件。健康檢查是應對該挑戰的一種可靠方法。使用 Kubernetes&#xff0c;可以通過探針配置運…

第一百三十節,JavaScript,封裝庫--連綴

JavaScript&#xff0c;封裝庫--連綴 學習要點&#xff1a; 1.連綴介紹 2.改寫庫對象 本章我們重點來介紹&#xff0c;在調用庫的時候&#xff0c;我們需要能夠在前臺調用的時候可以同時設置多個操作&#xff0c;比如設置CSS&#xff0c;設置innerHTML&#xff0c;設置click事件…

Spring3:類型安全依賴項注入

在從Spring跳到類型安全依賴注入之前&#xff0c;我想討論一下我們之前所做的方式。 我們一直在借助Spring的Autowired注釋按類型使用依賴項注入。 像這樣的東西會注入Spring Bean。 Autowired private StudentDao studentDao; // Autowires by type. Injects the instance who…

userData IE

蠻討厭IE的&#xff0c;因為他常常需要特別照顧&#xff0c;就像DOM Storage(sessionStorage和localStorage)只能支持IE8&#xff0c;對于以下的只能使用userData。 原理&#xff1a;通過在document元素后面附加一個專屬的“DHTML行為”來實現客戶端存儲&#xff0c; var memor…

context元素大概解說

Context元素代表一個web應用&#xff0c;運行在某個特定的虛擬主機上。如Servlet Specification 2.2或以后版本中描述的那樣&#xff0c;每個web應用基于一個Web Application Archive(WAR)文件&#xff0c;或者是一個目錄&#xff0c;包含WAR文件解壓后的內容。有關Web Applica…

全新的Play模塊資料庫

去年11月&#xff0c;我曾與Play框架的 Nicolas Leroux談過創建模塊存儲庫的問題。 他同意這將是一個好主意&#xff0c;但是時間不足使我無法開始。 在上周Google Play小組發生了暴風雨之后&#xff0c;我決定將其優先處理。 可以在幾周內提供可工作的原型。 概述&#xff1a;…