当前位置:网站首页>Bash exercise 17 writing scripts to install the server side of FRP reverse proxy software
Bash exercise 17 writing scripts to install the server side of FRP reverse proxy software
2022-07-05 06:20:00 【yuyuyuliang00】
Use one with public network IP Address ECS , Write the following script on it :
#!/usr/bin/bash
# install frp server in a cloud server
[ $UID -ne 0 ] && (echo "You are not the root, can not excute this script!" && exit 1)
Usage(){
echo "Usage: $0 -f <frp_package_lcation> -p <install_location> -P <listen_port> -t <token> -d <dashboard_port> -u <dashboard_username> -s <dashboard_pwd>"
}
PACKAGE=""
LOCATION=""
PORT=""
DUSER=""
PASSWD=""
TOKEN=""
DPORT=""
DPASSWD=""
while getopts f:p:P:t:d:u:s: arg
do
case $arg in
f)
PACKAGE=$OPTARG
;;
p)
LOCATION=$OPTARG
;;
P)
PORT=$OPTARG
;;
t)
TOKEN=$OPTARG
;;
d)
DPORT=$OPTARG
;;
u)
DUSER=$OPTARG
;;
s)
DPASSWD=$OPTARG
;;
?)
echo "Invalid Options:~$OPTARG"
Usage
exit 1
;;
esac
done
# check the package whether exists and starts with frp
if [ -f ${PACKAGE} ];then
package=$(basename "${PACKAGE}")
if [[ ! "${package}"=~^frp ]] || [[ ! "{package}"=~\.tar\.gz$ ]];then
echo "The package is not the frp package, please use the right package!"
exit 1
fi
else
echo "The package to install was wrong, please check again! "
Usage
exit 1
fi
# check the path to install the package is right
if [ -n "${LOCATION}" ];then
LOCATION=${LOCATION%/}
if [ ! -e ${LOCATION} ];then
mkdir -p ${LOCATION}
[ $? -ne 0 ] && ( echo "can not make the path to install the package" && exit 2)
elif [ ! -d ${LOCATION} -o ! -x ${LOCATION} ];then
echo "you did not give the right location or it can not be accessed!"
exit 2
fi
else
echo "You must give the location to install with -p option argument"
Usage
exit 2
fi
if [ -n "${PORT}" ];then
if [[ ! "${PORT}" =~ ^[0-9]+$ ]];then
echo "The Listen port must be a number smaller than 65536"
exit 3
fi
if [ ${PORT} -gt 65536 ];then
echo "The Listen port must be a number smaller than 65536"
exit 3
fi
port=$( ss -ltnp | sed -n '2,$p' | awk '{print $4}' | cut -d':' -f2 | grep ${PORT})
if [ -n "${port}" ];then
echo "${PORT} is already be used by another program, Please use anther port"
exit 3
fi
else
PORT=7000
fi
if [ -n "$TOKEN" ];then
if [[ ! "$TOKEN" =~ ^[a-zA-Z0-9_]{6,10}$ ]];then
echo "token can only contain alphabeta , digital or underscore from 6 to 10"
exit 4
fi
else
echo "You must give the token consisting of only alphabeta, digital or underscore from 6 to 10 using -t option"
Usage
exit 4
fi
if [ -n "$DPORT" ];then
if [[ ! "${DPORT}" =~ ^[0-9]+$ ]];then
echo "The Listen port must be a number smaller than 65536"
exit 3
fi
if [ ${DPORT} -gt 65536 ];then
echo "The Listen port must be a number smaller than 65536"
exit 3
fi
port=$( ss -ltnp | sed -n '2,$p' | awk '{print $4}' | cut -d':' -f2 | grep ${DPORT})
if [ -n "${port}" -o "${port}" == "${PORT}" ];then
echo "${DPORT} is already be used by another program, Please use anther port"
exit 3
fi
else
DPORT=7500
fi
if [ -n "DUSER" ];then
if [[ ! "${DUSER}" =~ ^[a-zA-Z]{1}[a-zA-Z0-9_]{2,7}$ ]];then
echo "dash board username should start with alphabeta and only contain alphabeta, digital or underscore from 3 to 8 characters"
exit 5
fi
else
echo "You shold give dash board username starting with alphabeta and only containing alphabeta, digital or underscore from 3 to 8 characters"
Usage
exit 5
fi
if [ -n "$DPASSWD" ];then
if [[ ! "$DPASSWD" =~ ^[a-zA-Z0-9_]{6,10}$ ]];then
echo "dash board password can only contain alphabeta , digital or underscore from 6 to 10"
exit 6
fi
else
echo "You must give the dash board password consisting of only alphabeta, digital or underscore from 6 to 10 using -s option"
Usage
exit 6
fi
echo "Package Location:$PACKAGE"
echo "Install Location:$LOCATION"
echo "Listen Port:$PORT"
echo "Token:$TOKEN"
echo "Dash board Port:$DPORT"
echo "Dash board User:$DUSER"
echo "Dash board Password:$DPASSWD"
read -p "Are you Sure to use these above arguments[Yes/No]" CHOSE
if [[ ! "$CHOSE" =~ ^[Yy]es$ ]];then
echo "You did not choose to install the package, exit"
exit 1
fi
echo "Starting to install frp package ..."
echo "uncompress the ${PACKAGE} to ${LOCATION} ..."
tar -xvzf ${PACKAGE} -C ${LOCATION} &>/dev/null
[ $? -ne 0 ] && (echo "can not uncompress the package to destination" && exit 1)
echo "uncompressed completed"
CURDIR=$(pwd)
package=$(basename ${PACKAGE})
INSTDIR=${LOCATION}/${package%.tar.gz}
echo "Goto to install path: ${INSTDIR}"
cd ${INSTDIR} || (echo "can not access the path: ${INSTDIR}" && exit 1)
echo "backup frps.ini to frp.ini.bak"
mv frps.ini frps.ini.bak
[ $? -ne 0 ] && (echo "backup failed" && exit 1)
echo "Edit the server configuration: "
cat >frps.ini<<EOF
[common]
bind_port = ${PORT}
# this token will be used by clients
token =${TOKEN}
dashboard_port = ${DPORT}
# frp background manager will use this username and password
dashboard_user = ${DUSER}
dashboard_pwd = ${DPASSWD}
enable_prometheus = true
# frp log configuration
log_file = /var/log/frps.log
log_level = info
log_max_days = 3
EOF
echo "Edit finished!"
CONFIGDIR=/etc/frp
if [ ! -d /etc/frp ];then
mkdir -p "${CONFIGDIR}"
[ $? -ne 0 ] && (echo "can not make the configuration path:${CONFIGDIR}" && exit)
fi
cp frps.ini /etc/frp
cp frps /usr/bin
cp systemd/frps.service /usr/lib/systemd/system/
systemctl enable frps
systemctl start frps
firewall-cmd --permanent --add-port=${PORT}/tcp
firewall-cmd --permanent --add-port=${DPORT}/tcp
firewall-cmd --reload
echo "back to the path: ${CURDIR}"
cd ${CURDIR}
echo "Install and start the frp package successfully!"
Execute the script written above as follows , Successful installation frp software package :
Enter :ss -tnlp You can see that the server has listened to the specified tcp port 7000 and 7500
On a computer that can connect to the Internet , Open a browser , Input :<IP Address >:7500,frp The background management client of successfully started :
Be careful : Access needs to be granted in the security group rules of the virtual machine 7000 and 7500 Of TCP Input direction of port .
边栏推荐
- 求组合数 AcWing 888. 求组合数 IV
- 打印机脱机时一种容易被忽略的原因
- 快速使用Amazon MemoryDB并构建你专属的Redis内存数据库
- Niu Mei's math problems
- Sword finger offer II 058: schedule
- How to set the drop-down arrow in the spinner- How to set dropdown arrow in spinner?
- MySQL advanced part 1: View
- 博弈论 AcWing 893. 集合-Nim游戏
- 阿里巴巴成立企业数智服务公司“瓴羊”,聚焦企业数字化增长
- Redis publish subscribe command line implementation
猜你喜欢
4. 对象映射 - Mapping.Mapster
博弈论 AcWing 893. 集合-Nim游戏
There are three kinds of SQL connections: internal connection, external connection and cross connection
高斯消元 AcWing 884. 高斯消元解异或線性方程組
Data visualization chart summary (I)
redis发布订阅命令行实现
[2021]IBRNet: Learning Multi-View Image-Based Rendering Qianqian
1.13 - RISC/CISC
数据可视化图表总结(二)
1.14 - assembly line
随机推荐
4. 对象映射 - Mapping.Mapster
做 SQL 性能优化真是让人干瞪眼
MySQL advanced part 1: View
【Rust 笔记】15-字符串与文本(上)
【LeetCode】Day95-有效的数独&矩阵置零
Sum of three terms (construction)
Usage scenarios of golang context
SQLMAP使用教程(一)
1039 Course List for Student
【Rust 笔记】15-字符串与文本(下)
[leetcode] day95 effective Sudoku & matrix zeroing
Navicat連接Oracle數據庫報錯ORA-28547或ORA-03135
中国剩余定理 AcWing 204. 表达整数的奇怪方式
CPU内核和逻辑处理器的区别
1039 Course List for Student
Shutter web hardware keyboard monitoring
How to generate an image from text on fly at runtime
【LeetCode】Easy | 20. Valid parentheses
阿里新成员「瓴羊」正式亮相,由阿里副总裁朋新宇带队,集结多个核心部门技术团队
Operator priority, one catch, no doubt