目录

宝塔面板使用命令行安装软件

简单介绍什么是宝塔面板

宝塔Linux面板是提升运维效率的服务器管理软件,支持一键LAMP/LNMP/集群/监控/网站/FTP/数据库/JAVA等100多项服务器管理功能。 有20个人的专业团队研发及维护,经过200多个版本的迭代,功能全,少出错且足够安全,已获得全球百万用户认可安装。运维要高效,装宝塔。

分为免费版专业版,专业版收费,免费版足够用。

为什么需要命令行去安装?

宝塔面板使用官网的安装命令安装好以后位置是在 /www/server/panel

通过web的控制面板去管理服务器,安装需要的环境只要点击几下按钮就可以装起来,即使没有经验,稍微用一下也可以上手。

但是这些环境(比如LNMP)必须要手动点才能安装,虽然官方有提供API可以通过接口来进行操作,但我们通过脚本希望自动化安装的时候,并没有那么好用,比如部署一个新宝塔面板的同时自动安装好LNMP环境。

通过分析宝塔面板的代码可以找到一种通过shell脚本就安装需要环境的方法。

在安装好的宝塔目录/www/server/panel/install有两个脚本,install_soft.shpublic.sh,而install_soft.sh是安装和管理环境的脚本, 宝塔面板是使用python开发的,install_soft.sh是通过python调用执行的,参数由用户在前端web点击传递过来,只要分析一下代码理清install_soft.sh需要的参数和参数格式,就可以用命令行直接调用install_soft.sh完成需要的环境安装。

简单分析

搜索代码查找install_soft.sh关键字,可以在class/panelPlugin.py文件,其中有install_async函数

 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
    def install_async(self,pluginInfo,get):            
        mtype = 'install'
        mmsg = '安装'
        if hasattr(get, 'upgrade'):
            mtype = 'update'
            mmsg = 'upgrade'
        if not 'type' in get: get.type = '0'
        if int(get.type) > 4: get.type = '0'
        if get.sName == 'nginx': 
            if get.version == '1.8': return public.returnMsg(False,'Nginx 1.8.1版本过旧,不再提供支持,请选择其它版本!')
        if get.sName.find('php-') != -1: get.sName = get.sName.split('-')[0]
        php_path = '/www/server/php'
        if not os.path.exists(php_path): os.makedirs(php_path)
        apacheVersion='false'
        if public.get_webserver() == 'apache':
            apacheVersion = public.readFile('/www/server/apache/version.pl')
        public.writeFile('/var/bt_apacheVersion.pl',apacheVersion)
        public.writeFile('/var/bt_setupPath.conf','/www')
        if os.path.exists('/usr/bin/apt-get'): 
            if get.type == '0':
                get.type = '3'
            else:
                get.type = '4'
        execstr = "cd /www/server/panel/install && /bin/bash install_soft.sh " + get.type + " "+mtype+" " + get.sName + " "+ get.version
        public.M('tasks').add('id,name,type,status,addtime,execstr',(None, mmsg + '['+get.sName+'-'+get.version+']','execshell','0',time.strftime('%Y-%m-%d %H:%M:%S'),execstr))
        cache.delete('install_task')
        public.writeFile('/tmp/panelTask.pl','True')
        public.WriteLog('TYPE_SETUP','PLUGIN_ADD',(get.sName,get.version))
        return public.returnMsg(True,'已将安装任务添加到队列!')

找到和install_soft.sh相关的

1
execstr = "cd /www/server/panel/install && /bin/bash install_soft.sh " + get.type + " "+mtype+" " + get.sName + " "+ get.version

可以看到install_soft.sh需要的参数由4个

1
install_soft.sh $type $mtype $sName $version

通过在浏览器点击一次安装,看一下发送了哪些参数,比如安装一个PHP7.4,会询问你:

https://assets.cooldev.cn/20200116161415.png@!p

安装方式分为: 编译安装和极速安装

选择极速安装, 点击确定,F12查看提交的请求,有3个参数:

1
2
3
sName: php-7.4
version: 7.4
type: 1

选择编译安装,提交的参数为:

1
2
3
sName: php-7.4
version: 7.4
type: 0

得到 type 为安装方式:

type=0 编译安装

type=1 极速安装

$mtype 在方法中,按代码理解这个是操作类型,安装时固定为: install

$sName 为提交的sName ,是软件名称, 不过PHP的做了一下处理:是取-号分割的前一部分

1
if get.sName.find('php-') != -1: get.sName = get.sName.split('-')[0]

所以sName: php-7.4 实际取到的sName=php

$version就是提交过来的版本了。

因此install_soft.sh接收的参数为:

1
install_soft.sh 安装方式 操作类型 软件名 版本号

因此实际安装PHP7.4提交给 install_soft.sh参数为(假设为极速安装)

1
install_soft.sh 1 install php 7.4

而代码中对$type 实际还做了一下处理,type默认为0,且不能大于4,大于4会转为0

1
2
if not 'type' in get: get.type = '0'
        if int(get.type) > 4: get.type = '0'

系统有/usr/bin/apt-get时 , ubuntu/debain这类系统时,type做了转换

1
2
3
4
5
if os.path.exists('/usr/bin/apt-get'): 
            if get.type == '0':
                get.type = '3'
            else:
                get.type = '4'

type = 0 实际转为 type =3

否则转为 type = 4

也就是说针对 ubuntu/debain 系统时,实际安装PHP7.4提交给 install_soft.sh参数为(假设为极速安装)

1
install_soft.sh 4 install php 7.4

软件参数列表

运行环境

软件名称(sName) 安装方式(type) 版本(version) 依赖
Nginx nginx 0\1 1.8\1.12\1.14\1.15\1.16\1.17
Tengine nginx 0\1 -tengine2.2
OpenResty nginx 0\1 openresty
Apache apache 0\1 2.2\2.4
MySQL mysql 0\1 5.1\5.5\5.6\5.7\8.0
Mariadb mysql 0\1 mariadb_10.0\mariadb_10.1\mariadb_10.2\mariadb_10.3\mariadb_10.4
AliSQL mysql 0\1 alisql
PHP php 0\1 5.2\5.3\5.4\5.5\5.6\7.0\7.1\7.2\7.3\7.4
Redis redis 0 5.0
FTP pureftpd 0 1.0
phpMyAdmin 要先安装Mysql和Apache\Nginx
Memcached memcached 0 1.5
Tomcat tomcat 0 7\8\9
PM2管理器 pm2 0 4.2
Docker管理器 docker 0 2
MongoDB mongodb 0 4.0
GitLab gitlab 0 8.8

系统工具

软件名称(sName) 安装方式(type) 版本(version) 依赖
Linux工具箱
宝塔跑分
Supervisor管理器
日志清理工具

软件列表获取接口:

http://www.bt.cn/api/panel/get_soft_list_test

PHP扩展安装:

扩展列表:

http://192.168.33.15:8888/ajax?action=GetPHPConfig

支持安装扩展查询接口:

http://download.bt.cn/install/lib/phplib.json

比如php7.2安装 memcached

1
2
3
name: memcached
version: 72
type: 1
1
install_soft.sh $type install $name $version

2021-9-8 更新

在论坛找个一个官方回复上面有说如何通过命令行安装

统一回复下:面板的软件安装脚本在

1
/www/server/panel/install

目录下,如果安装php7.4的话,以CentOS系统为例: 急速安装包下载地址

1
wget http://download.bt.cn/install/1/php.sh && bash php.sh install 74

Mysql5.7:

1
wget http://download.bt.cn/install/1/mysql.sh && bash mysql.sh install 5.7

Nginx1.20:

1
wget http://download.bt.cn/install/1/nginx.sh && bash nginx.sh install 1.20

编译安装脚本: 如php7.4:

1
wget http://download.bt.cn/install/0/php.sh && bash php.sh install 74

Mysql5.7:

1
wget http://download.bt.cn/install/0/mysql.sh && bash mysql.sh install 5.7

Nginx1.20:

1
wget http://download.bt.cn/install/0/nginx.sh && bash nginx.sh install 1.20

【已回应】宝塔安装软件,能不能用命令行安装软件? - Linux面板 - 宝塔面板论坛