堡壘機實戰

堡壘機前戲

開發堡壘機以前,先來學習Python的paramiko模塊,該模塊機遇SSH用於鏈接遠程服務器並執行相關操做python

 

SFTPClientmysql

用於鏈接遠程服務器並執行上傳下載linux

基於用戶名密碼上傳下載ios

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()

基於公鑰密鑰上傳下載sql

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()

堡壘機的實現 

實現思路:shell

堡壘機執行流程:數據庫

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

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

實現過程服務器

步驟一,實現用戶登錄session

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',
                break
            sys.stdout.write(x)
            sys.stdout.flush()
        except socket.timeout:
            pass
    if 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',
                    break
                sys.stdout.write(x)
                sys.stdout.flush()
            except socket.timeout:
                pass
        if sys.stdin in r:
            x = sys.stdin.read(1)
            if len(x) == 0:
                break
            chan.send(x)

finally:
    # 從新設置終端屬性
    termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty)
複製代碼
複製代碼
def windows_shell(chan):
    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=(chan,))
    writer.start()

    try:
        while True:
            d = sys.stdin.read(1)
            if not d:
                break
            chan.send(d)
    except EOFError:
        # user hit ^Z or F6
        pass
複製代碼

注:密碼驗證 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
2
3
show databases;
use [databasename];
create database  [name];

二、數據表操做

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`) 
) ; 
複製代碼

三、數據操做

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

四、其餘

1
2
3
主鍵
外鍵
左右鏈接

Python MySQL API

1、插入數據

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( 'insert into UserInfo(Name,Address) values(%s,%s)' ,( 'alex' , 'usa' ))
 
conn.commit()
 
cur.close()
conn.close()
 
print  reCount
複製代碼
import MySQLdb

conn = 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

2、刪除數據

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

3、修改數據

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

4、查數據

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  in  nRet:
     print  i[ 0 ],i[ 1 ]
相關文章
相關標籤/搜索