愿乘风归去 发表于 2020-4-2 00:04

申请会员ID:愿乘风归去

# 申请标题:申请会员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

## 运行情况
都是代码,没啥图好帖的。代码的项目是(https://github.com/Masterchiefm/Aria2Dash/),放github上。在GitHub上可以看到我发表的名称为masterchiefm,愿乘风归去。而“愿乘风归去”是我申请的id,另外我的申请邮箱名称和GitHub上的邮箱一致。这点可以在[我的GitHub主页](https://github.com/Masterchiefm) 上看到。
### 贴点运行效果图:
图是我放在github上的,懒得重新搞了。这个ip是vultr的,服务器已经删了,就不打码了
建议去(https://github.com/Masterchiefm/Aria2Dash/)看。
!(https://raw.githubusercontent.com/Masterchiefm/pictures/master/Aria2Dash/12.jpg)
!(https://raw.githubusercontent.com/Masterchiefm/pictures/master/Aria2Dash/17.jpg)
!(https://raw.githubusercontent.com/Masterchiefm/pictures/master/Aria2Dash/18.jpg)

Hmily 发表于 2020-4-2 13:44

抱歉,未能达到申请要求,申请不通过,可以关注论坛官方微信(吾爱破解论坛),等待开放注册通知。
页: [1]
查看完整版本: 申请会员ID:愿乘风归去