申请标题:申请会员ID:愿乘风归去
1、申 请 I D:愿乘风归去
2、个人邮箱:moqiqin@live.com
3、原创技术文章:制作一键脚本的经验
制作一键脚本的经验
最近写了个脚本,总结点经验。所以我就拿我自己的脚本为例子分享一下吧。
首先介绍一下我搞这个脚本的原因:Aria2是一个基于命令行的开源下载工具,支持除了ed2k以及迅雷之外的绝大多数下载方式。其多线程下载以及可以远程控制的特性,使其得到许多人的青睐。然而,其缺点也明显,没有自带的图形管理,从而导致配置繁琐。所以我这个脚本,不仅能直接安装aria2,还能顺带把文件管理器filebrowser带上。到现在总共搞了那么几个功能:
- 整合了File Browser的安装,使文件管理无需再通过ftp或者ssh进入服务器中操作。
- 将Aria2c与FileBrowser添加进systemctl,并开机启动。
- Aria2每次启动的时候会更新tracker,使bt下载更高效。tracker来源https://raw.githubusercontent.com/ngosang/trackerslist
- 改了AriaNg网页管理界面,添加了FileBrowser的入口以管理文件,以及直接进入文件目录的入口。Aria2密钥默认为1234,可在安装时另外指定。输入http://你的ip/ariang 即可访问。
- 每分钟刷新硬盘剩余容量,显示在网页根目录Disk_Usage.html中。网页能自动刷新。
那么,我就开始讲一下我的经验吧。
首先,一个脚本,特别是一键脚本,最主要的特性就是一按回车就可以迅速运行。所以一般情况下,脚本内部都是写死了各种要设置的参数。然而有些人可能会有不同需求,那么一键脚本有时候还得兼顾一下这些需求。
我是如何读取用户的输入的呢
这里写的是bash shell脚本,bash shell 有个接受脚本外参数的方法,使用while getopts的方式获取参数。while getopts以 ":p:a:d:f:h:" 的方式,循环将参数p,参数a,参数d等赋给opt,然后使用do的方式,对应参数的值再赋予对应的变量。就如同这里:
while getopts ":p:a:d:f:h:" opt
do
case $opt in
#aria2自定密码
p)
p=$OPTARG
;;
#是否安装apache/httpd
a)
a=$OPTARG
;;
esac
done
根据上面这样,脚本就拥有了获取用户输入的能力
如何处理输入参数
因为一键脚本多数时候是为了方便,所以在设计之初会尽量考虑大多数人的可能需求。所以,脚本里一般会将一些参数预先设定好。
我是这样处理输入参数的,首先,我先将一些参数写好,然后再到上一节中所提到的读取用户输入。我引入一个第三参数,用户输入后,我们得进行比较,即将用户输入与预设参数比较。如果用户没有输入,就是输入为空,这时候就将预设值赋予第三参数。
在bash中,我首先给d与dir赋同值,再读取用户输入。若用户不输入,则保留原值。然后,用if [ $d !=$dir ] ; then来对两个变量进行比较,如果两者不同,就将用户输入赋值给dir。
if [ $d != $dir ] ; then
dir=$d
fi
这样就实现了读取并使用用户输入的要求。而且用户未输入不则改变预设值。
那么,综合起来,我就做了这样的一个开头:
#预设变量
#Aria2密码
p=1234
#是否安装Apache2
a=y
#默认网页路径
dir="/var/www/html"
d=$dir #预先给d赋值,免得下面要是不输入东西的话判断报错
#filebrowser,因为GFW,国内VPS可能装不上,默认是可以装
f=y
#log,安装日志,保存于/root/log_of_install_aria2dash.log
log="/root/log_of_install_aria2dash.log"
date > $log
while getopts ":p:a:d:f:h:" opt
do
case $opt in
#aria2自定密码
p)
p=$OPTARG
;;
#是否安装apache/httpd
a)
a=$OPTARG
;;
#指定网页根目录
d)
d=$OPTARG
;;
#是否安装filebrowser,国内建议不装
f)
f=$OPTARG
;;
#帮助,暂时不搞
h)
h=$OPTARG
;;
?)
echo "WTF???"
exit
;;
esac
done
#若用户输入网页根目录与预设不一致,则将dir变量值改为用户设置的
if [ $d != $dir ] ; then
echo "d!=dir"
dir=$d
fi
echo "ariang directory is $dir" >> $log
echo "判断系统是debian,Ubuntu,Fedora,cent还是手机的turmux(咕)"
if [[ $(command -v apt) ]] ; then
cmd="sudo apt"
echo "your system is Ubuntu/Debian" >>$log
apache2="apache2"
else
cmd="sudo yum"
echo "your system is CentOS/Fedora. Note that cent cannot install aria2 because it lacks aria2 packge"
echo "cent 软件源不包含aria2,所以你得自己另外寻找办法安装。具体自己百度"
apache2="httpd"
firewall-cmd --zone=public --add-port=80/tcp --permanent #cent的防火墙有时候很恶心
fi
$cmd update -y
echo "根据需要,安装Apache2或者httpd"
if [ $a = "y" ] ; then
echo "安装$apache2"
cmd1="$cmd install $apache2 -y"
$cmd1
sudo mv $dir/index.html $dir/index.html0
systemctl restart $apache2
else
echo "you choosed not to install apache2/httpd."
fi
```
安装软件包
一键脚本图的就是快捷方便,所以一般来说,安装软件包都是通过apt或者yum这样的包管理器去安装,而不会采取编译安装这样慢的方式。
但是,不同系统用的包管理可能不一样,所以首先要分辨系统。
command -v 命令可以用来检测一个命令是否可用,返回可执行文件路径。比如,我在ubuntu上输入command -v yum ,运行后返回是个空值,如果输入的是command -v apt,返回是路径。就像下面这样:
root@server:/# command -v yum
root@server:/# command -v apt
/usr/bin/apt
这样,我就可以先判断系统的包管理软件是什么了。当返回路径的时候,即返回值非空,为真,运行一种命令,若返回空,则运行另一些命令
if [[ $(command -v apt) ]] ; then
cmd="sudo apt"
echo "your system is Ubuntu/Debian" >>$log
else
cmd="sudo yum"
fi
对了,bash shell的空格不要吝啬,空格是有意义的。
并且通过这样的方法,可以判断自己脚本里的包有无成功安装。没成功安装的话,就将日志输出,到后期调试的时候可以知道哪一步出状况。举个例子,centOS的源里没有aria2这个包,而Fedora的源有。那么安装的时候cent就会出错。那么下面的例子就能告诉你你的必须软件是否成功安装了
if [[ $(command -v aria2c) ]] ; then
echo "installed aria2" >>$log
else
echo "install aria2 failed">>$log
fi
结语
以上就是我在在做一键脚本的时候,如何兼顾快速,以及自定义输入。所以,我的脚本最终能够以这样一行命令复制粘贴运行。
1. 默认方式安装。
复制粘贴以下命令到终端,运行执行即可。全部参数采用默认设置。
#以Ubuntu为例
sudo apt install curl -y && bash <(curl -s -L https://github.com/Masterchiefm/Aria2Dash/raw/master/Aria2Dash.sh)
2.自定义参数安装
先下载脚本。
#
wget --no-check-certificate https://github.com/Masterchiefm/Aria2Dash/raw/master/install.sh
#
然后运行。
#
bash ./install.sh -a n -d 网页目录 -p aria2密码
#
例如以下命令:
bash ./install.sh -a n -d /var/web -p 1234567
意思是不安装apache2,指定将AriaNg放入/var/web内,设置Aria2的RPC密钥为1234567
运行情况
都是代码,没啥图好帖的。代码的项目是Aria2Dash,放github上。在GitHub上可以看到我发表的名称为masterchiefm,愿乘风归去。而“愿乘风归去”是我申请的id,另外我的申请邮箱名称和GitHub上的邮箱一致。这点可以在我的GitHub主页 上看到。
贴点运行效果图:
图是我放在github上的,懒得重新搞了。这个ip是vultr的,服务器已经删了,就不打码了
建议去Aria2Dash看。
|