服务器自动管理系统之连接服务器的方式
堡垒机前戏
开发堡垒机之前,先来学习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()
|
![](/assets/blank.gif)
![](/assets/blank.gif)
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()
![](/assets/blank.gif)
基于公钥密钥连接:
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' , pkey = private_key)
# 执行命令
stdin, stdout, stderr = ssh.exec_command( 'df' )
# 获取命令结果
result = stdout.read()
# 关闭连接
ssh.close()
|
![](/assets/blank.gif)
![](/assets/blank.gif)
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()
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
import paramiko from io import StringIOkey_str = """-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAq7gLsqYArAFco02/55IgNg0r7NXOtEM3qXpb/dabJ5Uyky/8 NEHhFiQ7deHIRIuTW5Zb0kD6h6EBbVlUMBmwJrC2oSzySLU1w+ZNfH0PE6W6fans H80whhuc/YgP+fjiO+VR/gFcqib8Rll5UfYzf5H8uuOnDeIXGCVgyHQSmt8if1+e 7hn1MVO1Lrm9Fco8ABI7dyv8/ZEwoSfh2C9rGYgA58LT1FkBRkOePbHD43xNfAYC tfLvz6LErMnwdOW4sNMEWWAWv1fsTB35PAm5CazfKzmam9n5IQXhmUNcNvmaZtvP c4f4g59mdsaWNtNaY96UjOfx83Om86gmdkKcnwIDAQABAoIBAQCnDBGFJuv8aA7A ZkBLe+GN815JtOyye7lIS1n2I7En3oImoUWNaJEYwwJ8+LmjxMwDCtAkR0XwbvY+ c+nsKPEtkjb3sAu6I148RmwWsGncSRqUaJrljOypaW9dS+GO4Ujjz3/lw1lrxSUh IqVc0E7kyRW8kP3QCaNBwArYteHreZFFp6XmtKMtXaEA3saJYILxaaXlYkoRi4k8 S2/K8aw3ZMR4tDCOfB4o47JaeiA/e185RK3A+mLn9xTDhTdZqTQpv17/YRPcgmwz zu30fhVXQT/SuI0sO+bzCO4YGoEwoBX718AWhdLJFoFq1B7k2ZEzXTAtjEXQEWm6 01ndU/jhAasdfasdasdfasdfa3eraszxqwefasdfadasdffsFIfAsjQb4HdkmHuC OeJrJOd+CYvdEeqJJNnF6AbHyYHIECkj0Qq1kEfLOEsqzd5nDbtkKBte6M1trbjl HtJ2Yb8w6o/q/6Sbj7wf/cW3LIYEdeVCjScozVcQ9R83ea05J+QOAr4nAoGBAMaq UzLJfLNWZ5Qosmir2oHStFlZpxspax/ln7DlWLW4wPB4YJalSVovF2Buo8hr8X65 lnPiE41M+G0Z7icEXiFyDBFDCtzx0x/RmaBokLathrFtI81UCx4gQPLaSVNMlvQA 539GsubSrO4LpHRNGg/weZ6EqQOXvHvkUkm2bDDJAoGATytFNxen6GtC0ZT3SRQM WYfasdf3xbtuykmnluiofasd2sfmjnljkt7khghmghdasSDFGQfgaFoKfaawoYeH C2XasVUsVviBn8kPSLSVBPX4JUfQmA6h8HsajeVahxN1U9e0nYJ0sYDQFUMTS2t8 RT57+WK/0ONwTWHdu+KnaJECgYEAid/ta8LQC3p82iNAZkpWlGDSD2yb/8rH8NQg 9tjEryFwrbMtfX9qn+8srx06B796U3OjifstjJQNmVI0qNlsJpQK8fPwVxRxbJS/ pMbNICrf3sUa4sZgDOFfkeuSlgACh4cVIozDXlR59Z8Y3CoiW0uObEgvMDIfenAj 98pl3ZkCgYEAj/UCSni0dwX4pnKNPm6LUgiS7QvIgM3H9piyt8aipQuzBi5LUKWw DlQC4Zb73nHgdREtQYYXTu7p27Bl0Gizz1sW2eSgxFU8eTh+ucfVwOXKAXKU5SeI +MbuBfUYQ4if2N/BXn47+/ecf3A4KgB37Le5SbLDddwCNxGlBzbpBa0= -----END RSA PRIVATE KEY-----"""private_key = paramiko.RSAKey(file_obj=StringIO(key_str)) transport = paramiko.Transport(('10.0.1.40', 22)) transport.connect(username='wupeiqi', pkey=private_key)ssh = paramiko.SSHClient() ssh._transport = transportstdin, stdout, stderr = ssh.exec_command('df') result = stdout.read()transport.close()print(result)
![](/assets/blank.gif)
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()
|
![](/assets/blank.gif)
![](/assets/blank.gif)
#!/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()
![](/assets/blank.gif)
堡垒机的实现
实现思路:
堡垒机执行流程:
- 管理员为用户在服务器上创建账号(将公钥放置服务器,或者使用用户名密码)
- 用户登陆堡垒机,输入堡垒机用户名密码,现实当前用户管理的服务器列表
- 用户选择服务器,并自动登陆
- 执行操作并同时将用户操作记录
注:配置.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()
|
![](/assets/blank.gif)
![](/assets/blank.gif)
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)
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
# 获取原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)
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
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
![](/assets/blank.gif)
注:密码验证 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 "-"
);
|
![](/assets/blank.gif)
![](/assets/blank.gif)
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`) ) ;
![](/assets/blank.gif)
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
|
![](/assets/blank.gif)
![](/assets/blank.gif)
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
![](/assets/blank.gif)
注意: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 ]
|
服务器自动管理系统之连接服务器的方式相关推荐
- 服务器判断自动还是手动连接网络,ADSL拨号上网实现服务器自动与网络连接
当多台计算机共享ADSL上网时,要使每一台计算机都通过手工方式来控制服务器与网络连接是比较麻烦的,但按照下面介绍的步骤就能实现服务器自动与网络连接. 一.自动进行拨号 当多台计算机共享ADSL上网时, ...
- 饥荒自动服务器有点问题,饥荒联机版无法连接服务器怎么办_无法连接服务器的快速解决办法...
饥荒联机版无法连接服务器怎么办?今天小编就为大家带来饥荒联机版无法连接服务器解决方法,让我们来一起看看吧! 其实有时候连不上klei服务器和刷新不出服务器列表,是dns的问题. 尤其一些三级宽带,像什 ...
- csgo国服一直连不上服务器,csgo国服显示连接服务器发生错误 | 手游网游页游攻略大全...
发布时间:2015-09-05 正当防卫3是刚出来的游戏呢,很多玩家都想要玩吧,但是由于这款游戏要全程联网才能够玩呢,很多玩家无法连接服务器,这是咋回事呢,下面看看正当防卫3无法连接服务器怎么办 总是 ...
- csgo账号连接服务器错误,steam csgo连接服务器发生错误 | 手游网游页游攻略大全...
发布时间:2015-11-22 今天小编带来风暴英雄 进不去 从服务器下载数据时发生错误 怎么办 风暴英雄这个游戏看似是"MOBA"(DotA/DotA2)或者"Acti ...
- Mac搭建本地svn服务器,并用Cornerstone连接服务器
Mac搭建本地svn服务器,并用Cornerstone连接服务器 Mac默认已经安装了svn,我们只需要进行配置并开启就可以了 首先我们可以验证一下是否安装了svn,打开终端,输入命令: svnser ...
- 开启手机找回连接服务器失败,原神连接服务器失败什么意思?连接服务器失败解决方法...
原神连接服务器失败怎么办?连接服务器失败是什么意思?6月25日,很多玩家在登陆游戏的时候发现界面弹出了"连接服务器失败"这个提示,导致玩家无法进入游戏中,那么这到底是什么情况呢?应 ...
- RustDesk 自建服务器,局域网可以连接服务器,外网就不可以了。 求高手指点迷津。
RustDesk 自建服务器,局域网可以连接服务器,外网就不可以了. 求高手指点迷津. 局域网连接是没有问题的,但是映射到公网ip就是连不上,端口映射没有问题.有那位大神可以指点迷津用云服务器吗? 就 ...
- rustdesk RustDesk 自建服务器,局域网可以连接服务器,外网就不可以了。 求高手指点迷津。
rustdesk RustDesk 自建服务器,局域网可以连接服务器,外网就不可以了. 求高手 局域网连接是没有问题的,但是映射到公网ip就是连不上,端口映射没有问题.有那位大神可以指点迷津用云服务器 ...
- SQLServer连接服务器维护,SQLServer远程连接服务器详细配置(sp_addlinkedserver)
远程链接服务器详细配置 --建立连接服务器 EXEC sp_addlinkedserver '远程服务器IP','SQL Server' --标注存储 EXEC sp_addlinkedserver ...
最新文章
- variable ‘‘ of type ‘‘ referenced from scope ‘‘, but it is not defined 异常解决方法
- 我去,为什么最左前缀原则失效了?
- 社交平台舆情分析项目的总结和感想(LU学习,EM,KNN)(二)
- linux分区 挂盘,linux分区与格式化磁盘挂载磁盘与自动挂载详细教程
- 事务保存点savepoint
- Arduino笔记-人体热释电外传感器使用
- 一个很不错的开发管理中文个人网站
- snmp的安装与配置
- map分组后取前10个_35岁詹皇有多强?17年生涯首拿助攻王背后:10个月前早已定下目标...
- 【多任务学习-Multitask Learning概述】
- ✖ 48 problems (48 errors, 0 warnings) 45 errors and 0 warnings potentially fixable with the `--fix
- 数学建模 预测方法集锦
- OCP-V13-700
- 转载天大一位学长的帖子
- MPLAB-IDE-C语言编程代码实例-分析
- matlab积分泛函,泛函积分的数学方法概观.pdf
- SpringCloud进阶-Hystrix的熔断机制+Hystrix的工作流程
- python综合应用题、显示数据_Python综合应用题
- pro6 surface 黑苹果_Surface Pro6典雅黑入手体验
- android等待旋转圆圈动画,android – 嵌入式动画,绘制圆圈和旋转图像