Jumpserver 介绍

Posted on
2017-08-11 14:20 
挥辉 
阅读(2207
评论(0
编辑 
收藏 
举报

安装jumperserver

Sudo yum install –y git

Su root

Cd  /usr/local

Mkdir jumpserver

 

安装等依赖包

yum -y install epel-release (需要下载安装)
yum clean all && yum makecache 
yum -y update 
yum -y install –y  git

yum -y install –y  mysql-devel

yum -y install –y  gcc

yum -y install –y  automake

yum -y install –y  autoconf

yum -y install –y  python-devel

yum -y install –y  vim

yum -y install –y  sshpass (需要下载安装)

yum -y install –y  lrzsz

yum -y install –y  readline-devel

yum install –y setuptool

yum -y install –y  python-pip (需要下载安装)

yum install
MySQL-python

[

Linux Fedora,
CentOS系统:yum install MySQL-python

Linux Ubuntu操作系统:apt-get install python-mysqldb

]

cd /usr/local/ jumpserver

git clone https://github.com/ibuler/jumpserver.git

 

三、执行快速安装脚本 
cd /usr/local/jumpserver/install

pip install -r requirement.txt

pip freeze

python install.py 

输入jumpserver的地址,默认为:”192.168.1.200”,回车即可。 
是否安装MySQL:选择”y”进行安装

 

MySQL 启动后会要求用户输入 邮件服务器及账户(后期用来发送用户名、ssh pass、web pass、ssh key)

 

输入smtp信息之后发现报错了,是python的pycrypto模块问题,需要卸载重装: 
pip uninstall pycrypto 
easy_install pycrypto

 

 

 

 

安装之后继续 python
install.py 进行安装,并且输入 web管理员用户名和管理员密码,ok

 

 

运行 crontab,定期处理失效连接,定期更新资产信息 
cd /opt/jumpserver 
python manage.py crontab add

 

注: 
1)根据提示输入相关信息,完成安装,安装完成后,请访问web,继续查看后续文档 
2)如果启动失败,请返回上层目录,手动运行
./service.sh start 启动 
3)如果 ./service.sh start 启动失败 
cd /opt/jumpserver 
python manage.py runserver 0.0.0.0:80 
python run_websocket.py 
4)如果启动失败,可能是由于80端口和3000端口已经被占用,或者数据库账号密码不对,请检查

五、Web登录 
http://192.168.1.200

 

注意: sm
在使用jumpserver过程中,有一步是系统用户推送,要推送成功,client(后端服务器)要满足以下条件: 
1)后端服务器需要有python、sudo环境才能使用推送用户,批量命令等功能 
2)后端服务器如果开启了selinux,请安装libselinux-python

六、更新代码 
cd /opt/jumpserver 
git pull

 

 

安装sshpass

1、下载:目前1.0.5是最新版本,下载地址:

wget
http://sourceforge.net/projects/sshpass/files/sshpass/1.05/sshpass-1.05.tar.gz

2、编译安装

#tar xf
sshpass-1.05.tar.gz

#cd
sshpass-1.05

#./configure

#make
&& make install

查看安装成功与否:

#which
sshpass

/usr/local/bin/sshpass
  –安装成功。

安装pip

wget
http://pypi.python.org/packages/source/p/pip/pip-1.0.2.tar.gz

tar zxf pip-1.0.2.tar.gz

cd pip-1.0.2

python setup.py build
python setup.py install

 


shell
中输入:

wget
http://pypi.python.org/packages/source/s/setuptools/setuptools-0.6c11.tar.gz
tar zxvf setuptools-0.6c11.tar.gz
cd setuptools-0.6c11
python setup.py build
python setup.py install

 

—————————————————————————-

 
作者:地球的外星人君
链接:https://www.zhihu.com/question/31175397/answer/171260795
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

首先,jumpserver是什么呢?

Jumpserver 是一款由Python编写开源的跳板机(堡垒机)系统,实现了跳板机应有的功能。基于ssh协议来管理,客户端无需安装agent。

特点:

完全开源,GPL授权
Python编写,容易再次开发
实现了跳板机基本功能,认证、授权、审计
集成了Ansible,批量命令等
支持WebTerminal
Bootstrap编写,界面美观
自动收集硬件信息
录像回放
命令搜索
实时监控
批量上传下载

jumpserver 3.0 安装

相对于 jumpserver 2.0 版本,在新的版本 3.0 中取消了LDAP授权,取而代之的是ssh进行推送;界面也有所变化,功能更完善,安装更简单,不像 2.0 的版本,难住了好多人。下面通过两台主机来搭建 jumpserver堡垒机!

环境:
Centos 6.5 x86_64
关闭 iptables,关闭 selinux
jumpserver:192.168.1.200
clients:192.168.1.210
ps:操作只针对 jumpserver,clients 不会进行操作,只是环境需求。

一、安装依赖包
yum -y install epel-release
yum clean all && yum makecache
yum -y update
yum -y install git python-pip MySQL-devel gcc automake autoconf python-devel vim sshpass lrzsz readline-devel

二、下载 jumpserver
cd /opt
Git clone
注: 如果下载失败,则去github上面下载zip包,unzip解压缩即可

<img src=”https://pic2.zhimg.com/v2-bae2b3d1bea11e9b14aca9ce2d603421_b.png” data-rawwidth=”811″ data-rawheight=”218″ class=”origin_image zh-lightbox-thumb” width=”811″ data-original=”https://pic2.zhimg.com/v2-bae2b3d1bea11e9b14aca9ce2d603421_r.png”>

三、执行快速安装脚本
cd /opt/jumpserver/install

pip install -r requirement.txt

<img src=”https://pic3.zhimg.com/v2-14065704ab1cc5cf230af6cbce11b3a6_b.png” data-rawwidth=”1255″ data-rawheight=”324″ class=”origin_image zh-lightbox-thumb” width=”1255″ data-original=”https://pic3.zhimg.com/v2-14065704ab1cc5cf230af6cbce11b3a6_r.png”>

查看安装的包
pip freeze

python install.py
输入jumpserver的地址,默认为:”192.168.1.200”,回车即可。
是否安装MySQL:选择”y”进行安装

<img src=”https://pic4.zhimg.com/v2-dbd5ec08c7a5576b415dc72c2bf84757_b.png” data-rawwidth=”630″ data-rawheight=”198″ class=”origin_image zh-lightbox-thumb” width=”630″ data-original=”https://pic4.zhimg.com/v2-dbd5ec08c7a5576b415dc72c2bf84757_r.png”>

MySQL 启动后会要求用户输入 邮件服务器及账户(后期用来发送用户名、ssh pass、web pass、ssh key)

163邮箱用授权密码,而不是登入密码 ,切记 。

<img src=”https://pic3.zhimg.com/v2-48e9de4ae5c4bd926a770198244f283a_b.png” data-rawwidth=”874″ data-rawheight=”371″ class=”origin_image zh-lightbox-thumb” width=”874″ data-original=”https://pic3.zhimg.com/v2-48e9de4ae5c4bd926a770198244f283a_r.png”>

输入smtp信息之后发现报错了,是python的pycrypto模块问题,需要卸载重装:
pip uninstall pycrypto
easy_install pycrypto

<img src=”https://pic1.zhimg.com/v2-ec3311e46161b1780784b210f09de94c_b.png” data-rawwidth=”637″ data-rawheight=”118″ class=”origin_image zh-lightbox-thumb” width=”637″ data-original=”https://pic1.zhimg.com/v2-ec3311e46161b1780784b210f09de94c_r.png”>
<img src=”https://pic2.zhimg.com/v2-886f5a759f3a6ea9de5fe48f32f0bbf5_b.png” data-rawwidth=”638″ data-rawheight=”147″ class=”origin_image zh-lightbox-thumb” width=”638″ data-original=”https://pic2.zhimg.com/v2-886f5a759f3a6ea9de5fe48f32f0bbf5_r.png”>

<img src=”https://pic1.zhimg.com/v2-729332302231fa167f6d81cae465498c_b.png” data-rawwidth=”638″ data-rawheight=”100″ class=”origin_image zh-lightbox-thumb” width=”638″ data-original=”https://pic1.zhimg.com/v2-729332302231fa167f6d81cae465498c_r.png”>

<img src=”https://pic1.zhimg.com/v2-8c2b0538af1a429c8331c18b2f2ab2e4_b.png” data-rawwidth=”640″ data-rawheight=”75″ class=”origin_image zh-lightbox-thumb” width=”640″ data-original=”https://pic1.zhimg.com/v2-8c2b0538af1a429c8331c18b2f2ab2e4_r.png”>

安装之后继续 python install.py 进行安装,并且输入 web管理员用户名和管理员密码,ok

<img src=”https://pic3.zhimg.com/v2-6db85d228cc90fe6f067f50a7e81a3b6_b.png” data-rawwidth=”639″ data-rawheight=”228″ class=”origin_image zh-lightbox-thumb” width=”639″ data-original=”https://pic3.zhimg.com/v2-6db85d228cc90fe6f067f50a7e81a3b6_r.png”>

<img src=”https://pic2.zhimg.com/v2-b5ae128b204d8749531d5f74fcc17db5_b.png” data-rawwidth=”641″ data-rawheight=”135″ class=”origin_image zh-lightbox-thumb” width=”641″ data-original=”https://pic2.zhimg.com/v2-b5ae128b204d8749531d5f74fcc17db5_r.png”>

运行 crontab,定期处理失效连接,定期更新资产信息
cd /opt/jumpserver
python manage.py crontab add

<img src=”https://pic3.zhimg.com/v2-a04b88f49318c3bf290347bc0eb195be_b.png” data-rawwidth=”1072″ data-rawheight=”213″ class=”origin_image zh-lightbox-thumb” width=”1072″ data-original=”https://pic3.zhimg.com/v2-a04b88f49318c3bf290347bc0eb195be_r.png”>

注:
1)根据提示输入相关信息,完成安装,安装完成后,请访问web,继续查看后续文档
2)如果启动失败,请返回上层目录,手动运行 ./service.sh start 启动
3)如果 ./service.sh start 启动失败
cd /opt/jumpserver
python manage.py runserver 0.0.0.0:80
python run_websocket.py
4)如果启动失败,可能是由于80端口和3000端口已经被占用,或者数据库账号密码不对,请检查

五、Web登录
http://192.168.1.200

<img src=”https://pic3.zhimg.com/v2-6809b0c773b2072a56f6f059e84fad6e_b.png” data-rawwidth=”1280″ data-rawheight=”750″ class=”origin_image zh-lightbox-thumb” width=”1280″ data-original=”https://pic3.zhimg.com/v2-6809b0c773b2072a56f6f059e84fad6e_r.png”>

注意:
在使用jumpserver过程中,有一步是系统用户推送,要推送成功,client(后端服务器)要满足以下条件:
1)后端服务器需要有python、sudo环境才能使用推送用户,批量命令等功能
2)后端服务器如果开启了selinux,请安装libselinux-python

六、更新代码
cd /opt/jumpserver
git pull

环境搭建到这一步就结束啦~

下面开始要仔细看咯

一、用户管理

1)添加用户

点击用户管理 —> 查看用户 —> 添加用户

<img src=”https://pic3.zhimg.com/v2-e8f14485add0893231e63dae6730fef2_b.png” data-rawwidth=”506″ data-rawheight=”356″ class=”origin_image zh-lightbox-thumb” width=”506″ data-original=”https://pic3.zhimg.com/v2-e8f14485add0893231e63dae6730fef2_r.png”>

输入要添加的用户名,姓名,权限,Mail,并且发送邮件 —> 保存

<img src=”https://pic4.zhimg.com/v2-d7f792c0d38e1be724394e49d583523f_b.png” data-rawwidth=”672″ data-rawheight=”617″ class=”origin_image zh-lightbox-thumb” width=”672″ data-original=”https://pic4.zhimg.com/v2-d7f792c0d38e1be724394e49d583523f_r.png”>

查看添加的用户

<img src=”https://pic1.zhimg.com/v2-a8ca5a191289f8e3d2fd97f2802f60d4_b.png” data-rawwidth=”1019″ data-rawheight=”280″ class=”origin_image zh-lightbox-thumb” width=”1019″ data-original=”https://pic1.zhimg.com/v2-a8ca5a191289f8e3d2fd97f2802f60d4_r.png”>

查看用户邮件
邮件中包含了用户名,权限,web密码,ssh 密钥密码,以及密钥下载地址。

<img src=”https://pic1.zhimg.com/v2-616e9c20274d85af64aa821a67cddba4_b.png” data-rawwidth=”493″ data-rawheight=”252″ class=”origin_image zh-lightbox-thumb” width=”493″ data-original=”https://pic1.zhimg.com/v2-616e9c20274d85af64aa821a67cddba4_r.png”>

2)添加用户组

点击用户管理 —> 查看用户组 —> 添加用户组

<img src=”https://pic2.zhimg.com/v2-7e514ca557da5c5164b386e76d992e55_b.png” data-rawwidth=”422″ data-rawheight=”163″ class=”origin_image zh-lightbox-thumb” width=”422″ data-original=”https://pic2.zhimg.com/v2-7e514ca557da5c5164b386e76d992e55_r.png”>

添加新的小组 —> 运维小组

<img src=”https://pic1.zhimg.com/v2-3529c2cf63833db0f87b7be545f71490_b.png” data-rawwidth=”740″ data-rawheight=”468″ class=”origin_image zh-lightbox-thumb” width=”740″ data-original=”https://pic1.zhimg.com/v2-3529c2cf63833db0f87b7be545f71490_r.png”>

查看刚才添加的组

<img src=”https://pic2.zhimg.com/v2-0ad61b43d78cf315e29e73871d2d3d9d_b.png” data-rawwidth=”839″ data-rawheight=”168″ class=”origin_image zh-lightbox-thumb” width=”839″ data-original=”https://pic2.zhimg.com/v2-0ad61b43d78cf315e29e73871d2d3d9d_r.png”>

二、资产管理

1)添加资产组

点击资产管理 —> 查看资产组 —> 添加主机组

<img src=”https://pic2.zhimg.com/v2-fbec977278061ff4dfccf035bae2f999_b.png” data-rawwidth=”561″ data-rawheight=”350″ class=”origin_image zh-lightbox-thumb” width=”561″ data-original=”https://pic2.zhimg.com/v2-fbec977278061ff4dfccf035bae2f999_r.png”>

输入组名称,并且输入描述组用途

<img src=”https://pic2.zhimg.com/v2-7e6adc916ab7ba5fc21559d382bbd849_b.png” data-rawwidth=”745″ data-rawheight=”479″ class=”origin_image zh-lightbox-thumb” width=”745″ data-original=”https://pic2.zhimg.com/v2-7e6adc916ab7ba5fc21559d382bbd849_r.png”>

2)添加资产

点击资产管理 —> 查看资产 —> 添加资产

<img src=”https://pic2.zhimg.com/v2-496f5002838abc6a2a79088cb4b8bbb5_b.png” data-rawwidth=”480″ data-rawheight=”227″ class=”origin_image zh-lightbox-thumb” width=”480″ data-original=”https://pic2.zhimg.com/v2-496f5002838abc6a2a79088cb4b8bbb5_r.png”>

输入主机名,主机IP,管理用户名(管理员用户,主机中必须存在的哦~ 可以是root),端口,资产组 —> 提交保存

<img src=”https://pic4.zhimg.com/v2-47b96042b3d175f0ddd7f9e31a5b6a93_b.png” data-rawwidth=”791″ data-rawheight=”651″ class=”origin_image zh-lightbox-thumb” width=”791″ data-original=”https://pic4.zhimg.com/v2-47b96042b3d175f0ddd7f9e31a5b6a93_r.png”>

3)添加机房

点击资产管理 —> 查看机房 —> 添加机房

<img src=”https://pic2.zhimg.com/v2-979e87264d6a2de6b5a9a8e5d57660e5_b.png” data-rawwidth=”463″ data-rawheight=”224″ class=”origin_image zh-lightbox-thumb” width=”463″ data-original=”https://pic2.zhimg.com/v2-979e87264d6a2de6b5a9a8e5d57660e5_r.png”>

输入机房名称,其他的可以选填 —> 保存

<img src=”https://pic1.zhimg.com/v2-6274f673f8c1d06106449628916ff790_b.png” data-rawwidth=”743″ data-rawheight=”470″ class=”origin_image zh-lightbox-thumb” width=”743″ data-original=”https://pic1.zhimg.com/v2-6274f673f8c1d06106449628916ff790_r.png”>

三、权限管理

1)sudo

点击权限管理 —> sudo —> 添加别名

<img src=”https://pic2.zhimg.com/v2-2d90a9a6012e2fc9153016216b937d31_b.png” data-rawwidth=”603″ data-rawheight=”392″ class=”origin_image zh-lightbox-thumb” width=”603″ data-original=”https://pic2.zhimg.com/v2-2d90a9a6012e2fc9153016216b937d31_r.png”>

输入别名,系统命令,备注 —> 点击保存

<img src=”https://pic1.zhimg.com/v2-b63638dd14e0c54dbc1464609bad04cc_b.png” data-rawwidth=”720″ data-rawheight=”360″ class=”origin_image zh-lightbox-thumb” width=”720″ data-original=”https://pic1.zhimg.com/v2-b63638dd14e0c54dbc1464609bad04cc_r.png”>

2)添加系统用户

点击授权管理 —> 系统用户 —> 添加系统用户

<img src=”https://pic2.zhimg.com/v2-f246dd1ac20dd19b34f2d61e1d2062b5_b.png” data-rawwidth=”414″ data-rawheight=”395″ class=”content_image” width=”414″>

输入用户名,密码,管理的sudo及备注 —> 单击保存

<img src=”https://pic4.zhimg.com/v2-e5300dda0a1c31e9658bdcfa33cc62a7_b.png” data-rawwidth=”691″ data-rawheight=”567″ class=”origin_image zh-lightbox-thumb” width=”691″ data-original=”https://pic4.zhimg.com/v2-e5300dda0a1c31e9658bdcfa33cc62a7_r.png”>

创建好系统之后,单击推送,将用户名、密码、sudo的信息推送到服务器。

<img src=”https://pic3.zhimg.com/v2-a8f39dc375b2445405db1a935ab95f32_b.png” data-rawwidth=”1076″ data-rawheight=”278″ class=”origin_image zh-lightbox-thumb” width=”1076″ data-original=”https://pic3.zhimg.com/v2-a8f39dc375b2445405db1a935ab95f32_r.png”>

选择系统用户,资产组 —> 单击保存

<img src=”https://pic3.zhimg.com/v2-e4361994d66a364f44f26973db4dc782_b.png” data-rawwidth=”709″ data-rawheight=”460″ class=”origin_image zh-lightbox-thumb” width=”709″ data-original=”https://pic3.zhimg.com/v2-e4361994d66a364f44f26973db4dc782_r.png”>

推送成功

<img src=”https://pic2.zhimg.com/v2-f9b992baaaa30f57bde4104664e654d1_b.png” data-rawwidth=”817″ data-rawheight=”55″ class=”origin_image zh-lightbox-thumb” width=”817″ data-original=”https://pic2.zhimg.com/v2-f9b992baaaa30f57bde4104664e654d1_r.png”>

3)授权规则

点击授权管理 —> 授权规则 —> 添加规则

<img src=”https://pic1.zhimg.com/v2-3477080704bd2504bad2b8c2ef7b9230_b.png” data-rawwidth=”416″ data-rawheight=”393″ class=”content_image” width=”416″>

输入授权名称,用户/用户组,资产/资产组,系统用户,备注 —> 单击保存

<img src=”https://pic3.zhimg.com/v2-a8f5ec5b01162577bbb054f66ff6199a_b.png” data-rawwidth=”739″ data-rawheight=”534″ class=”origin_image zh-lightbox-thumb” width=”739″ data-original=”https://pic3.zhimg.com/v2-a8f5ec5b01162577bbb054f66ff6199a_r.png”>

四、登录

这时候创建已经完成,下一步用户”hongxue”通过web和密钥登录堡垒机 192.168.1.200,并实现跳转到服务器 192.168.1.210

1)通过web登录
可以看到用户ID,用户名,权限,key,最后登录,用户组,授权主机数,以及主机信息。

<img src=”https://pic3.zhimg.com/v2-aa3fe40f52d574e6f6908b39527ae0aa_b.png” data-rawwidth=”1280″ data-rawheight=”718″ class=”origin_image zh-lightbox-thumb” width=”1280″ data-original=”https://pic3.zhimg.com/v2-aa3fe40f52d574e6f6908b39527ae0aa_r.png”>

单击查看主机 —> 连接

<img src=”https://pic2.zhimg.com/v2-60f6ab0add3d6dc96c2864253ec30b89_b.png” data-rawwidth=”1277″ data-rawheight=”397″ class=”origin_image zh-lightbox-thumb” width=”1277″ data-original=”https://pic2.zhimg.com/v2-60f6ab0add3d6dc96c2864253ec30b89_r.png”>

连接成功,可以对该主机进行操作。

<img src=”https://pic3.zhimg.com/v2-e8fe537a8acac4adc6d431142cc1f146_b.png” data-rawwidth=”1259″ data-rawheight=”716″ class=”origin_image zh-lightbox-thumb” width=”1259″ data-original=”https://pic3.zhimg.com/v2-e8fe537a8acac4adc6d431142cc1f146_r.png”>

2)通过ssh登录

通过邮件中收到的地址,下载key

<img src=”https://pic2.zhimg.com/v2-72a63ed51a2432b4f177da07360094cd_b.png” data-rawwidth=”254″ data-rawheight=”194″ class=”content_image” width=”254″>

点击工具 —> 用户密钥管理者

<img src=”https://pic2.zhimg.com/v2-c4e0eaa10e4019d6f46abe3d15354831_b.png” data-rawwidth=”437″ data-rawheight=”356″ class=”origin_image zh-lightbox-thumb” width=”437″ data-original=”https://pic2.zhimg.com/v2-c4e0eaa10e4019d6f46abe3d15354831_r.png”>

单击导入 —> 输入用户名,密码

<img src=”https://pic1.zhimg.com/v2-481c51ea07cae0bd00bebb0e98e63bfc_b.png” data-rawwidth=”566″ data-rawheight=”309″ class=”origin_image zh-lightbox-thumb” width=”566″ data-original=”https://pic1.zhimg.com/v2-481c51ea07cae0bd00bebb0e98e63bfc_r.png”>

连接 jumpserver 堡垒机 192.168.1.200,输入密钥密码进行登录

<img src=”https://pic1.zhimg.com/v2-28c4e1288987122181444b017772dd40_b.png” data-rawwidth=”882″ data-rawheight=”506″ class=”origin_image zh-lightbox-thumb” width=”882″ data-original=”https://pic1.zhimg.com/v2-28c4e1288987122181444b017772dd40_r.png”>

登录成功!! 从授权的列表中连接到服务器 192.168.1.210

<img src=”https://pic1.zhimg.com/v2-9463cb5da6faa754478d74a098c546ec_b.png” data-rawwidth=”849″ data-rawheight=”646″ class=”origin_image zh-lightbox-thumb” width=”849″ data-original=”https://pic1.zhimg.com/v2-9463cb5da6faa754478d74a098c546ec_r.png”>

!!为了安全,建议配置nginx 反向代理 jumpserver

log_format jumpserver \'$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$request_time" $request_body "$http_referer" "$http_user_agent" "$http_x_forwarded_for" $scheme $http_host\';

server {
        listen       8080 ssl;
        listen       80;
deny all;
        server_name jumpserver.xxxx.com;
        index index.html index.htm index.PHP;

        ssl_certificate      ssl/xxxx.com.crt;
        ssl_certificate_key  ssl/xxxx.com.key;
ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers  HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

if ( $scheme = http ) {
   rewrite ^(.*)$ https://$host:8090$request_uri? permanent;
  }

location / {
  proxy_set_header Connection "";
  proxy_http_version 1.1;
  proxy_pass      http://10.43.12.31:8090;
 }

location ^~ /ws/ {
proxy_pass http://10.43.12.31:8090/ws/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
  }
 
        access_log  /data0/logs/jumpserver.log jumpserver;
        error_log  /data0/logs/jumpserver_error.log debug;
}

版权声明:本文为liangqihui原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/liangqihui/p/7345721.html