commit
a3a51074a0
@ -0,0 +1,11 @@ |
|||||||
|
# 练习测试脚本 |
||||||
|
# 教学使用 |
||||||
|
|
||||||
|
### 使用方法 |
||||||
|
|
||||||
|
1、复制仓库地址 git@gitee.com:newrain001/shell-project.git |
||||||
|
|
||||||
|
2、安装git [yum -y install git] |
||||||
|
|
||||||
|
3、git clone git@gitee.com:newrain001/shell-project.git |
||||||
|
|
@ -0,0 +1,53 @@ |
|||||||
|
#!/usr/bin/bash |
||||||
|
<<! |
||||||
|
mysql 物理备份脚本 |
||||||
|
工具:xtrabackup 2.3.6 |
||||||
|
备份策略:周日完整备份 周一、二、四、五增量备份 周三、六差异备份 |
||||||
|
1、完全后台执行 |
||||||
|
2、备份完整 |
||||||
|
3、日志记录 |
||||||
|
4、历史数据的处理 |
||||||
|
! |
||||||
|
|
||||||
|
dbUser="root" |
||||||
|
dbPasswd="QianFeng@123" |
||||||
|
backCMD="/usr/bin/innobackupex" |
||||||
|
backDir="/backup" |
||||||
|
logPath="/var/log/backup.log" |
||||||
|
# 定义规则数组 0 完整备份 1 增量备份 2 差异备份 |
||||||
|
# 数组的值是备份的方式,数组的下标是星期几 |
||||||
|
rule=(0 1 1 2 1 1 2) |
||||||
|
# 0 1 2 3 4 5 6 |
||||||
|
datetime=$(date +%w) |
||||||
|
|
||||||
|
full(){ |
||||||
|
mv $logPath $backDir |
||||||
|
tar cvzf /tmp/mysql_back_`date +%F`.tar.gz "$backDir" && \ |
||||||
|
rm -rf $backDir |
||||||
|
mkdir -p $backDir/{full,incr,diff} |
||||||
|
$backCMD --user=$dbUser --password=$dbPasswd $backDir/full |
||||||
|
echo "full `ls $backDir/full |tail -n 1`" >> $logPath |
||||||
|
|
||||||
|
} |
||||||
|
other(){ |
||||||
|
# $1 incr|diff 备份的类型 |
||||||
|
# $2 需要基于的完整路径 |
||||||
|
$backCMD --user=$dbUser --password=$dbPasswd --incremental $backDir/$1 --incremental-basedir=$2 |
||||||
|
echo "$3 `ls $backDir/$3 |tail -n 1`" >> $logPath |
||||||
|
} |
||||||
|
|
||||||
|
case ${rule[$datetime]} in # ${rule[5]} |
||||||
|
0) |
||||||
|
full |
||||||
|
;; |
||||||
|
1) |
||||||
|
type=$(tail -n 1 $logPath|awk '{print $1}') # 获取上一次备份的类型 |
||||||
|
time=$(tail -n 1 $logPath|awk '{print $2}') # 获取上一次备份的目录 |
||||||
|
other incr $backDir/$type/$time incr |
||||||
|
# /backup/full/2022-05-22_00-00-05 |
||||||
|
;; |
||||||
|
2) |
||||||
|
time=$(grep full $logPath|awk '{print $2}') |
||||||
|
other diff $backDir/full/$time diff |
||||||
|
;; |
||||||
|
esac |
@ -0,0 +1,59 @@ |
|||||||
|
#!/usr/bin/bash |
||||||
|
|
||||||
|
DBUSER=root |
||||||
|
DBPASSWORD=123 |
||||||
|
BACKUPDIR=/dback |
||||||
|
HISTLOG=/tmp/history.log |
||||||
|
RULE=(0 1 2 1 2 2 2) # 0 full 1 diff 2 incr |
||||||
|
DATE=$(date "+%Y-%m-%d_%H-%M-%S") |
||||||
|
logdev=local2 |
||||||
|
|
||||||
|
full="innobackupex --user=$DBUSER --password=$DBPASSWORD $BACKUPDIR" |
||||||
|
diff="innobackupex --user=$DBUSER --password=$DBPASSWORD --incremental $BACKUPDIR --incremental-basedir=${BACKUPDIR}/" |
||||||
|
|
||||||
|
envCheck(){ |
||||||
|
mysql -u$DBUSER -p$DBPASSWORD -e "select user()" &>/dev/null |
||||||
|
if [ $? -ne 0 ];then |
||||||
|
logger -p ${logdev}.error "mysql 连接异常" && exit 2 |
||||||
|
fi |
||||||
|
if [ ! -e $BACKUPDIR ];then |
||||||
|
logger -p ${logdev}.error "备份目录未正常初始化" && \ |
||||||
|
mkdir $BACKUPDIR |
||||||
|
fi |
||||||
|
} |
||||||
|
|
||||||
|
work(){ |
||||||
|
datetime=$[`date "+%u"`-1] |
||||||
|
case ${RULE[$datetime]} in |
||||||
|
0) |
||||||
|
mv $HISTLOG $BACKUPDIR/ && \ |
||||||
|
tar cvzf /tmp/${DATE}.tar.gz $BACKUPDIR && \ |
||||||
|
logger -p ${logdev}.info "历史备份文件打包成功 /tmp/${DATE}.tar.gz" && \ |
||||||
|
rm -rf $BACKUPDIR $HISTLOG && mkdir $BACKUPDIR || \ |
||||||
|
logger -p ${logdev}.warn "历史备份文件打包异常 ${DATE}" |
||||||
|
eval $full && \ |
||||||
|
echo "full `ls $BACKUPDIR |tail -n1`" >> $HISTLOG && \ |
||||||
|
logger -p ${logdev}.info "完整备份完成 `ls $BACKUPDIR |tail -n1`" || \ |
||||||
|
logger -p ${logdev}.error "完整备份异常 ${DATE}" |
||||||
|
;; |
||||||
|
1) |
||||||
|
BEFOREDIR=$(awk '$1 ~ /full/{print $2}' $HISTLOG) |
||||||
|
eval $diff${BEFOREDIR} && \ |
||||||
|
echo "diff `ls $BACKUPDIR |tail -n1`" >> $HISTLOG && \ |
||||||
|
logger -p ${logdev}.info "差异备份完成 `ls $BACKUPDIR |tail -n1`" || \ |
||||||
|
logger -p ${logdev}.error "差异备份异常 ${DATE}" |
||||||
|
;; |
||||||
|
2) |
||||||
|
BEFOREDIR=$(tail -n1 $HISTLOG|awk '{print $2}') |
||||||
|
eval $diff${BEFOREDIR} && \ |
||||||
|
echo "incr `ls $BACKUPDIR |tail -n1`" >> $HISTLOG && \ |
||||||
|
logger -p ${logdev}.info "增量备份完成 `ls $BACKUPDIR |tail -n1`" || \ |
||||||
|
logger -p ${logdev}.error "增量备份异常 ${DATE}" |
||||||
|
;; |
||||||
|
*) |
||||||
|
echo "异常操作" |
||||||
|
;; |
||||||
|
esac |
||||||
|
} |
||||||
|
envCheck |
||||||
|
work |
@ -0,0 +1,116 @@ |
|||||||
|
#!/usr/bin/bash |
||||||
|
:<<! |
||||||
|
此版本修改了进行了更多的判断和优化处理,使程序运行更加稳定 |
||||||
|
关于密码获取问题,采用了日志形式,增加了手动方式,如果自动初始化密码失败,可以采用手动修改方式。 |
||||||
|
! |
||||||
|
|
||||||
|
# 数据库密码 |
||||||
|
custom_pass='QianFeng@123' |
||||||
|
# 数据库安装位置 |
||||||
|
install_path=/usr/local/mysql |
||||||
|
cmd_path=${install_path}/bin |
||||||
|
tmp_path=/usr/local/tmp |
||||||
|
log_path=/usr/local/log |
||||||
|
|
||||||
|
# 定义清理环境的函数 |
||||||
|
clear_env(){ |
||||||
|
yum erase mariadb mariadb-server mariadb-libs mariadb-devel -y |
||||||
|
userdel -r mysql |
||||||
|
rm -rf /etc/my* |
||||||
|
rm -rf /var/lib/mysql |
||||||
|
if [ -e $install_path ];then |
||||||
|
mv $install_path ${install_path}.bak |
||||||
|
fi |
||||||
|
echo "系统环境清理完成" |
||||||
|
sleep 1 |
||||||
|
} |
||||||
|
|
||||||
|
init_env(){ |
||||||
|
useradd -s /sbin/nologin mysql &>/dev/null |
||||||
|
mkdir -p /usr/local/{mysql,log,tmp} |
||||||
|
echo "系统环境初始化完成" |
||||||
|
sleep 1 |
||||||
|
} |
||||||
|
|
||||||
|
install_pack(){ |
||||||
|
if [ ! -e mysql-boost-5.7.27.tar.gz ];then |
||||||
|
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-boost-5.7.27.tar.gz |
||||||
|
fi |
||||||
|
tar xvzf mysql-boost-5.7.27.tar.gz && \ |
||||||
|
cd ./mysql-5.7.27/ |
||||||
|
yum -y install ncurses ncurses-devel openssl-devel bison gcc gcc-c++ make cmake && \ |
||||||
|
echo "软件包处理完成" |
||||||
|
sleep 1 |
||||||
|
} |
||||||
|
|
||||||
|
make_software(){ |
||||||
|
cmake . -DWITH_BOOST=boost/boost_1_59_0/ -DCMAKE_INSTALL_PREFIX=$install_path -DSYSCONFDIR=/etc -DMYSQL_DATADIR=$install_path/data -DINSTALL_MANDIR=/usr/share/man -DMYSQL_TCP_PORT=3306 -DMYSQL_UNIX_ADDR=$tmp_path/mysql.sock -DDEFAULT_CHARSET=utf8 -DEXTRA_CHARSETS=all -DDEFAULT_COLLATION=utf8_general_ci -DWITH_READLINE=1 -DWITH_SSL=system -DWITH_EMBEDDED_SERVER=1 -DENABLED_LOCAL_INFILE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 && \ |
||||||
|
make -j `cat /proc/cpuinfo |grep process|wc -l` && make install && \ |
||||||
|
echo "编译安装完成" |
||||||
|
cat > /etc/my.cnf <<EOF |
||||||
|
[mysqld] |
||||||
|
basedir = $install_path #安装目录 |
||||||
|
datadir = $install_path/data #数据存放目录 |
||||||
|
tmpdir = $tmp_path #/tmp缓存目录 |
||||||
|
socket = $tmp_path/mysql.sock #指定socket文件的位置 |
||||||
|
pid_file = $tmp_path/mysqld.pid #指定pid文件的位置 |
||||||
|
log_error = $log_path/mysql_error.log #错误日志的位置 |
||||||
|
slow_query_log_file = $log_path/slow_warn.log #慢日志查询 |
||||||
|
|
||||||
|
server_id = 1 #server-id=?? |
||||||
|
user = mysql #指定用户 |
||||||
|
port = 3306 #指定端口 |
||||||
|
bind-address = 0.0.0.0 #监听地址(允许所以ip访问) |
||||||
|
character-set-server = utf8 #字符集 |
||||||
|
default_storage_engine = InnoDB #引擎 |
||||||
|
|
||||||
|
EOF |
||||||
|
sleep 1 |
||||||
|
} |
||||||
|
|
||||||
|
init_db(){ |
||||||
|
chown -R mysql.mysql /usr/local/{mysql,log,tmp} |
||||||
|
pkill -9 mysql |
||||||
|
rm -rf /usr/local/mysql/data/* |
||||||
|
${cmd_path}/mysqld --initialize --user=mysql --basedir=$install_path --datadir=$install_path/data |
||||||
|
password=$(grep "temporary password" $log_path/mysql_error.log |awk '{a=$NF}END{print a}') |
||||||
|
${cmd_path}/mysqld_safe --user=mysql & |
||||||
|
sleep 10 |
||||||
|
${cmd_path}/mysqladmin -uroot -p"$password" password $custom_pass |
||||||
|
cat > /etc/profile.d/mysql.sh <<EOF |
||||||
|
export PATH=${cmd_path}:\$PATH |
||||||
|
EOF |
||||||
|
} |
||||||
|
|
||||||
|
info(){ |
||||||
|
cat <<EOF |
||||||
|
mysql 安装完成 |
||||||
|
安装目录: $install_path |
||||||
|
命令目录: $cmd_path |
||||||
|
初始密码: $custom_pass |
||||||
|
数据目录: ${install_path}/data |
||||||
|
注意:已修改环境变量,需退出终端重新登录 |
||||||
|
EOF |
||||||
|
} |
||||||
|
|
||||||
|
main(){ |
||||||
|
clear_env |
||||||
|
init_env |
||||||
|
install_pack |
||||||
|
make_software |
||||||
|
init_db |
||||||
|
info |
||||||
|
} |
||||||
|
|
||||||
|
case $1 in |
||||||
|
install) |
||||||
|
echo "开始编译安装mysql" |
||||||
|
main |
||||||
|
;; |
||||||
|
uninstall) |
||||||
|
echo "开始卸载yum 数据库环境" |
||||||
|
clear_env |
||||||
|
;; |
||||||
|
*) |
||||||
|
echo "Usage $0 sh $0 [install|uninstall]" |
||||||
|
esac |
@ -0,0 +1,93 @@ |
|||||||
|
#!/usr/bin/bash |
||||||
|
|
||||||
|
source ./color.sh |
||||||
|
source ./checkos.sh |
||||||
|
source ./init.sh |
||||||
|
# 数据库安装目录 |
||||||
|
install_dir=/usr/local/mysql |
||||||
|
# 数据存放目录 |
||||||
|
data_dir=${install_dir}/data |
||||||
|
# 配置文件存放目录 |
||||||
|
config_dir=/etc |
||||||
|
# 解压目录名称 |
||||||
|
source_dir=mysql-5.7.27 |
||||||
|
# 默认端口 |
||||||
|
port=3306 |
||||||
|
# 源码包名称 |
||||||
|
packagename="mysql-boost-5.7.27.tar.gz" |
||||||
|
# 编译线程数 |
||||||
|
cpus=`grep "processor" /proc/cpuinfo | wc -l` |
||||||
|
|
||||||
|
checkEnv(){ |
||||||
|
[ -d /var/lib/mysql ] && color yellow "检测到本机可能使用yum安装了mysql,可能会造成冲突,请问是否继续安装[Y|N]" |
||||||
|
read result |
||||||
|
if [ "$result" = 'Y' ];then |
||||||
|
color green "安装继续" |
||||||
|
else |
||||||
|
color green "退出脚本" |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
[ -d /usr/local/mysql ] && color red "检测到${install_dir}已存在,请手动处理" && exit 1 || \ |
||||||
|
color green "环境检测完成" |
||||||
|
} |
||||||
|
|
||||||
|
installPackage(){ |
||||||
|
yum -y install ncurses ncurses-devel openssl-devel bison gcc gcc-c++ make glibc automake autoconf cmake && \ |
||||||
|
color green "依赖包安装完成" || \ |
||||||
|
color red "依赖包安装异常,请修复yum源[需要官方yum以及epelyum]" |
||||||
|
color green "开始准备源码包" |
||||||
|
sed -n -e '1,/^exit 0$/!p' $0 > ./$packagename |
||||||
|
tar xvf $packagename && \ |
||||||
|
color green "源码包准备完成" && \ |
||||||
|
cd $source_dir/ |
||||||
|
cmake . \ |
||||||
|
-DWITH_BOOST=boost/boost_1_59_0/ \ |
||||||
|
-DCMAKE_INSTALL_PREFIX=$install_dir \ |
||||||
|
-DSYSCONFDIR=$config_dir \ |
||||||
|
-DMYSQL_DATADIR=$data_dir \ |
||||||
|
-DINSTALL_MANDIR=/usr/share/man \ |
||||||
|
-DMYSQL_TCP_PORT=$port \ |
||||||
|
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \ |
||||||
|
-DDEFAULT_CHARSET=utf8 \ |
||||||
|
-DEXTRA_CHARSETS=all \ |
||||||
|
-DDEFAULT_COLLATION=utf8_general_ci \ |
||||||
|
-DWITH_READLINE=1 \ |
||||||
|
-DWITH_SSL=system \ |
||||||
|
-DWITH_EMBEDDED_SERVER=1 \ |
||||||
|
-DENABLED_LOCAL_INFILE=1 \ |
||||||
|
-DWITH_INNOBASE_STORAGE_ENGINE=1 && \ |
||||||
|
make -j $cpus && make install && \ |
||||||
|
color green "编译安装完成" |
||||||
|
} |
||||||
|
|
||||||
|
down(){ |
||||||
|
cat >> /etc/profile.d/source_mysql.sh <<\EOF |
||||||
|
PATH=/usr/local/mysql/bin:$PATH |
||||||
|
export PATH |
||||||
|
EOF |
||||||
|
password=$(${install_dir}/bin/mysqld --initialize --user=mysql --basedir=$install_dir --datadir=$data_dir 2>&1 | grep "A temporary password" | awk '{print $NF}') |
||||||
|
if [ -n "$password" ];then |
||||||
|
color green "初始化完成,初始密码为$password" |
||||||
|
color green "通过mysqladmin -p$password password '新密码'进行修改密码" |
||||||
|
color green "启动数据库 mysqld_safe &\nmysql 安装完成" |
||||||
|
else |
||||||
|
color red "初始化异常,请手动检查" |
||||||
|
fi |
||||||
|
read -p '是否需要清理安装环境[Y|N]: ' ask |
||||||
|
if [ "$ask" = 'Y' ];then |
||||||
|
rm -rvf $source_dir |
||||||
|
rm -rvf $packagename |
||||||
|
color green "清理完成" |
||||||
|
else |
||||||
|
color green "脚本退出" |
||||||
|
fi |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
main(){ |
||||||
|
checkEnv |
||||||
|
installPackage |
||||||
|
down |
||||||
|
} |
||||||
|
main |
||||||
|
exit 0 |
@ -0,0 +1,81 @@ |
|||||||
|
#!/usr/bin/bash |
||||||
|
|
||||||
|
default_password="QianFeng@123" |
||||||
|
default_bakdir=/var/lib/mysql.bak |
||||||
|
|
||||||
|
checkos(){ |
||||||
|
[[ -d /var/lib/mysql ]] && \ |
||||||
|
echo "当前环境已安装mysql" |
||||||
|
#exit 1 |
||||||
|
ping -W1 -c1 www.baidu.com &>/dev/null || \ |
||||||
|
echo "网络异常,请检查" || exit 1 |
||||||
|
[[ $UID -ne 0 ]] && echo "请使用root用户执行" && exit 1 |
||||||
|
} |
||||||
|
|
||||||
|
uninstall() { |
||||||
|
pkill -9 mysql &>/dev/null |
||||||
|
mkdir -p ${default_bakdir}/`date +"%Y-%m-%d"`/$1 &>/dev/null |
||||||
|
mv /etc/my.cnf ${default_bakdir}/`date +"%Y-%m-%d"`/$1 &>/dev/null |
||||||
|
mv ~/.mysql_history ${default_bakdir}/`date +"%Y-%m-%d"`/$1 &>/dev/null |
||||||
|
mv /var/lib/mysql* ${default_bakdir}/`date +"%Y-%m-%d"`/$1 &>/dev/null |
||||||
|
yum erase -y `rpm -qa |grep mysql` && \ |
||||||
|
rm -rf /var/log/mysqld.log |
||||||
|
echo "mysql已卸载,历史数据备份在${default_bakdir}/`date +"%Y-%m-%d"`" |
||||||
|
} |
||||||
|
|
||||||
|
install(){ |
||||||
|
yum install -y yum-utils https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm || exit 2 |
||||||
|
yum-config-manager --disable mysql{80,55,56,57}-community &>/dev/null |
||||||
|
case $1 in |
||||||
|
5.7) |
||||||
|
yum-config-manager --enable mysql57-community |
||||||
|
;; |
||||||
|
5.5) |
||||||
|
yum-config-manager --enable mysql55-community |
||||||
|
;; |
||||||
|
5.6) |
||||||
|
yum-config-manager --enable mysql56-community |
||||||
|
;; |
||||||
|
8.0) |
||||||
|
yum-config-manager --enable mysql80-community |
||||||
|
;; |
||||||
|
*) |
||||||
|
echo "无效版本" |
||||||
|
exit 2 |
||||||
|
esac |
||||||
|
yum install -y mysql-community-server && \ |
||||||
|
echo "mysql 安装完成,即将开始启动" |
||||||
|
} |
||||||
|
|
||||||
|
init(){ |
||||||
|
systemctl start mysqld && \ |
||||||
|
systemctl enable mysqld |
||||||
|
password=`grep "temporary password" /var/log/mysqld.log |awk '{password=$NF}END{print password}'` |
||||||
|
cat <<EOF |
||||||
|
数据库目录安装位置 /var/lib/mysql |
||||||
|
pid 文件位置 /var/run/mysqld/mysqld.pid |
||||||
|
错误日志位置 /var/log/mysqld.log |
||||||
|
socket文件位置 /var/lib/mysql/mysql.sock |
||||||
|
初始密码为 $password # mysql 5.5 5.6版本无初始密码 |
||||||
|
最新密码为 "$default_password" #如果无法验证,请使用初始密码 |
||||||
|
历史数据备份目录 ${default_bakdir} |
||||||
|
EOF |
||||||
|
password=${password:+-p\"$password\"} |
||||||
|
mysqladmin -uroot $password password "$default_password" |
||||||
|
} |
||||||
|
|
||||||
|
case $1 in |
||||||
|
Remove) |
||||||
|
uninstall |
||||||
|
;; |
||||||
|
Install) |
||||||
|
level=$2 |
||||||
|
level=${level:=5.7} |
||||||
|
checkos |
||||||
|
uninstall $level |
||||||
|
install $level |
||||||
|
init $level |
||||||
|
;; |
||||||
|
*) |
||||||
|
echo -e "\033[31mUsage: \nsh $0 [Remove|Install]\nsh $0 Install [5.5|5.6|5.7|8.0] default 5.7\033[0m" |
||||||
|
esac |
@ -0,0 +1,365 @@ |
|||||||
|
#!/usr/bin/env bash |
||||||
|
|
||||||
|
#important variables |
||||||
|
declare -ia board # array that keeps track of game status |
||||||
|
declare -i pieces # number of pieces present on board |
||||||
|
declare -i score=0 # score variable |
||||||
|
declare -i flag_skip # flag that prevents doing more than one operation on |
||||||
|
# single field in one step |
||||||
|
declare -i moves # stores number of possible moves to determine if player lost |
||||||
|
# the game |
||||||
|
declare ESC=$'\e' # escape byte |
||||||
|
declare header="Bash 2048 v1.1 (https://github.com/mydzor/bash2048)" |
||||||
|
|
||||||
|
declare -i start_time=$(date +%s) |
||||||
|
|
||||||
|
#default config |
||||||
|
declare -i board_size=4 |
||||||
|
declare -i target=2048 |
||||||
|
declare -i reload_flag=0 |
||||||
|
declare config_dir="$HOME/.bash2048" |
||||||
|
|
||||||
|
#for colorizing numbers |
||||||
|
declare -a colors |
||||||
|
colors[2]=33 # yellow text |
||||||
|
colors[4]=32 # green text |
||||||
|
colors[8]=34 # blue text |
||||||
|
colors[16]=36 # cyan text |
||||||
|
colors[32]=35 # purple text |
||||||
|
colors[64]="33m\033[7" # yellow background |
||||||
|
colors[128]="32m\033[7" # green background |
||||||
|
colors[256]="34m\033[7" # blue background |
||||||
|
colors[512]="36m\033[7" # cyan background |
||||||
|
colors[1024]="35m\033[7" # purple background |
||||||
|
colors[2048]="31m\033[7" # red background (won with default target) |
||||||
|
|
||||||
|
exec 3>/dev/null # no logging by default |
||||||
|
|
||||||
|
trap "end_game 0 1" INT #handle INT signal |
||||||
|
|
||||||
|
#simplified replacement of seq command |
||||||
|
function _seq { |
||||||
|
local cur=1 |
||||||
|
local max |
||||||
|
local inc=1 |
||||||
|
case $# in |
||||||
|
1) let max=$1;; |
||||||
|
2) let cur=$1 |
||||||
|
let max=$2;; |
||||||
|
3) let cur=$1 |
||||||
|
let inc=$2 |
||||||
|
let max=$3;; |
||||||
|
esac |
||||||
|
while test $max -ge $cur; do |
||||||
|
printf "$cur " |
||||||
|
let cur+=inc |
||||||
|
done |
||||||
|
} |
||||||
|
|
||||||
|
# print currect status of the game, last added pieces are marked red |
||||||
|
function print_board { |
||||||
|
clear |
||||||
|
printf "$header pieces=$pieces target=$target score=$score\n" |
||||||
|
printf "Board status:\n" >&3 |
||||||
|
printf "\n" |
||||||
|
printf '/------' |
||||||
|
for l in $(_seq 1 $index_max); do |
||||||
|
printf '+------' |
||||||
|
done |
||||||
|
printf '\\\n' |
||||||
|
for l in $(_seq 0 $index_max); do |
||||||
|
printf '|' |
||||||
|
for m in $(_seq 0 $index_max); do |
||||||
|
if let ${board[l*$board_size+m]}; then |
||||||
|
if let '(last_added==(l*board_size+m))|(first_round==(l*board_size+m))'; then |
||||||
|
printf '\033[1m\033[31m %4d \033[0m|' ${board[l*$board_size+m]} |
||||||
|
else |
||||||
|
printf "\033[1m\033[${colors[${board[l*$board_size+m]}]}m %4d\033[0m |" ${board[l*$board_size+m]} |
||||||
|
fi |
||||||
|
printf " %4d |" ${board[l*$board_size+m]} >&3 |
||||||
|
else |
||||||
|
printf ' |' |
||||||
|
printf ' |' >&3 |
||||||
|
fi |
||||||
|
done |
||||||
|
let l==$index_max || { |
||||||
|
printf '\n|------' |
||||||
|
for l in $(_seq 1 $index_max); do |
||||||
|
printf '+------' |
||||||
|
done |
||||||
|
printf '|\n' |
||||||
|
printf '\n' >&3 |
||||||
|
} |
||||||
|
done |
||||||
|
printf '\n\\------' |
||||||
|
for l in $(_seq 1 $index_max); do |
||||||
|
printf '+------' |
||||||
|
done |
||||||
|
printf '/\n' |
||||||
|
} |
||||||
|
|
||||||
|
# Generate new piece on the board |
||||||
|
# inputs: |
||||||
|
# $board - original state of the game board |
||||||
|
# $pieces - original number of pieces |
||||||
|
# outputs: |
||||||
|
# $board - new state of the game board |
||||||
|
# $pieces - new number of pieces |
||||||
|
function generate_piece { |
||||||
|
while true; do |
||||||
|
let pos=RANDOM%fields_total |
||||||
|
let board[$pos] || { |
||||||
|
let value=RANDOM%10?2:4 |
||||||
|
board[$pos]=$value |
||||||
|
last_added=$pos |
||||||
|
printf "Generated new piece with value $value at position [$pos]\n" >&3 |
||||||
|
break; |
||||||
|
} |
||||||
|
done |
||||||
|
let pieces++ |
||||||
|
} |
||||||
|
|
||||||
|
# perform push operation between two pieces |
||||||
|
# inputs: |
||||||
|
# $1 - push position, for horizontal push this is row, for vertical column |
||||||
|
# $2 - recipient piece, this will hold result if moving or joining |
||||||
|
# $3 - originator piece, after moving or joining this will be left empty |
||||||
|
# $4 - direction of push, can be either "up", "down", "left" or "right" |
||||||
|
# $5 - if anything is passed, do not perform the push, only update number |
||||||
|
# of valid moves |
||||||
|
# $board - original state of the game board |
||||||
|
# outputs: |
||||||
|
# $change - indicates if the board was changed this round |
||||||
|
# $flag_skip - indicates that recipient piece cannot be modified further |
||||||
|
# $board - new state of the game board |
||||||
|
function push_pieces { |
||||||
|
case $4 in |
||||||
|
"up") |
||||||
|
let "first=$2*$board_size+$1" |
||||||
|
let "second=($2+$3)*$board_size+$1" |
||||||
|
;; |
||||||
|
"down") |
||||||
|
let "first=(index_max-$2)*$board_size+$1" |
||||||
|
let "second=(index_max-$2-$3)*$board_size+$1" |
||||||
|
;; |
||||||
|
"left") |
||||||
|
let "first=$1*$board_size+$2" |
||||||
|
let "second=$1*$board_size+($2+$3)" |
||||||
|
;; |
||||||
|
"right") |
||||||
|
let "first=$1*$board_size+(index_max-$2)" |
||||||
|
let "second=$1*$board_size+(index_max-$2-$3)" |
||||||
|
;; |
||||||
|
esac |
||||||
|
let ${board[$first]} || { |
||||||
|
let ${board[$second]} && { |
||||||
|
if test -z $5; then |
||||||
|
board[$first]=${board[$second]} |
||||||
|
let board[$second]=0 |
||||||
|
let change=1 |
||||||
|
printf "move piece with value ${board[$first]} from [$second] to [$first]\n" >&3 |
||||||
|
else |
||||||
|
let moves++ |
||||||
|
fi |
||||||
|
return |
||||||
|
} |
||||||
|
return |
||||||
|
} |
||||||
|
let ${board[$second]} && let flag_skip=1 |
||||||
|
let "${board[$first]}==${board[second]}" && { |
||||||
|
if test -z $5; then |
||||||
|
let board[$first]*=2 |
||||||
|
let "board[$first]==$target" && end_game 1 |
||||||
|
let board[$second]=0 |
||||||
|
let pieces-=1 |
||||||
|
let change=1 |
||||||
|
let score+=${board[$first]} |
||||||
|
printf "joined piece from [$second] with [$first], new value=${board[$first]}\n" >&3 |
||||||
|
else |
||||||
|
let moves++ |
||||||
|
fi |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
function apply_push { |
||||||
|
printf "\n\ninput: $1 key\n" >&3 |
||||||
|
for i in $(_seq 0 $index_max); do |
||||||
|
for j in $(_seq 0 $index_max); do |
||||||
|
flag_skip=0 |
||||||
|
let increment_max=index_max-j |
||||||
|
for k in $(_seq 1 $increment_max); do |
||||||
|
let flag_skip && break |
||||||
|
push_pieces $i $j $k $1 $2 |
||||||
|
done |
||||||
|
done |
||||||
|
done |
||||||
|
} |
||||||
|
|
||||||
|
function check_moves { |
||||||
|
let moves=0 |
||||||
|
apply_push up fake |
||||||
|
apply_push down fake |
||||||
|
apply_push left fake |
||||||
|
apply_push right fake |
||||||
|
} |
||||||
|
|
||||||
|
function key_react { |
||||||
|
let change=0 |
||||||
|
read -d '' -sn 1 |
||||||
|
test "$REPLY" = "$ESC" && { |
||||||
|
read -d '' -sn 1 -t1 |
||||||
|
test "$REPLY" = "[" && { |
||||||
|
read -d '' -sn 1 -t1 |
||||||
|
case $REPLY in |
||||||
|
A) apply_push up;; |
||||||
|
B) apply_push down;; |
||||||
|
C) apply_push right;; |
||||||
|
D) apply_push left;; |
||||||
|
esac |
||||||
|
} |
||||||
|
} || { |
||||||
|
case $REPLY in |
||||||
|
k) apply_push up;; |
||||||
|
j) apply_push down;; |
||||||
|
l) apply_push right;; |
||||||
|
h) apply_push left;; |
||||||
|
|
||||||
|
w) apply_push up;; |
||||||
|
s) apply_push down;; |
||||||
|
d) apply_push right;; |
||||||
|
a) apply_push left;; |
||||||
|
esac |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
function save_game { |
||||||
|
rm -rf "$config_dir" |
||||||
|
mkdir "$config_dir" |
||||||
|
echo "${board[@]}" > "$config_dir/board" |
||||||
|
echo "$board_size" > "$config_dir/board_size" |
||||||
|
echo "$pieces" > "$config_dir/pieces" |
||||||
|
echo "$target" > "$config_dir/target" |
||||||
|
# echo "$log_file" > "$config_dir/log_file" |
||||||
|
echo "$score" > "$config_dir/score" |
||||||
|
echo "$first_round" > "$config_dir/first_round" |
||||||
|
} |
||||||
|
|
||||||
|
function reload_game { |
||||||
|
printf "Loading saved game...\n" >&3 |
||||||
|
|
||||||
|
if test ! -d "$config_dir"; then |
||||||
|
return |
||||||
|
fi |
||||||
|
board=(`cat "$config_dir/board"`) |
||||||
|
board_size=(`cat "$config_dir/board_size"`) |
||||||
|
board=(`cat "$config_dir/board"`) |
||||||
|
pieces=(`cat "$config_dir/pieces"`) |
||||||
|
first_round=(`cat "$config_dir/first_round"`) |
||||||
|
target=(`cat "$config_dir/target"`) |
||||||
|
score=(`cat "$config_dir/score"`) |
||||||
|
|
||||||
|
fields_total=board_size*board_size |
||||||
|
index_max=board_size-1 |
||||||
|
} |
||||||
|
|
||||||
|
function end_game { |
||||||
|
# count game duration |
||||||
|
end_time=$(date +%s) |
||||||
|
let total_time=end_time-start_time |
||||||
|
|
||||||
|
print_board |
||||||
|
printf "Your score: $score\n" |
||||||
|
|
||||||
|
printf "This game lasted " |
||||||
|
|
||||||
|
`date --version > /dev/null 2>&1` |
||||||
|
if [[ "$?" -eq 0 ]]; then |
||||||
|
date -u -d @${total_time} +%T |
||||||
|
else |
||||||
|
date -u -r ${total_time} +%T |
||||||
|
fi |
||||||
|
|
||||||
|
stty echo |
||||||
|
let $1 && { |
||||||
|
printf "Congratulations you have achieved $target\n" |
||||||
|
exit 0 |
||||||
|
} |
||||||
|
let test -z $2 && { |
||||||
|
read -n1 -p "Do you want to overwrite saved game? [y|N]: " |
||||||
|
test "$REPLY" = "Y" || test "$REPLY" = "y" && { |
||||||
|
save_game |
||||||
|
printf "\nGame saved. Use -r option next to load this game.\n" |
||||||
|
exit 0 |
||||||
|
} |
||||||
|
test "$REPLY" = "" && { |
||||||
|
printf "\nGame not saved.\n" |
||||||
|
exit 0 |
||||||
|
} |
||||||
|
} |
||||||
|
printf "\nYou have lost, better luck next time.\033[0m\n" |
||||||
|
exit 0 |
||||||
|
} |
||||||
|
|
||||||
|
function help { |
||||||
|
cat <<END_HELP |
||||||
|
Usage: $1 [-b INTEGER] [-t INTEGER] [-l FILE] [-r] [-h] |
||||||
|
|
||||||
|
-b specify game board size (sizes 3-9 allowed) |
||||||
|
-t specify target score to win (needs to be power of 2) |
||||||
|
-l log debug info into specified file |
||||||
|
-r reload the previous game |
||||||
|
-h this help |
||||||
|
|
||||||
|
END_HELP |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
#parse commandline options |
||||||
|
while getopts "b:t:l:rh" opt; do |
||||||
|
case $opt in |
||||||
|
b ) board_size="$OPTARG" |
||||||
|
let '(board_size>=3)&(board_size<=9)' || { |
||||||
|
printf "Invalid board size, please choose size between 3 and 9\n" |
||||||
|
exit -1 |
||||||
|
};; |
||||||
|
t ) target="$OPTARG" |
||||||
|
printf "obase=2;$target\n" | bc | grep -e '^1[^1]*$' |
||||||
|
let $? && { |
||||||
|
printf "Invalid target, has to be power of two\n" |
||||||
|
exit -1 |
||||||
|
};; |
||||||
|
r ) reload_flag="1";; |
||||||
|
h ) help $0 |
||||||
|
exit 0;; |
||||||
|
l ) exec 3>$OPTARG;; |
||||||
|
\?) printf "Invalid option: -"$opt", try $0 -h\n" >&2 |
||||||
|
exit 1;; |
||||||
|
: ) printf "Option -"$opt" requires an argument, try $0 -h\n" >&2 |
||||||
|
exit 1;; |
||||||
|
esac |
||||||
|
done |
||||||
|
|
||||||
|
#init board |
||||||
|
let fields_total=board_size*board_size |
||||||
|
let index_max=board_size-1 |
||||||
|
for i in $(_seq 0 $fields_total); do board[$i]="0"; done |
||||||
|
let pieces=0 |
||||||
|
generate_piece |
||||||
|
first_round=$last_added |
||||||
|
generate_piece |
||||||
|
|
||||||
|
#load saved game if flag is set |
||||||
|
if test $reload_flag = "1"; then |
||||||
|
reload_game |
||||||
|
fi |
||||||
|
|
||||||
|
while true; do |
||||||
|
print_board |
||||||
|
key_react |
||||||
|
let change && generate_piece |
||||||
|
first_round=-1 |
||||||
|
let pieces==fields_total && { |
||||||
|
check_moves |
||||||
|
let moves==0 && end_game 0 #lose the game |
||||||
|
} |
||||||
|
done |
@ -0,0 +1,77 @@ |
|||||||
|
#!/usr/bin/bash |
||||||
|
|
||||||
|
echo -e "\033[31m 1. 防火墙 Selinux 设置 \033[0m" \ |
||||||
|
&& if [ "$(systemctl status firewalld | grep running)" != "" ]; then firewall-cmd --zone=public --add-port=80/tcp --permanent; firewall-cmd --zone=public --add-port=2222/tcp --permanent; firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="172.17.0.0/16" port protocol="tcp" port="8080" accept"; firewall-cmd --reload; fi \ |
||||||
|
&& if [ "$(getenforce)" != "Disabled" ]; then setsebool -P httpd_can_network_connect 1; fi |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
echo -e "\033[31m 2. 部署环境 \033[0m" \ |
||||||
|
&& yum update -y \ |
||||||
|
&& ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ |
||||||
|
&& yum -y install kde-l10n-Chinese \ |
||||||
|
&& localedef -c -f UTF-8 -i zh_CN zh_CN.UTF-8 \ |
||||||
|
&& export LC_ALL=zh_CN.UTF-8 \ |
||||||
|
&& echo 'LANG="zh_CN.UTF-8"' > /etc/locale.conf \ |
||||||
|
&& yum -y install wget gcc epel-release git \ |
||||||
|
&& yum install -y yum-utils device-mapper-persistent-data lvm2 \ |
||||||
|
&& yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo \ |
||||||
|
&& yum makecache fast \ |
||||||
|
&& rpm --import https://mirrors.aliyun.com/docker-ce/linux/centos/gpg \ |
||||||
|
&& echo -e "[nginx-stable]\nname=nginx stable repo\nbaseurl=http://nginx.org/packages/centos/\$releasever/\$basearch/\ngpgcheck=1\nenabled=1\ngpgkey=https://nginx.org/keys/nginx_signing.key" > /etc/yum.repos.d/nginx.repo \ |
||||||
|
&& rpm --import https://nginx.org/keys/nginx_signing.key \ |
||||||
|
&& yum -y install redis mariadb mariadb-devel mariadb-server mariadb-shared nginx docker-ce \ |
||||||
|
&& systemctl enable redis mariadb nginx docker \ |
||||||
|
&& systemctl start redis mariadb \ |
||||||
|
&& yum -y install python36 python36-devel \ |
||||||
|
&& python3.6 -m venv /opt/py3 |
||||||
|
|
||||||
|
|
||||||
|
echo -e "\033[31m 3. 下载组件 \033[0m" \ |
||||||
|
&& cd /opt \ |
||||||
|
&& if [ ! -d "/opt/jumpserver" ]; then git clone --depth=1 https://github.com/jumpserver/jumpserver.git; fi \ |
||||||
|
&& if [ ! -f "/opt/luna.tar.gz" ]; then wget https://demo.jumpserver.org/download/luna/1.5.0/luna.tar.gz; tar xf luna.tar.gz; chown -R root:root luna; fi \ |
||||||
|
&& yum -y install $(cat /opt/jumpserver/requirements/rpm_requirements.txt) \ |
||||||
|
&& source /opt/py3/bin/activate \ |
||||||
|
&& pip install --upgrade pip setuptools -i https://mirrors.aliyun.com/pypi/simple/ \ |
||||||
|
&& pip install -r /opt/jumpserver/requirements/requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ \ |
||||||
|
&& curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io \ |
||||||
|
&& systemctl restart docker \ |
||||||
|
&& docker pull jumpserver/jms_koko:1.5.0 \ |
||||||
|
&& docker pull jumpserver/jms_guacamole:1.5.0 \ |
||||||
|
&& rm -rf /etc/nginx/conf.d/default.conf \ |
||||||
|
&& wget -O /etc/nginx/conf.d/jumpserver.conf https://demo.jumpserver.org/download/nginx/conf.d/jumpserver.conf |
||||||
|
|
||||||
|
|
||||||
|
echo -e "\033[31m 4. 处理配置文件 \033[0m" \ |
||||||
|
&& if [ "$DB_PASSWORD" = "" ]; then DB_PASSWORD=`cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 24`; fi \ |
||||||
|
&& if [ "$SECRET_KEY" = "" ]; then SECRET_KEY=`cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 50`; echo "SECRET_KEY=$SECRET_KEY" >> ~/.bashrc; fi \ |
||||||
|
&& if [ "$BOOTSTRAP_TOKEN" = "" ]; then BOOTSTRAP_TOKEN=`cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 16`; echo "BOOTSTRAP_TOKEN=$BOOTSTRAP_TOKEN" >> ~/.bashrc; fi \ |
||||||
|
&& if [ "$Server_IP" = "" ]; then Server_IP=`ip addr | grep inet | egrep -v '(127.0.0.1|inet6|docker)' | awk '{print $2}' | tr -d "addr:" | head -n 1 | cut -d / -f1`; fi \ |
||||||
|
&& if [ ! -d "/var/lib/mysql/jumpserver" ]; then mysql -uroot -e "create database jumpserver default charset 'utf8';grant all on jumpserver.* to 'jumpserver'@'127.0.0.1' identified by '$DB_PASSWORD';flush privileges;"; fi \ |
||||||
|
&& if [ ! -f "/opt/jumpserver/config.yml" ]; then cp /opt/jumpserver/config_example.yml /opt/jumpserver/config.yml; sed -i "s/SECRET_KEY:/SECRET_KEY: $SECRET_KEY/g" /opt/jumpserver/config.yml; sed -i "s/BOOTSTRAP_TOKEN:/BOOTSTRAP_TOKEN: $BOOTSTRAP_TOKEN/g" /opt/jumpserver/config.yml; sed -i "s/# DEBUG: true/DEBUG: false/g" /opt/jumpserver/config.yml; sed -i "s/# LOG_LEVEL: DEBUG/LOG_LEVEL: ERROR/g" /opt/jumpserver/config.yml; sed -i "s/# SESSION_EXPIRE_AT_BROWSER_CLOSE: false/SESSION_EXPIRE_AT_BROWSER_CLOSE: true/g" /opt/jumpserver/config.yml; sed -i "s/DB_PASSWORD: /DB_PASSWORD: $DB_PASSWORD/g" /opt/jumpserver/config.yml; fi |
||||||
|
|
||||||
|
|
||||||
|
echo -e "\033[31m 5. 启动 Jumpserver \033[0m" \ |
||||||
|
&& systemctl start nginx \ |
||||||
|
&& cd /opt/jumpserver \ |
||||||
|
&& ./jms start all -d \ |
||||||
|
&& docker run --name jms_koko -d -p 2222:2222 -p 5000:5000 -e CORE_HOST=http://$Server_IP:8080 -e BOOTSTRAP_TOKEN=$BOOTSTRAP_TOKEN -e LOG_LEVEL=ERROR jumpserver/jms_koko:1.5.0 \ |
||||||
|
&& docker run --name jms_guacamole -d -p 8081:8081 -e JUMPSERVER_SERVER=http://$Server_IP:8080 -e BOOTSTRAP_TOKEN=$BOOTSTRAP_TOKEN jumpserver/jms_guacamole:1.5.0 \ |
||||||
|
&& echo -e "\033[31m 你的数据库密码是 $DB_PASSWORD \033[0m" \ |
||||||
|
&& echo -e "\033[31m 你的SECRET_KEY是 $SECRET_KEY \033[0m" \ |
||||||
|
&& echo -e "\033[31m 你的BOOTSTRAP_TOKEN是 $BOOTSTRAP_TOKEN \033[0m" \ |
||||||
|
&& echo -e "\033[31m 你的服务器IP是 $Server_IP \033[0m" \ |
||||||
|
&& echo -e "\033[31m 请打开浏览器访问 http://$Server_IP 用户名:admin 密码:admin \033[0m" |
||||||
|
|
||||||
|
|
||||||
|
echo -e "\033[31m 6. 配置自启 \033[0m" \ |
||||||
|
&& if [ ! -f "/usr/lib/systemd/system/jms.service" ]; then wget -O /usr/lib/systemd/system/jms.service https://demo.jumpserver.org/download/shell/centos/jms.service; chmod 755 /usr/lib/systemd/system/jms.service; fi \ |
||||||
|
&& if [ ! -f "/opt/start_jms.sh" ]; then wget -O /opt/start_jms.sh https://demo.jumpserver.org/download/shell/centos/start_jms.sh; fi \ |
||||||
|
&& if [ ! -f "/opt/stop_jms.sh" ]; then wget -O /opt/stop_jms.sh https://demo.jumpserver.org/download/shell/centos/stop_jms.sh; fi \ |
||||||
|
&& if [ "$(cat /etc/rc.local | grep start_jms.sh)" == "" ]; then echo "sh /opt/start_jms.sh" >> /etc/rc.local; chmod +x /etc/rc.d/rc.local; fi \ |
||||||
|
&& echo -e "\033[31m 启动停止的脚本在 /opt 目录下, 如果自启失败可以手动启动 \033[0m" |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,215 @@ |
|||||||
|
#!/bin/bash |
||||||
|
|
||||||
|
# filename: snake.sh |
||||||
|
# snake game |
||||||
|
# Author: |
||||||
|
|
||||||
|
good_game=( |
||||||
|
' ' |
||||||
|
' G A M E O V E R ! ' |
||||||
|
' ' |
||||||
|
' Score: ' |
||||||
|
' press q to quit ' |
||||||
|
' press n to start a new game ' |
||||||
|
' press s to change the speed ' |
||||||
|
' ' |
||||||
|
); |
||||||
|
|
||||||
|
game_start=( |
||||||
|
' ' |
||||||
|
' ~~~ S N A K E ~~~ ' |
||||||
|
' ' |
||||||
|
' Author: LKJ ' |
||||||
|
' space or enter pause/play ' |
||||||
|
' q quit at any time ' |
||||||
|
' s change the speed ' |
||||||
|
' ' |
||||||
|
' Press <Enter> to start the game ' |
||||||
|
' ' |
||||||
|
); |
||||||
|
|
||||||
|
snake_exit() { #退出游戏 |
||||||
|
stty echo; #恢复回显 |
||||||
|
tput rmcup; #恢复屏幕 |
||||||
|
tput cvvis; #恢复光标 |
||||||
|
exit 0; |
||||||
|
} |
||||||
|
|
||||||
|
draw_gui() { # 画边框 |
||||||
|
clear; |
||||||
|
color="\033[34m*\033[0m"; |
||||||
|
for (( i = 0; i < $1; i++ )); do |
||||||
|
echo -ne "\033[$i;0H${color}"; |
||||||
|
echo -ne "\033[$i;$2H${color}"; |
||||||
|
done |
||||||
|
|
||||||
|
for (( i = 0; i <= $2; i++ )); do |
||||||
|
echo -ne "\033[0;${i}H${color}"; |
||||||
|
echo -ne "\033[$1;${i}H${color}"; |
||||||
|
done |
||||||
|
|
||||||
|
ch_speed 0; |
||||||
|
echo -ne "\033[$Lines;$((yscore-10))H\033[36mScores: 0\033[0m"; |
||||||
|
echo -en "\033[$Lines;$((Cols-50))H\033[33mPress <space> or enter to pause game\033[0m"; |
||||||
|
} |
||||||
|
|
||||||
|
snake_init() { |
||||||
|
Lines=`tput lines`; Cols=`tput cols`; #得到屏幕的长宽 |
||||||
|
xline=$((Lines/2)); ycols=4; #开始的位置 |
||||||
|
xscore=$Lines; yscore=$((Cols/2)); #打印分数的位置 |
||||||
|
xcent=$xline; ycent=$yscore; #中心点位置 |
||||||
|
xrand=0; yrand=0; #随机点 |
||||||
|
sumscore=0; liveflag=1; #总分和点存在标记 |
||||||
|
sumnode=0; foodscore=0; #总共要加长的节点和点的分数 |
||||||
|
|
||||||
|
snake="0000 "; #初始化贪吃蛇 |
||||||
|
pos=(right right right right right); #开始节点的方向 |
||||||
|
xpt=($xline $xline $xline $xline $xline); #开始的各个节点的x坐标 |
||||||
|
ypt=(5 4 3 2 1); #开始的各个节点的y坐标 |
||||||
|
speed=(0.05 0.1 0.15); spk=${spk:-1}; #速度 默认速度 |
||||||
|
|
||||||
|
draw_gui $((Lines-1)) $Cols |
||||||
|
} |
||||||
|
|
||||||
|
game_pause() { #暂定游戏 |
||||||
|
echo -en "\033[$Lines;$((Cols-50))H\033[33mGame paused, Use space or enter key to continue\033[0m"; |
||||||
|
while read -n 1 space; do |
||||||
|
[[ ${space:-enter} = enter ]] && \ |
||||||
|
echo -en "\033[$Lines;$((Cols-50))H\033[33mPress <space> or enter to pause game \033[0m" && return; |
||||||
|
[[ ${space:-enter} = q ]] && snake_exit; |
||||||
|
done |
||||||
|
} |
||||||
|
|
||||||
|
# $1 节点位置 |
||||||
|
update() { #更新各个节点坐标 |
||||||
|
case ${pos[$1]} in |
||||||
|
right) ((ypt[$1]++));; |
||||||
|
left) ((ypt[$1]--));; |
||||||
|
down) ((xpt[$1]++));; |
||||||
|
up) ((xpt[$1]--));; |
||||||
|
esac |
||||||
|
} |
||||||
|
|
||||||
|
ch_speed() { #更新速度 |
||||||
|
[[ $# -eq 0 ]] && spk=$(((spk+1)%3)); |
||||||
|
case $spk in |
||||||
|
0) temp="Fast ";; |
||||||
|
1) temp="Medium";; |
||||||
|
2) temp="Slow ";; |
||||||
|
esac |
||||||
|
echo -ne "\033[$Lines;3H\033[33mSpeed: $temp\033[0m"; |
||||||
|
} |
||||||
|
|
||||||
|
Gooooo() { #更新方向 |
||||||
|
case ${key:-enter} in |
||||||
|
j|J) [[ ${pos[0]} != "up" ]] && pos[0]="down";; |
||||||
|
k|K) [[ ${pos[0]} != "down" ]] && pos[0]="up";; |
||||||
|
h|H) [[ ${pos[0]} != "right" ]] && pos[0]="left";; |
||||||
|
l|L) [[ ${pos[0]} != "left" ]] && pos[0]="right";; |
||||||
|
s|S) ch_speed;; |
||||||
|
q|Q) snake_exit;; |
||||||
|
enter) game_pause;; |
||||||
|
esac |
||||||
|
} |
||||||
|
|
||||||
|
add_node() { #增加节点 |
||||||
|
snake="0$snake"; |
||||||
|
pos=(${pos[0]} ${pos[@]}); |
||||||
|
xpt=(${xpt[0]} ${xpt[@]}); |
||||||
|
ypt=(${ypt[0]} ${ypt[@]}); |
||||||
|
update 0; |
||||||
|
|
||||||
|
local x=${xpt[0]} y=${ypt[0]} |
||||||
|
(( ((x>=$((Lines-1)))) || ((x<=1)) || ((y>=Cols)) || ((y<=1)) )) && return 1; #撞墙 |
||||||
|
|
||||||
|
for (( i = $((${#snake}-1)); i > 0; i-- )); do |
||||||
|
(( ${xpt[0]} == ${xpt[$i]} && ${ypt[0]} == ${ypt[$i]} )) && return 1; #crashed |
||||||
|
done |
||||||
|
|
||||||
|
echo -ne "\033[${xpt[0]};${ypt[0]}H\033[32m${snake[@]:0:1}\033[0m"; |
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
mk_random() { #产生随机点和随机数 |
||||||
|
xrand=$((RANDOM%(Lines-3)+2)); |
||||||
|
yrand=$((RANDOM%(Cols-2)+2)); |
||||||
|
foodscore=$((RANDOM%9+1)); |
||||||
|
|
||||||
|
echo -ne "\033[$xrand;${yrand}H$foodscore"; |
||||||
|
liveflag=0; |
||||||
|
} |
||||||
|
|
||||||
|
new_game() { #重新开始新游戏 |
||||||
|
snake_init; |
||||||
|
while true; do |
||||||
|
read -t ${speed[$spk]} -n 1 key; |
||||||
|
[[ $? -eq 0 ]] && Gooooo; |
||||||
|
|
||||||
|
((liveflag==0)) || mk_random; |
||||||
|
if (( sumnode > 0 )); then |
||||||
|
((sumnode--)); |
||||||
|
add_node; (($?==0)) || return 1; |
||||||
|
else |
||||||
|
update 0; |
||||||
|
echo -ne "\033[${xpt[0]};${ypt[0]}H\033[32m${snake[@]:0:1}\033[0m"; |
||||||
|
|
||||||
|
for (( i = $((${#snake}-1)); i > 0; i-- )); do |
||||||
|
update $i; |
||||||
|
echo -ne "\033[${xpt[$i]};${ypt[$i]}H\033[32m${snake[@]:$i:1}\033[0m"; |
||||||
|
|
||||||
|
(( ${xpt[0]} == ${xpt[$i]} && ${ypt[0]} == ${ypt[$i]} )) && return 1; #crashed |
||||||
|
[[ ${pos[$((i-1))]} = ${pos[$i]} ]] || pos[$i]=${pos[$((i-1))]}; |
||||||
|
done |
||||||
|
fi |
||||||
|
|
||||||
|
local x=${xpt[0]} y=${ypt[0]} |
||||||
|
(( ((x>=$((Lines-1)))) || ((x<=1)) || ((y>=Cols)) || ((y<=1)) )) && return 1; #撞墙 |
||||||
|
|
||||||
|
(( x==xrand && y==yrand )) && ((liveflag=1)) && ((sumnode+=foodscore)) && ((sumscore+=foodscore)); |
||||||
|
|
||||||
|
echo -ne "\033[$xscore;$((yscore-2))H$sumscore"; |
||||||
|
done |
||||||
|
} |
||||||
|
|
||||||
|
print_good_game() { |
||||||
|
local x=$((xcent-4)) y=$((ycent-25)) |
||||||
|
for (( i = 0; i < 8; i++ )); do |
||||||
|
echo -ne "\033[$((x+i));${y}H\033[45m${good_game[$i]}\033[0m"; |
||||||
|
done |
||||||
|
echo -ne "\033[$((x+3));$((ycent+1))H\033[45m${sumscore}\033[0m"; |
||||||
|
} |
||||||
|
|
||||||
|
print_game_start() { |
||||||
|
snake_init; |
||||||
|
|
||||||
|
local x=$((xcent-5)) y=$((ycent-25)) |
||||||
|
for (( i = 0; i < 10; i++ )); do |
||||||
|
echo -ne "\033[$((x+i));${y}H\033[45m${game_start[$i]}\033[0m"; |
||||||
|
done |
||||||
|
|
||||||
|
while read -n 1 anykey; do |
||||||
|
[[ ${anykey:-enter} = enter ]] && break; |
||||||
|
[[ ${anykey:-enter} = q ]] && snake_exit; |
||||||
|
[[ ${anykey:-enter} = s ]] && ch_speed; |
||||||
|
done |
||||||
|
|
||||||
|
while true; do |
||||||
|
new_game; |
||||||
|
print_good_game; |
||||||
|
while read -n 1 anykey; do |
||||||
|
[[ $anykey = n ]] && break; |
||||||
|
[[ $anykey = q ]] && snake_exit; |
||||||
|
done |
||||||
|
done |
||||||
|
} |
||||||
|
|
||||||
|
game_main() { |
||||||
|
trap 'snake_exit;' SIGTERM SIGINT; |
||||||
|
stty -echo; #取消回显 |
||||||
|
tput civis; #隐藏光标 |
||||||
|
tput smcup; clear; #保存屏幕并清屏 |
||||||
|
|
||||||
|
print_game_start; #开始游戏 |
||||||
|
} |
||||||
|
|
||||||
|
game_main; |
@ -0,0 +1,635 @@ |
|||||||
|
#!/bin/bash |
||||||
|
# filename: tetris.sh |
||||||
|
# |
||||||
|
# Author: |
||||||
|
# Date: 2013.5.14 |
||||||
|
# Email: |
||||||
|
# |
||||||
|
|
||||||
|
# const value |
||||||
|
#======================================固定值================================# |
||||||
|
BXLINES=3; BXCOLNS=6; # 小方块的高和宽 |
||||||
|
MAPX=20; MAPY=10; |
||||||
|
NAME=('I' 'S' 'Z' 'L' 'J' 'T' 'O'); |
||||||
|
FLAG=('2' '2' '2' '4' '4' '4' '1'); |
||||||
|
|
||||||
|
declare -A mapflag mapname; |
||||||
|
mapflag=([I]=2 [S]=2 [Z]=2 [L]=4 [J]=4 [T]=4 [O]=1); |
||||||
|
mapname=([I]=1 [S]=2 [Z]=3 [L]=4 [J]=5 [T]=6 [O]=7); |
||||||
|
colorone=(31 32 33 34 35 36 37); |
||||||
|
colortwo=(31 32 33 34 35 36 37); |
||||||
|
|
||||||
|
Iax=( 0 0 0 0); Iay=(-1 0 1 2); |
||||||
|
Ibx=(-1 0 1 2); Iby=( 0 0 0 0); |
||||||
|
|
||||||
|
Sax=( 1 1 0 0); Say=(-1 0 0 1); |
||||||
|
Sbx=(-1 0 0 1); Sby=( 0 0 1 1); |
||||||
|
|
||||||
|
Zax=( 0 0 1 1); Zay=(-1 0 0 1); |
||||||
|
Zbx=(-1 0 0 1); Zby=( 1 1 0 0); |
||||||
|
|
||||||
|
Lax=(-1 0 1 1); Lay=( 0 0 0 -1); |
||||||
|
Lbx=(-1 0 0 0); Lby=(-1 -1 0 1); |
||||||
|
Lcx=(-1 -1 0 1);Lcy=( 1 0 0 0); |
||||||
|
Ldx=( 0 0 0 1); Ldy=(-1 0 1 1); |
||||||
|
|
||||||
|
Jax=(-1 0 1 1); Jay=( 0 0 0 1); |
||||||
|
Jbx=( 1 0 0 0); Jby=(-1 -1 0 1); |
||||||
|
Jcx=(-1 -1 0 1);Jcy=(-1 0 0 0); |
||||||
|
Jdx=( 0 0 0 -1);Jdy=(-1 0 1 1); |
||||||
|
|
||||||
|
Tax=(0 0 0 -1); Tay=(-1 0 1 0); |
||||||
|
Tbx=(-1 0 1 0); Tby=( 0 0 0 1); |
||||||
|
Tcx=( 0 0 0 1); Tcy=(-1 0 1 0); |
||||||
|
Tdx=(-1 0 1 0); Tdy=(0 0 0 -1); |
||||||
|
|
||||||
|
Oax=( 0 0 1 1); Oay=( 0 1 0 1); |
||||||
|
|
||||||
|
good_game=( |
||||||
|
' ' |
||||||
|
' G A M E O V E R ! ' |
||||||
|
' ' |
||||||
|
' Score: ' |
||||||
|
' ' |
||||||
|
' press Q to quit ' |
||||||
|
' press N to start a new game ' |
||||||
|
' press S to change the level ' |
||||||
|
' press R to replay your game ' |
||||||
|
' ' |
||||||
|
); |
||||||
|
|
||||||
|
start_game=( |
||||||
|
' ' |
||||||
|
' ~~~ T E T R I S ~~~ ' |
||||||
|
' ' |
||||||
|
' Author: LKJ ' |
||||||
|
' ' |
||||||
|
' press S to change the level ' |
||||||
|
' ' |
||||||
|
' C H O O S E L E V E L: ' |
||||||
|
' 1 ' |
||||||
|
' ' |
||||||
|
' Press <Enter> to start the game ' |
||||||
|
' ' |
||||||
|
); |
||||||
|
|
||||||
|
blockarr=(); #记录name 和 flag |
||||||
|
keyarray=(); #记录按键 |
||||||
|
#------------------------------------------------------------------------# |
||||||
|
|
||||||
|
#========================================================================# |
||||||
|
game_init() { # game_init |
||||||
|
SCLINES=`tput lines`; # 屏幕的高 |
||||||
|
SCCOLNS=`tput cols`; # 屏幕的宽 |
||||||
|
|
||||||
|
#主框的属性 |
||||||
|
mainw=59; mainh=60; # 主框的宽和高 |
||||||
|
mainctx=0; maincty=4; # 主框中心打印点 |
||||||
|
upx=$((SCLINES-62)); dnx=$((SCLINES-1)); # 界面的上下 x |
||||||
|
lty=$((SCCOLNS/2-50)); rty=$((lty+61)); # 界面的左右 y |
||||||
|
|
||||||
|
#next的属性 |
||||||
|
nextw=40; nexth=16; # next框的高和宽 |
||||||
|
ntx=$((upx)); nty=$((rty+2)); # next框的位置 |
||||||
|
ntctx=$((ntx+5)); ntcty=$((nty+12)); # next框的中心打印位置 |
||||||
|
|
||||||
|
#score的属性 |
||||||
|
scorw=$nextw; scorh=5; |
||||||
|
scx=$((ntx+20)); scy=$((nty)); |
||||||
|
scctx=$((scx+4)); sccty=$((scy+19)); |
||||||
|
|
||||||
|
#level的属性 |
||||||
|
levew=$nextw; leveh=5; |
||||||
|
lvx=$((scx+9)); lvy=$((scy)); |
||||||
|
lvctx=$((lvx+4)); lvcty=$((lvy+20)); |
||||||
|
|
||||||
|
#help的属性 |
||||||
|
helpw=$nextw; helph=21; |
||||||
|
hpx=$((lvx+10)); hpy=$((nty)); |
||||||
|
hpctx=$((hpx+4)); hpcty=$((hpy+10)); |
||||||
|
|
||||||
|
#map |
||||||
|
MAP=(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
||||||
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
||||||
|
); #所有的格子 |
||||||
|
|
||||||
|
#paint_gui |
||||||
|
clear; paint_gui; |
||||||
|
|
||||||
|
local x=$((RANDOM%7)); |
||||||
|
name=${NAME[$((x))]}; |
||||||
|
flag=$((RANDOM%FLAG[$x]+1)); |
||||||
|
|
||||||
|
nname='I'; nflag=2; #下一个方块 |
||||||
|
|
||||||
|
centerx=$mainctx; #每个图形的中心打印点 |
||||||
|
centery=$maincty; |
||||||
|
|
||||||
|
#各个方块的相对坐标 |
||||||
|
ax="Iax"; ay="Iay"; |
||||||
|
} |
||||||
|
#------------------------------------------------------------------------# |
||||||
|
|
||||||
|
game_exit() { |
||||||
|
tput rmcup; |
||||||
|
tput cvvis; |
||||||
|
stty echo; |
||||||
|
|
||||||
|
(($#==1)) && echo "window is too small"; |
||||||
|
exit 0; |
||||||
|
} |
||||||
|
|
||||||
|
#============================三个原子函数paint_block, erase_block, paint_box================= |
||||||
|
#打印一个小方块, 四个参数, 两个位置和两个颜色 |
||||||
|
paint_block() { |
||||||
|
local x=$1 y=$2 crone=$3 crtwo=$4 i |
||||||
|
|
||||||
|
x=$((upx+x*BXLINES+1)); |
||||||
|
y=$((lty+y*BXCOLNS+1)); |
||||||
|
|
||||||
|
echo -ne "\033[$((x));$((y))H\033[${crone}m+---+\033[0m"; |
||||||
|
echo -ne "\033[$((x+1));$((y))H\033[${crone}m|\033[${crtwo}m###\033[0m\033[${crone}m|\033[0m"; |
||||||
|
echo -ne "\033[$((x+2));$((y))H\033[${crone}m+---+\033[0m"; |
||||||
|
} |
||||||
|
|
||||||
|
#删除一个小方块, 两个参数,即位置 |
||||||
|
erase_block() { |
||||||
|
local x=$1 y=$2 |
||||||
|
|
||||||
|
x=$((upx+x*BXLINES+1)); |
||||||
|
y=$((lty+y*BXCOLNS+1)); |
||||||
|
|
||||||
|
echo -ne "\033[$(( x ));$((y))H "; |
||||||
|
echo -ne "\033[$((x+1));$((y))H "; |
||||||
|
echo -ne "\033[$((x+2));$((y))H "; |
||||||
|
} |
||||||
|
|
||||||
|
#画一个盒子$1 $2 $3 $4 $5 |
||||||
|
paint_box() { |
||||||
|
local x=$1 y=$2 w=$3 h=$4 color=$5 i |
||||||
|
|
||||||
|
echo -ne "\033[$x;$((y))H\033[${color}m+\033[0m"; |
||||||
|
echo -ne "\033[$x;$((y+w+1))H\033[${color}m+\033[0m"; |
||||||
|
for (( i = 1; i <= w; i++ )); do |
||||||
|
echo -ne "\033[$x;$((y+i))H\033[${color}m-\033[0m"; |
||||||
|
echo -ne "\033[$((x+h+1));$((y+i))H\033[${color}m-\033[0m"; |
||||||
|
done |
||||||
|
echo -ne "\033[$((x+h+1));$((y))H\033[${color}m+\033[0m"; |
||||||
|
echo -ne "\033[$((x+h+1));$((y+w+1))H\033[${color}m+\033[0m"; |
||||||
|
|
||||||
|
for (( i = 1; i <= h; i++ )); do |
||||||
|
echo -ne "\033[$((x+i));$((y))H\033[${color}mI\033[0m"; |
||||||
|
echo -ne "\033[$((x+i));$((y+w+1))H\033[${color}mI\033[0m"; |
||||||
|
done |
||||||
|
} |
||||||
|
#--------------------------------------------------------------------------------------- |
||||||
|
|
||||||
|
#打印界面 |
||||||
|
paint_gui() { |
||||||
|
((upx<=0 || lty<=0)) && game_exit 1; |
||||||
|
|
||||||
|
paint_box $upx $lty $mainw $mainh 34; #画主框 |
||||||
|
paint_box $ntx $nty $nextw $nexth 33; #画next框 |
||||||
|
paint_box $lvx $lvy $levew $leveh 32; #画level框 |
||||||
|
paint_box $scx $scy $scorw $scorh 36; #画分数框 |
||||||
|
paint_box $hpx $hpy $helpw $helph 31; #画帮助框 |
||||||
|
|
||||||
|
#打印score, help 等提示字符 |
||||||
|
echo -ne "\033[$((ntx+2));$((nty+17))H\033[34mN E X T\033[0m"; |
||||||
|
|
||||||
|
echo -ne "\033[$((scx+2));$((scy+16))H\033[31mS C O R E\033[0m"; |
||||||
|
echo -ne "\033[$((scx+4));$((scy+20))H\033[31m0\033[0m"; |
||||||
|
|
||||||
|
echo -ne "\033[$((lvx+2));$((lvy+16))H\033[31mL E V E L\033[0m"; |
||||||
|
echo -ne "\033[$((lvctx));$((lvcty))H\033[31m1\033[0m"; |
||||||
|
|
||||||
|
echo -ne "\033[$((hpx+2));$((hpy+17))H\033[33mH E L P\033[0m"; |
||||||
|
echo -ne "\033[$((hpctx));$((hpcty))H\033[34mH --- Move Left\033[0m"; |
||||||
|
echo -ne "\033[$((hpctx+2));$((hpcty))H\033[34mL --- Move Right\033[0m"; |
||||||
|
echo -ne "\033[$((hpctx+4));$((hpcty))H\033[34mJ --- Soft Drop\033[0m"; |
||||||
|
echo -ne "\033[$((hpctx+6));$((hpcty))H\033[34mK --- Rotate\033[0m"; |
||||||
|
echo -ne "\033[$((hpctx+8));$((hpcty))H\033[34mSpace or Enter --- Hard Drop\033[0m"; |
||||||
|
|
||||||
|
echo -ne "\033[$((hpctx+11));$((hpcty))H\033[34mP --- Pause Game\033[0m"; |
||||||
|
echo -ne "\033[$((hpctx+13));$((hpcty))H\033[34mQ --- Quit Game\033[0m"; |
||||||
|
echo -ne "\033[$((hpctx+15));$((hpcty))H\033[34mE --- Exit Replay\033[0m"; |
||||||
|
} |
||||||
|
|
||||||
|
#--------------------------------------------------------- |
||||||
|
|
||||||
|
#在next框中打印下一个方块图形 |
||||||
|
paint_next() { |
||||||
|
(($#==0)) && mk_random; |
||||||
|
local oflag=$flag oname=$name |
||||||
|
|
||||||
|
((centerx=mainctx+2)); ((centery=maincty+9)); |
||||||
|
erase_x; |
||||||
|
flag=$nflag; name=$nname; |
||||||
|
|
||||||
|
paint_x; |
||||||
|
flag=$oflag; name=$oname; |
||||||
|
centerx=$mainctx; centery=$maincty; |
||||||
|
} |
||||||
|
|
||||||
|
# 打印分数和level |
||||||
|
paint_score() { |
||||||
|
level=0; |
||||||
|
echo -ne "\033[$((scctx));$((sccty))H\033[31m$score\033[0m"; |
||||||
|
((score>2000 )) && ((level=1)); ((score>5000 )) && ((level=2)); |
||||||
|
((score>9000 )) && ((level=3)); ((score>14000)) && ((level=4)); |
||||||
|
((score>20000)) && ((level=5)); ((score>27000)) && ((level=6)); |
||||||
|
((score>35000)) && ((level=7)); ((score>44000)) && ((level=8)); |
||||||
|
((level=olevel+level)); |
||||||
|
((level>9)) && ((level=9)); |
||||||
|
|
||||||
|
((TIME=10-level)); |
||||||
|
echo -ne "\033[$((lvctx));$((lvcty))H\033[31m$level\033[0m"; |
||||||
|
} |
||||||
|
|
||||||
|
#根据name选择要打印的方块 |
||||||
|
paint_x() { |
||||||
|
local x=$centerx y=$centery i |
||||||
|
local n=$((${mapname[$name]}-1)); |
||||||
|
|
||||||
|
find_array; |
||||||
|
for (( i = 0; i < 4; i++ )); do |
||||||
|
paint_block $((x+${ax}[$i])) $((y+${ay}[$i])) ${colorone[$n]} ${colortwo[$n]} |
||||||
|
done |
||||||
|
} |
||||||
|
|
||||||
|
#根据name选择要删除的方块 |
||||||
|
erase_x() { |
||||||
|
local x=$centerx y=$centery i |
||||||
|
|
||||||
|
find_array; |
||||||
|
for (( i = 0; i < 4; i++ )); do |
||||||
|
erase_block $((x+${ax}[$i])) $((y+${ay}[$i])); |
||||||
|
done |
||||||
|
} |
||||||
|
|
||||||
|
rotate_x() { |
||||||
|
((flag+=1)); |
||||||
|
((flag>mapflag[$name])) && flag=1; |
||||||
|
} |
||||||
|
#------------------------------------------------------------------------# |
||||||
|
|
||||||
|
#========================================================================# |
||||||
|
update() { #update the map |
||||||
|
local x=$1 n=0 i j |
||||||
|
for (( i = 0; i < MAPY; i++ )); do |
||||||
|
erase_block $x $i; #消掉一行 |
||||||
|
MAP[$((x*MAPY+i))]=0; #更新为0 |
||||||
|
done |
||||||
|
|
||||||
|
#将上面的格子向下移动一行 |
||||||
|
for (( i = 0; i < MAPY; i++ )); do |
||||||
|
for (( j = x; j > 0; j-- )); do |
||||||
|
((n=MAP[$(((j-1)*MAPY+i))])); |
||||||
|
if ((n!=0)); then |
||||||
|
erase_block $((j-1)) $i; |
||||||
|
paint_block $j $i ${colorone[$((n-1))]} ${colortwo[$((n-1))]}; |
||||||
|
fi |
||||||
|
done |
||||||
|
done |
||||||
|
|
||||||
|
# 更新MAP的值 |
||||||
|
for (( i = 0; i < MAPY; i++ )); do |
||||||
|
for (( j = x; j >0; j-- )); do |
||||||
|
MAP[$((j*MAPY+i))]=$((MAP[$(((j-1)*MAPY+i))])); |
||||||
|
done |
||||||
|
done |
||||||
|
} |
||||||
|
|
||||||
|
# 检测是否可以消掉一行 |
||||||
|
have_score() { |
||||||
|
local n=0 i j; |
||||||
|
for (( i = 0; i < MAPX; i++ )); do |
||||||
|
for (( j = 0; j < MAPY; j++ )); do |
||||||
|
((MAP[$((10*i+j))]==0)) && break; #有空格就退出 |
||||||
|
done |
||||||
|
((j==MAPY)) && ((n+=1)) && update $i; #可以消掉一行 |
||||||
|
done |
||||||
|
|
||||||
|
case $n in |
||||||
|
1) ((score+=100)); ;; |
||||||
|
2) ((score+=200)); ;; |
||||||
|
3) ((score+=400)); ;; |
||||||
|
4) ((score+=800)); ;; |
||||||
|
esac |
||||||
|
} |
||||||
|
|
||||||
|
#根据flag 和 name找到其的坐标数组 |
||||||
|
find_array() { |
||||||
|
case $flag in |
||||||
|
1) ax="${name}ax"; ay="${name}ay"; |
||||||
|
;; |
||||||
|
2) ax="${name}bx"; ay="${name}by"; |
||||||
|
;; |
||||||
|
3) ax="${name}cx"; ay="${name}cy"; |
||||||
|
;; |
||||||
|
4) ax="${name}dx"; ay="${name}dy"; |
||||||
|
;; |
||||||
|
esac |
||||||
|
} |
||||||
|
|
||||||
|
# 检测方块首次出现时,是否会越界,并作出矫正或者游戏结束 |
||||||
|
check_first() { |
||||||
|
local x=$centerx y=$centery minx=0 i |
||||||
|
|
||||||
|
find_array; |
||||||
|
# 检测是否越界 |
||||||
|
for (( i = 0; i < 4; i++ )); do |
||||||
|
(((x+${ax}[$i])<minx)) && ((minx=(x+${ax}[$i]))); |
||||||
|
done |
||||||
|
((centerx-=minx)); |
||||||
|
paint_x; #开始打印方块 |
||||||
|
paint_score; |
||||||
|
|
||||||
|
# 检测是否会结束游戏 |
||||||
|
for (( i = 0; i < 4; i++ )); do |
||||||
|
((x=centerx+${ax}[$i])); ((y=centery+${ay}[$i])) |
||||||
|
((MAP[$((x*10+y))]!=0)) && return 1; #游戏结束 |
||||||
|
done |
||||||
|
|
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
#检测是否可以固定方块 |
||||||
|
check_stop() { |
||||||
|
local sx=$centerx sy=$centery |
||||||
|
local x=0 y=0 n=0 i=0 |
||||||
|
|
||||||
|
find_array; |
||||||
|
for (( i = 0; i < 4; i++ )); do |
||||||
|
((x=(sx+${ax}[$i]))); ((y=(sy+${ay}[$i]))); |
||||||
|
((x+1>19)) && break; #到底 |
||||||
|
((MAP[$((10*(x+1)+y))] != 0)) && break; #有方块挡住 |
||||||
|
done |
||||||
|
|
||||||
|
if ((i!=4)); then #不能在动了,则记录 |
||||||
|
for (( i = 0; i < 4; i++ )); do |
||||||
|
((x=(sx+${ax}[$i]))); ((y=(sy+${ay}[$i]))); |
||||||
|
n=$((10*x+y)); MAP[$n]=${mapname[$name]}; |
||||||
|
done |
||||||
|
have_score; |
||||||
|
|
||||||
|
return 1; |
||||||
|
fi |
||||||
|
|
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
#检测是否可以移到$1 $2这个格子 |
||||||
|
check_next() { |
||||||
|
local sx=$1 sy=$2 |
||||||
|
local x=0 y=0 n=0 i=0 |
||||||
|
|
||||||
|
find_array; |
||||||
|
for (( i = 0; i < 4; i++ )); do |
||||||
|
((x=(sx+${ax}[$i]))); ((y=(sy+${ay}[$i]))); |
||||||
|
|
||||||
|
((x<0 || x>19 || y<0 || y>9)) && return 1; |
||||||
|
((MAP[$((10*x+y))] != 0)) && return 1; #不能移到这个格子 |
||||||
|
done |
||||||
|
|
||||||
|
return 0; |
||||||
|
} |
||||||
|
#------------------------------------------------------------------------# |
||||||
|
|
||||||
|
#========================================================================# |
||||||
|
go_left() { #向左移一个 |
||||||
|
check_next $centerx $((centery-1)); |
||||||
|
(($?==1)) && return 1; |
||||||
|
|
||||||
|
erase_x; ((centery-=1)); |
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
go_right() { #向右移一格 |
||||||
|
check_next $centerx $((centery+1)); |
||||||
|
(($?==1)) && return 1; |
||||||
|
|
||||||
|
erase_x; ((centery+=1)); |
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
go_down() { #加速向下 |
||||||
|
check_next $((centerx+1)) $centery |
||||||
|
(($?==1)) && return 1; |
||||||
|
|
||||||
|
erase_x; ((centerx+=1)); |
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
go_rotate() { #旋转 |
||||||
|
local oflag=$flag #保存原来的flag值 |
||||||
|
|
||||||
|
rotate_x; |
||||||
|
check_next $centerx $centery; |
||||||
|
(($?==1)) && ((flag=oflag)) && return 1; |
||||||
|
|
||||||
|
flag=$oflag; |
||||||
|
erase_x; rotate_x; |
||||||
|
|
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
go_fast() { #快速固定 |
||||||
|
erase_x; |
||||||
|
check_next $((centerx+1)) $centery |
||||||
|
local res=$?; |
||||||
|
|
||||||
|
while ((res==0)); do |
||||||
|
((centerx+=1)); |
||||||
|
check_next $((centerx+1)) $centery |
||||||
|
res=$?; |
||||||
|
done |
||||||
|
} |
||||||
|
|
||||||
|
game_pause() { |
||||||
|
echo -ne "\033[$((hpctx+17));$((hpcty+5))H\033[31mGame Paused\033[0m"; |
||||||
|
local pkey; |
||||||
|
while true; do |
||||||
|
read -n 1 pkey; |
||||||
|
[[ $pkey = 'q' ]] || [[ $pkey == 'Q' ]] && game_exit; |
||||||
|
[[ $pkey = 'p' ]] || [[ $pkey == 'P' ]] && break; |
||||||
|
done |
||||||
|
echo -ne "\033[$((hpctx+17));$((hpcty+5))H\033[31m \033[0m"; |
||||||
|
} |
||||||
|
|
||||||
|
# 根据按键作出选择 |
||||||
|
keypress() { |
||||||
|
local result=0; |
||||||
|
case ${key:-space} in |
||||||
|
H|h) go_left; result=$?; # 向左一个格子 |
||||||
|
;; |
||||||
|
J|j) go_down; result=$?; # 向下, 加速向下一个格子 |
||||||
|
;; |
||||||
|
K|k) go_rotate; result=$?; # 向上, 旋转90度 |
||||||
|
;; |
||||||
|
L|l) go_right; result=$?; # 向右一个格子 |
||||||
|
;; |
||||||
|
Q|q) game_exit; # 退出游戏 |
||||||
|
;; |
||||||
|
P|p) game_pause; |
||||||
|
;; |
||||||
|
space) |
||||||
|
go_fast; nextbk=1; |
||||||
|
;; |
||||||
|
esac |
||||||
|
((result==0)) && paint_x; |
||||||
|
} |
||||||
|
#----------------------------------------------------------------# |
||||||
|
|
||||||
|
#================================================================# |
||||||
|
mk_random() { # 产生下一个随机方块 |
||||||
|
local x=$((RANDOM%7)) |
||||||
|
|
||||||
|
nname=${NAME[$x]}; |
||||||
|
nflag=$((RANDOM%FLAG[$x]+1)); |
||||||
|
} |
||||||
|
|
||||||
|
#开始一个新游戏 |
||||||
|
new_game() { |
||||||
|
local i gmover=0 nextbk=0; |
||||||
|
|
||||||
|
game_init; #初始化游戏 |
||||||
|
while true; do |
||||||
|
paint_next; #在next框中打印下一个方块 |
||||||
|
blockarr+=($name $flag $nname $nflag); |
||||||
|
|
||||||
|
check_first; (($?==1)) && return; #检查是否游戏结束 |
||||||
|
|
||||||
|
while true; do |
||||||
|
for (( i = 0; i < TIME; i++ )); do |
||||||
|
read -n 1 -t 0.1 key; #等待按键 |
||||||
|
(($?==0)) && keypress; |
||||||
|
(($?==0)) && keyarray+=(${key:-space}); |
||||||
|
(($?==0)) || keyarray+=("nothing"); |
||||||
|
|
||||||
|
((nextbk==1)) && !((nextbk=0)) && break; |
||||||
|
done |
||||||
|
|
||||||
|
check_stop; (($?==1)) && break; |
||||||
|
erase_x; ((centerx+=1)); paint_x; |
||||||
|
done |
||||||
|
|
||||||
|
name=$nname; flag=$nflag; |
||||||
|
((score+=10)); |
||||||
|
done |
||||||
|
} |
||||||
|
|
||||||
|
replay() { |
||||||
|
score=0; level=$olevel; |
||||||
|
local gmover=0 nextbk=0 i=0 j=0; |
||||||
|
local blocklen=$((${#blockarr[@]})) keylen=${#keyarray[@]}; |
||||||
|
|
||||||
|
game_init; |
||||||
|
for ((i=0; i<blocklen; i+=4)); do |
||||||
|
name=${blockarr[i]}; flag=${blockarr[i+1]}; |
||||||
|
nname=${blockarr[i+2]}; nflag=${blockarr[i+3]}; |
||||||
|
|
||||||
|
paint_next -n; |
||||||
|
check_first; (($?==1)) && return 0; |
||||||
|
|
||||||
|
while true; do |
||||||
|
local k=0 anykey; |
||||||
|
while true; do |
||||||
|
key=${keyarray[j++]}; [[ $key = [pP] ]] && continue; |
||||||
|
keypress; |
||||||
|
#((j+=1)); |
||||||
|
|
||||||
|
read -n 1 -t 0.1 anykey; |
||||||
|
if (($?==0)); then |
||||||
|
[[ $anykey = [pP] ]] && game_pause; |
||||||
|
[[ $anykey = [qQ] ]] && game_exit; |
||||||
|
[[ $anykey = [eE] ]] && level=1 && return 0; |
||||||
|
fi |
||||||
|
|
||||||
|
((nextbk==1)) && !((nextbk=0)) && break; |
||||||
|
((k+=1)) && ((k==TIME)) && break; |
||||||
|
done |
||||||
|
|
||||||
|
check_stop; (($?==1)) && break; |
||||||
|
erase_x; ((centerx+=1)); paint_x; |
||||||
|
done |
||||||
|
((score+=10)); |
||||||
|
done |
||||||
|
|
||||||
|
score=0; level=1; |
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
paint_game_over() { |
||||||
|
local xcent=$((`tput lines`/2)) ycent=$((`tput cols`/2)) |
||||||
|
local x=$((xcent-4)) y=$((ycent-25)) |
||||||
|
for (( i = 0; i < 10; i++ )); do |
||||||
|
echo -ne "\033[$((x+i));${y}H\033[44m${good_game[$i]}\033[0m"; |
||||||
|
done |
||||||
|
echo -ne "\033[$((x+3));$((ycent+1))H\033[44m${score}\033[0m"; |
||||||
|
} |
||||||
|
|
||||||
|
game_over() { |
||||||
|
paint_game_over; |
||||||
|
|
||||||
|
level=1; local pkey; |
||||||
|
while true; do |
||||||
|
read -n 1 pkey; |
||||||
|
[[ $pkey = 'q' ]] || [[ $pkey = 'Q' ]] && game_exit; |
||||||
|
[[ $pkey = 'n' ]] || [[ $pkey = 'N' ]] && break; |
||||||
|
[[ $pkey = 's' ]] || [[ $pkey = 'S' ]] && ((level=level%9+1)); |
||||||
|
[[ $pkey = 'r' ]] || [[ $pkey = 'R' ]] && replay && paint_game_over; |
||||||
|
echo -ne "\033[$((lvctx));$((lvcty))H\033[31m$level\033[0m"; |
||||||
|
done |
||||||
|
olevel=$level; |
||||||
|
blockarr=(); |
||||||
|
keyarray=(); |
||||||
|
} |
||||||
|
|
||||||
|
game_start() { |
||||||
|
tput civis; stty -echo; |
||||||
|
tput smcup; clear; |
||||||
|
trap 'game_exit;' SIGINT SIGTERM |
||||||
|
|
||||||
|
score=0; #总分数 |
||||||
|
level=1; #等级 |
||||||
|
TIME=9; |
||||||
|
|
||||||
|
local xcent=$(tput lines) ycent=$(tput cols) |
||||||
|
local n=$((xcent/BXLINES)) m=$((ycent/BXCOLNS)) i j; |
||||||
|
for (( i = 3; i < n-2; i++ )); do |
||||||
|
for (( j = 3; j < m-3; ++j)); do |
||||||
|
paint_block $i $j $((RANDOM%7+31)) $((RANDOM%7+31)) |
||||||
|
done |
||||||
|
done |
||||||
|
|
||||||
|
local x=$((xcent/2-4)) y=$((ycent/2-25)) |
||||||
|
for (( i = 0; i < 12; i++ )); do |
||||||
|
echo -ne "\033[$((x+i));${y}H\033[40m${start_game[$i]}\033[0m"; |
||||||
|
done |
||||||
|
|
||||||
|
local pkey='x'; |
||||||
|
while true; do |
||||||
|
read -n 1 pkey; |
||||||
|
[[ ${pkey:-enter} = 'enter' ]] && break; |
||||||
|
[[ $pkey = 'q' ]] || [[ $pkey = 'Q' ]] && game_exit; |
||||||
|
[[ $pkey = 's' ]] || [[ $pkey = 'S' ]] && ((level=level%9+1)); |
||||||
|
echo -ne "\033[$((x+8));$((ycent/2-1))H\033[40m$level\033[0m"; |
||||||
|
done |
||||||
|
olevel=$level; |
||||||
|
} |
||||||
|
|
||||||
|
game_main() { |
||||||
|
game_start; |
||||||
|
while true; do |
||||||
|
new_game; |
||||||
|
game_over; |
||||||
|
done |
||||||
|
} |
||||||
|
#----------------------------------------------------------------------# |
||||||
|
|
||||||
|
game_main; |
||||||
|
|
@ -0,0 +1,29 @@ |
|||||||
|
#!/usr/bin/bash |
||||||
|
|
||||||
|
source ./tools.sh |
||||||
|
trap warn INT EXIT TSTP TERM HUP |
||||||
|
while : |
||||||
|
do |
||||||
|
echo "=========================================" |
||||||
|
printf "%-5s %-20s %-50s\n" "seq" "功能" "描述" |
||||||
|
printf "%-5s %-20s %-50s\n" "01" "连接服务器" "连接已经被跳板机支持的服务器,部分机器可能禁止" |
||||||
|
printf "%-5s %-20s %-50s\n" "02" "添加服务器" "管理员可以添加被连接的服务器" |
||||||
|
printf "%-5s %-20s %-50s\n" "Q|q" "退出" |
||||||
|
echo "=========================================" |
||||||
|
echo "请输入功能编号" |
||||||
|
read -p ">>>:" seq |
||||||
|
case $seq in |
||||||
|
1|01) |
||||||
|
connHost |
||||||
|
;; |
||||||
|
2|02) |
||||||
|
addHost |
||||||
|
;; |
||||||
|
Q|q) |
||||||
|
kill -9 $$ |
||||||
|
;; |
||||||
|
*) |
||||||
|
: |
||||||
|
esac |
||||||
|
done |
||||||
|
|
@ -0,0 +1,50 @@ |
|||||||
|
defHostfile=/home/jumpserver/.hostfile |
||||||
|
defPort=22 |
||||||
|
defRSA=/home/jumpserver/.ssh/id_rsa.pub |
||||||
|
|
||||||
|
stty erase ^H |
||||||
|
# 禁止用户使用ctrl+c 等操作 |
||||||
|
warn(){ |
||||||
|
echo "禁止的操作" |
||||||
|
} |
||||||
|
|
||||||
|
addHost(){ |
||||||
|
if [ ! -f $defHostfile ];then |
||||||
|
touch $defHostfile |
||||||
|
fi |
||||||
|
_id=$[$(cat $defHostfile |wc -l) + 1] |
||||||
|
read -p "请输入服务器地址:" rhost |
||||||
|
read -p "请输入服务器用户:" ruser |
||||||
|
read -p "请输入服务器端口:" rport |
||||||
|
read -s -p "请输入服务器密码:" rpasswd |
||||||
|
echo "" |
||||||
|
read -p "请输入服务器用途:" rdesc |
||||||
|
sshpass -p "$rpasswd" ssh-copy-id -o StrictHostKeyChecking=no -i $defRSA -p $defPort ${ruser}@${rhost} &>/dev/null || echo "添加服务器异常,请检查密码或联系管理员" && \ |
||||||
|
printf "%5s] %-20s %-10s %-5s %-30s\n" "$_id" "$rhost" "$ruser" "$rport" "$rdesc" >> $defHostfile &&\ |
||||||
|
echo -e "$rhost 服务器添加成功\n用户:$ruser\n密码:$rpasswd\n注意,密码仅展示一次!" |
||||||
|
} |
||||||
|
|
||||||
|
connHost(){ |
||||||
|
printf "%-5s %-20s %-10s %-5s %-30s\n" "id" "host" "user" "port" "desc" |
||||||
|
while read line |
||||||
|
do |
||||||
|
id=$(echo $line | awk '{print $1}') |
||||||
|
host=$(echo $line | awk '{print $2}') |
||||||
|
user=$(echo $line | awk '{print $3}') |
||||||
|
port=$(echo $line | awk '{print $4}') |
||||||
|
desc=$(echo $line | awk '{print $5}') |
||||||
|
printf "%-5s %-20s %-10s %-5s %-30s\n" "$id" "$host" "$user" "$port" "$desc" |
||||||
|
done<$defHostfile |
||||||
|
read -p "请输入服务器编号:" num |
||||||
|
num=${num:+$num]} |
||||||
|
host=$(grep "$num" $defHostfile) |
||||||
|
if [ ! -z "$host" ];then |
||||||
|
_host=$(echo $host | awk '{print $2}') |
||||||
|
_user=$(echo $host | awk '{print $3}') |
||||||
|
_port=$(echo $host | awk '{print $4}') |
||||||
|
echo "正在连接服务器 ${_user}@${_host}:${_port} ..." |
||||||
|
ssh -o StrictHostKeyChecking=no ${_user}@${_host} -p ${_port} |
||||||
|
else |
||||||
|
echo "服务器不存在" |
||||||
|
fi |
||||||
|
} |
@ -0,0 +1,28 @@ |
|||||||
|
#!/usr/bin/bash |
||||||
|
|
||||||
|
trap "echo 禁止操作" INT |
||||||
|
source ./tools.sh |
||||||
|
while : |
||||||
|
do |
||||||
|
clear |
||||||
|
echo "[客户端地址] `echo $SSH_CLIENT|awk '{print $1}'`" |
||||||
|
echo "[当前时间 ] `date +'%Y-%m-%d %H:%M:%S'`" |
||||||
|
echo "===============================================" |
||||||
|
printf "%-5s %-20s %-50s\n" "seq" "tool" "desc" |
||||||
|
printf "%-5s %-20s %-50s\n" "01" "login host" "这是用户信息数据库" |
||||||
|
printf "%-5s %-20s %-50s\n" "02" "add host" "管理员添加服务器" |
||||||
|
printf "%-5s %-20s %-50s\n" "q" "quit" "退出跳板机" |
||||||
|
read -p "请输入需要执行的序号:" n |
||||||
|
case $n in |
||||||
|
01|1) |
||||||
|
login_host |
||||||
|
sleep 10 |
||||||
|
;; |
||||||
|
02|2) |
||||||
|
add_host |
||||||
|
;; |
||||||
|
q|Q) |
||||||
|
echo "退出登陆" |
||||||
|
exit 0 |
||||||
|
esac |
||||||
|
done |
@ -0,0 +1,56 @@ |
|||||||
|
#!/usr/bin/bash |
||||||
|
|
||||||
|
DBfile=/home/jumpserver/.userdb |
||||||
|
[[ ! -f $DBfile ]] && touch $DBfile |
||||||
|
# vim /etc/rsyslog.conf local2.* /home/jumpserver/.login |
||||||
|
LOGfile=/home/jumpserver/.login |
||||||
|
LOGdev=local2 |
||||||
|
defRSA=/home/jumpserver/.ssh/id_rsa.pub |
||||||
|
defPort=22 |
||||||
|
|
||||||
|
shaHash(){ |
||||||
|
echo -n "$1" |sha256sum |awk '{print $1}' |
||||||
|
} |
||||||
|
add_host(){ |
||||||
|
read -p "请输入新增ip地址:" nhost |
||||||
|
read -p "请输入新增ip用途:" nfunc |
||||||
|
read -p "请输入新增ip用户:" nuser |
||||||
|
read -p "请输入新增ip描述:" ndesc |
||||||
|
read -p "请输入新增ip密码:" npass |
||||||
|
if [[ -z $nhost || -z $nfunc || -z $nuser || -z $npass ]];then |
||||||
|
echo "输入信息无效" |
||||||
|
sleep 1 |
||||||
|
return 1 |
||||||
|
fi |
||||||
|
nseq=$[$(cat $DBfile |wc -l) + 1] |
||||||
|
sha_pass=`shaHash $npass` |
||||||
|
sshpass -p "$npass" ssh-copy-id -o StrictHostKeyChecking=no -i $defRSA -p $defPort ${nuser}@${nhost} &>/dev/null && \ |
||||||
|
echo "$nseq] $nhost $nuser $nfunc $sha_pass $ndesc" >> $DBfile && \ |
||||||
|
echo "服务器 $nfunc 已添加" && \ |
||||||
|
logger -p ${LOGdev}.info "$nseq $nuser $nhost $nfunc 服务器添加" || \ |
||||||
|
echo "添加服务器异常,请联系管理员" |
||||||
|
sleep 2 |
||||||
|
} |
||||||
|
|
||||||
|
login_host(){ |
||||||
|
printf "%-10s %-20s %-10s %-10s %-50s\n" "host" "ip" "user" "func" "desc" |
||||||
|
while read line |
||||||
|
do |
||||||
|
printf "%-10s %-20s %-10s %-10s %-50s\n" `echo $line |awk '{print $1,$2,$3,$4,$6}'` |
||||||
|
done <$DBfile |
||||||
|
read -p "请输入服务器序号:" host |
||||||
|
if [ ! -z $host ];then |
||||||
|
host=${host:+$host]} |
||||||
|
else |
||||||
|
echo "输入序号无效" |
||||||
|
return 2 |
||||||
|
fi |
||||||
|
data=`grep "$host" $DBfile` |
||||||
|
if [ -z "$data" ] ;then |
||||||
|
echo "未找到服务器" |
||||||
|
return 3 |
||||||
|
fi |
||||||
|
fip=`echo $data | awk '{print $2}'` |
||||||
|
fuser=`echo $data | awk '{print $3}'` |
||||||
|
ssh $fuser@$fip |
||||||
|
} |
@ -0,0 +1,21 @@ |
|||||||
|
#!/usr/bin/bash |
||||||
|
|
||||||
|
printf "%-10s\t%-30s\t%-100s\n" 序号 功能 描述 |
||||||
|
printf "%-10s\t%-30s\t%-100s\n" "01" yum安装mysql 通过yum安装mysql数据库,支持5.5-8.0安装,处理了旧数据 |
||||||
|
printf "%-10s\t%-30s\t%-100s\n" "02" "系统初始化" "新系统初始化,安装了常用软件,进行了部分系统优化,检查相关信息,并修改静态ip地址" |
||||||
|
printf "%-10s\t%-30s\t%-100s\n" "q" "退出脚本" |
||||||
|
echo "" |
||||||
|
read -p "请输入功能序号:" num |
||||||
|
case $num in |
||||||
|
01|1) |
||||||
|
source ./mysql.sh |
||||||
|
;; |
||||||
|
02|2) |
||||||
|
source ./osinit.sh |
||||||
|
;; |
||||||
|
q|Q|quit) |
||||||
|
: |
||||||
|
;; |
||||||
|
*) |
||||||
|
echo "该功能暂未添加,敬请期待" |
||||||
|
esac |
@ -0,0 +1,73 @@ |
|||||||
|
#!/usr/bin/bash |
||||||
|
|
||||||
|
# 定义解释型的信息 |
||||||
|
# Author: SZ2201班全体同仁,联系 newrain_wang@163.com |
||||||
|
# 监控报警脚本 |
||||||
|
# 做mysql、nginx服务存活性检测、重要配置文件防篡改。 |
||||||
|
|
||||||
|
# mysql 主机 password,在生产中的脚本要写普通用户 |
||||||
|
mysqlPassword="QianFeng@123" |
||||||
|
mysqlUser="root" |
||||||
|
# 监控间隔 |
||||||
|
checkInterval=30 |
||||||
|
# 配置文件列表 |
||||||
|
configFile=("/etc/passwd" "/etc/sudoers" "/etc/hosts" "/etc/resolv.conf" "/etc/sysctl.conf") |
||||||
|
hashFile=/tmp/.hashfile |
||||||
|
# nginx 检查URL |
||||||
|
nginxPath="/index.html" |
||||||
|
|
||||||
|
# 出现异常,发送邮件通知 |
||||||
|
# 安装软件mailx |
||||||
|
# 下列内容填写到 /etc/mail.rc |
||||||
|
<<! |
||||||
|
发送邮件的邮箱 |
||||||
|
set from=newrain_wang@163.com |
||||||
|
邮箱服务器 |
||||||
|
set smtp=smtp.163.com |
||||||
|
邮箱验证 |
||||||
|
set smtp-auth-user=newrain_wang@163.com |
||||||
|
授权码,在官方站点中获取 |
||||||
|
set smtp-auth-password=NBVRUYYHYANZNUCL |
||||||
|
set smtp-auth=login |
||||||
|
set ssl-verify=ignore |
||||||
|
! |
||||||
|
# 测试发送邮件 |
||||||
|
|
||||||
|
# 每隔60秒执行一次检查 |
||||||
|
|
||||||
|
while : |
||||||
|
do |
||||||
|
# 检查mysql存活,通过对mysql进行sql语句的执行,来判断是否正常工作 |
||||||
|
mysql -u${mysqlUser} -p${mysqlPassword} -e "select now()" &>/dev/null |
||||||
|
if [ $? -ne 0 ];then |
||||||
|
mysql_error="mysql异常\n" |
||||||
|
fi |
||||||
|
|
||||||
|
# 检查nginx是否存活,通过访问nginx的服务来判断是否正常工作 |
||||||
|
code=$(curl -I -s http://127.0.0.1${nginxPath} |grep "HTTP/1.1" |awk '{print $2}') |
||||||
|
<<! |
||||||
|
httpcode 200 成功 301 临时重定向 302 永久重定向 |
||||||
|
! |
||||||
|
if [ ! "$code" == "200" ] && [ ! "$code" == "301" ] && [ ! "$code" == "302" ];then |
||||||
|
nginx_error="nginx访问异常\n" |
||||||
|
fi |
||||||
|
|
||||||
|
# 配置文件篡改检查 |
||||||
|
if [ "$1" == 'init' ];then |
||||||
|
# 初始化,如果发现篡改,但是经过证实,是自己人做的,那么可以重新初始化 |
||||||
|
md5sum ${configFile[@]} > ${hashFile} |
||||||
|
exit 0 |
||||||
|
fi |
||||||
|
|
||||||
|
md5sum -c ${hashFile} 2>/dev/null |grep "FAILED" &>/dev/null |
||||||
|
if [ $? -eq 0 ];then |
||||||
|
checkFile_error="文件被篡改,请检查\n" |
||||||
|
fi |
||||||
|
# 如果错误信息变量被赋值至少一个,则邮件通知管理员进行处理。 |
||||||
|
if [ -n "$mysql_error" ] || [ -n "$nginx_error" ] || [ -n "$checkFile_error" ];then |
||||||
|
echo ${mysql_error}${nginx_error}${checkFile_error} |
||||||
|
echo -e "[`date +%F_%T`] 错误:\n${mysql_error}${nginx_error}${checkFile_error}" | mailx -s "报警通知" 1161733918@qq.com |
||||||
|
fi |
||||||
|
sleep ${checkInterval} |
||||||
|
done |
||||||
|
|
@ -0,0 +1,68 @@ |
|||||||
|
#!/usr/bin/bash |
||||||
|
|
||||||
|
source ./color.sh |
||||||
|
|
||||||
|
# 检查执行用户 |
||||||
|
if [ $UID -ne 0 ];then |
||||||
|
red "请使用过ROOT用户执行脚本" |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
|
||||||
|
# mysql 安装检查 |
||||||
|
[[ -f /etc/my.cnf ]] || [[ -d /var/lib/mysql ]] || [[ -f /usr/bin/mysql ]] && \ |
||||||
|
yellow "经检查发现,当前系统曾安装过mysql数据库,是否进行备份后卸载操作[Y|N]" |
||||||
|
read modify |
||||||
|
modify=${modify:="N"} |
||||||
|
if [ $modify = 'Y' ];then |
||||||
|
systemctl stop mysqld mariadb &>/dev/null |
||||||
|
yum remove `rpm -qa |grep mysql` |
||||||
|
yum remove `rpm -qa |grep maraidb` |
||||||
|
mkdir -p /db-save/{conf,log,data} |
||||||
|
mv /etc/my.cnf /db-save/conf |
||||||
|
mv /var/log/mysql* /db-save/log |
||||||
|
mv /var/log/mariadb* /db-save/log |
||||||
|
mv /var/lib/mysql/* /db-save/data |
||||||
|
userdel -r -f mysql |
||||||
|
yellow "我们为您将数据备份到了/db-save目录下" |
||||||
|
else |
||||||
|
green "为了您的数据安全,我们并未进行任何操作" |
||||||
|
exit 0 |
||||||
|
fi |
||||||
|
|
||||||
|
# 网络检查 |
||||||
|
ping -w1 -c1 www.baidu.com &>/dev/null |
||||||
|
if [ $? -ne 0 ] ;then |
||||||
|
red "网络异常" |
||||||
|
exit 2 |
||||||
|
fi |
||||||
|
|
||||||
|
# yum源检查 |
||||||
|
cd /etc/yum.repos.d/ && \ |
||||||
|
rename .repo .repo.bak *.repo |
||||||
|
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo |
||||||
|
yum install -y epel-release yum-utils && \ |
||||||
|
green "yum源成功安装" |
||||||
|
|
||||||
|
|
||||||
|
green "开始安装mysql yum源" |
||||||
|
yum install -y https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm |
||||||
|
green "请输入安装的版本[80|57|56|55](default:57):" |
||||||
|
read level |
||||||
|
green "请输入初始密码:" |
||||||
|
read -s passwd |
||||||
|
level=${level:=57} |
||||||
|
case $level in |
||||||
|
80) |
||||||
|
yum -y install mysql-community-server |
||||||
|
;; |
||||||
|
*) |
||||||
|
yum-config-manager --disable mysql80-community |
||||||
|
yum-config-manager --enable mysql${level}-community |
||||||
|
yum -y install mysql-community-server |
||||||
|
;; |
||||||
|
esac |
||||||
|
|
||||||
|
systemctl enable mysqld && systemctl start mysqld && green "mysql安装完成并且成功启动" || red "mysql 安装失败请检查" |
||||||
|
yellow "mysql 5.6及以下版本没有初始密码" |
||||||
|
[[ -f /var/log/mysqld.log ]] && mysql_passwd=$(grep password /var/log/mysqld.log| awk '{print $NF}') || red "数据库日志异常,请手动更新初始密码" |
||||||
|
[[ ! -z mysql_passwd ]] && mysqladmin -p"$mysql_passwd" password "$passwd" && green "密码修改成功:原密码:$mysql_passwd 新密码: $passwd" || red "密码修改出错,请手动修改" |
@ -0,0 +1,14 @@ |
|||||||
|
#!/usr/bin/bash |
||||||
|
<<! |
||||||
|
网络速率检测脚本,实时检测网络流量 |
||||||
|
! |
||||||
|
echo "ens33:" |
||||||
|
while : |
||||||
|
do |
||||||
|
OLD_in=$(awk '$0 ~ "ens33"{print $2}' /proc/net/dev) |
||||||
|
OLD_out=$(awk '$0 ~ "ens33"{print $10}' /proc/net/dev) |
||||||
|
sleep 2 |
||||||
|
in=$(awk '$0 ~ "ens33"{print $2}' /proc/net/dev) |
||||||
|
out=$(awk '$0 ~ "ens33"{print $10}' /proc/net/dev) |
||||||
|
echo -e "in: $[($in - $OLD_in) /1024] KB/s\nout: $[($out - $OLD_out) /1024] KB/s" |
||||||
|
done |
@ -0,0 +1,100 @@ |
|||||||
|
#!/usr/bin/bash |
||||||
|
|
||||||
|
# 将color.sh脚本中的内容在此脚本生效,类似于导入操作 |
||||||
|
source ./color.sh |
||||||
|
|
||||||
|
# 将不确定的因素交给用户自定义 |
||||||
|
interface=ens33 |
||||||
|
gateway=2 |
||||||
|
hostname=database |
||||||
|
|
||||||
|
# 系统信息采集 |
||||||
|
green "当前用户 $USER" |
||||||
|
green "当前时间 `date "+%F %X"`" |
||||||
|
echo 3 >/proc/sys/vm/drop_caches |
||||||
|
green "当前内存 $(free |awk 'NR==2{print $4/1024}')M" |
||||||
|
green "当前核心 $(grep -E '^processor' /proc/cpuinfo|wc -l)个" |
||||||
|
green "核心品牌 $(grep -E '^model name' /proc/cpuinfo |head -n 1 |awk -F: '{print $2}')" |
||||||
|
green "启动时长 $(uptime |awk -F',' '{print $1}')" |
||||||
|
|
||||||
|
|
||||||
|
# 网络检测 |
||||||
|
ping -w1 -c1 www.baidu.com &>/dev/null |
||||||
|
if [ $? -eq 0 ];then |
||||||
|
green "网络正常" |
||||||
|
else |
||||||
|
red "网络异常" |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
|
||||||
|
# yum源检查 |
||||||
|
cd /etc/yum.repos.d/ && \ |
||||||
|
rename .repo .repo.bak *.repo |
||||||
|
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo |
||||||
|
yum install -y epel-release yum-utils && \ |
||||||
|
green "yum源初始化安装" |
||||||
|
|
||||||
|
green "开始安装常用软件" |
||||||
|
green "即将为您安装 vim wget unzip lrzsz net-tools yum-utils ntpdate htop psacct 这些软件,如果有其他需要,请手动输入,您有10秒的时间" |
||||||
|
read -t 10 -p ">>>:" package |
||||||
|
package=${package:=";"} |
||||||
|
yum install -y vim wget unzip lrzsz net-tools yum-utils ntpdate psacct $package |
||||||
|
if [ $? -eq 0 ];then |
||||||
|
green "常用软件安装成功" |
||||||
|
else |
||||||
|
yellow "部分安装可能出现异常" |
||||||
|
fi |
||||||
|
|
||||||
|
green "开始进行系统优化" |
||||||
|
systemctl stop firewalld && systemctl disable firewalld |
||||||
|
systemctl stop postfix && systemctl disable postfix |
||||||
|
sed -i 's/^SELINUX.*/SELINUX=disabled/' /etc/selinux/config |
||||||
|
setenforce 0 2>/dev/null |
||||||
|
|
||||||
|
green "修改文件打开数、进程打开数" |
||||||
|
cat >>/etc/security/limits.conf <<EOF |
||||||
|
* soft nofile 65535 |
||||||
|
* hard nofile 65535 |
||||||
|
* soft nproc 1024 |
||||||
|
* hard nproc 1024 |
||||||
|
EOF |
||||||
|
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf |
||||||
|
sed -i 's/#UseDNS.*/UseDNS no/' /etc/ssh/sshd_config |
||||||
|
|
||||||
|
|
||||||
|
green "开始进行静态ip修改" |
||||||
|
ipaddr=$(ip a |grep ${interface} |grep inet|awk '{print $2}'|awk -F'/' '{print $1}') |
||||||
|
netmask=$(ip a |grep ${interface} |grep inet|awk '{print $2}'|awk -F'/' '{print $2}') |
||||||
|
cat >/etc/sysconfig/network-scripts/ifcfg-${interface} <<EOF |
||||||
|
TYPE="Ethernet" |
||||||
|
PROXY_METHOD="none" |
||||||
|
BROWSER_ONLY="no" |
||||||
|
BOOTPROTO="static" |
||||||
|
IPADDR="$ipaddr" |
||||||
|
PREFIX="$netmask" |
||||||
|
GATEWAY="${ipaddr%.*}.${gateway}" |
||||||
|
DNS1=114.114.114.114 |
||||||
|
DNS2=8.8.8.8 |
||||||
|
DEFROUTE="yes" |
||||||
|
DEVICE="${interface}" |
||||||
|
ONBOOT="yes" |
||||||
|
EOF |
||||||
|
systemctl restart network |
||||||
|
if [ $? -eq 0 ];then |
||||||
|
ping -w1 -c1 www.baidu.com &>/dev/null && green "网络配置成功" || red "网络连接异常" |
||||||
|
else |
||||||
|
red "网卡配置异常" |
||||||
|
fi |
||||||
|
|
||||||
|
green "开始进行主机名配置" |
||||||
|
hostname=${hostname:='osinit'} |
||||||
|
hostnamectl set-hostname $hostname |
||||||
|
|
||||||
|
green "系统初始化完成,即将重启,配置生效,是否现在重启[Y|N]" |
||||||
|
read -t 5 result |
||||||
|
result=${result:='N'} |
||||||
|
if [ $result == 'Y' ];then |
||||||
|
reboot |
||||||
|
else |
||||||
|
yellow "配置需要重启后生效" |
||||||
|
fi |
@ -0,0 +1,200 @@ |
|||||||
|
#!/usr/bin/bash |
||||||
|
|
||||||
|
# <<! 中间的是shell的多行注释内容 ! |
||||||
|
<<! |
||||||
|
Author: newrain |
||||||
|
Demand: CentOS7系统初始化 |
||||||
|
Date: 2022/4/18 |
||||||
|
! |
||||||
|
|
||||||
|
# 0 为远程仓库 1为本地仓库(需要确定本地存在仓库地址) |
||||||
|
localYum=0 |
||||||
|
# localYum=0时配置无效 |
||||||
|
localYumUrl="http://download.beyourself.org.cn/local_yum.sh" |
||||||
|
# 网卡名称,此处可接受数组,进行多网卡配置 (ens33 ens34 ens35) |
||||||
|
netInterface="ens33 ens36 ens37" |
||||||
|
# 主机名称, 重新登录生效 |
||||||
|
HOSTNAME=localhost |
||||||
|
# 安装软件包 |
||||||
|
yumList="vim wget curl net-tools ntpdate yum-utils bash-completion psacct bind-utils" |
||||||
|
# 输出间隔时间 |
||||||
|
sleepTime=1 |
||||||
|
|
||||||
|
|
||||||
|
# 输出格式化 |
||||||
|
function colorTools(){ |
||||||
|
declare -A color=([SUCCESS]="32" [ERROR]="31" [WARNING]="33" [INFO]="34") |
||||||
|
printf "\033[%-2sm%-8s [%-5s] %-25s\033[0m\n" ${color[$1]} `date +"%T"` $1 "$2" |
||||||
|
sleep $sleepTime |
||||||
|
} |
||||||
|
|
||||||
|
# 信号捕捉,退出时执行 |
||||||
|
function signal(){ |
||||||
|
colorTools ERROR "系统初始化失败,请检查系统配置" |
||||||
|
exit 1 |
||||||
|
} |
||||||
|
|
||||||
|
trap signal KILL INT |
||||||
|
|
||||||
|
# 系统环境检测 |
||||||
|
function envCheck(){ |
||||||
|
# 网络检测 |
||||||
|
colorTools INFO "开始系统检测程序" |
||||||
|
colorTools INFO "开始网络检测" |
||||||
|
ping -c 1 -W 1 www.baidu.com > /dev/null 2>&1 |
||||||
|
if [ $? -ne 0 ];then |
||||||
|
colorTools ERROR "网络连接失败" |
||||||
|
exit 1 |
||||||
|
else |
||||||
|
colorTools SUCCESS "网络检测成功" |
||||||
|
fi |
||||||
|
# 执行用户检测 |
||||||
|
colorTools INFO "开始用户检测" |
||||||
|
if [ $UID -ne 0 ];then |
||||||
|
colorTools ERROR "请使用root用户执行此脚本" |
||||||
|
exit 1 |
||||||
|
else |
||||||
|
colorTools SUCCESS "用户检测完成,当前用户为root" |
||||||
|
fi |
||||||
|
# 执行系统检测 |
||||||
|
colorTools INFO "开始系统检测" |
||||||
|
if [ -f /etc/redhat-release ];then |
||||||
|
colorTools SUCCESS "系统检测完成,当前系统为CentOS/RedHat" |
||||||
|
else |
||||||
|
colorTools ERROR "系统检测失败,仅支持CentOS/RedHat" |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
} |
||||||
|
|
||||||
|
# 网络配置 |
||||||
|
function networkConfigure(){ |
||||||
|
systemctl stop NetworkManager &>/dev/null |
||||||
|
systemctl disable NetworkManager &>/dev/null |
||||||
|
systemctl enable network &>/dev/null |
||||||
|
for i in ${netInterface};do |
||||||
|
colorTools INFO "开始网络配置,网卡名称 $i" |
||||||
|
address=$(ip a show dev $i | grep -oP "[1-9][\d]{1,2}(\.\d{1,3}){3}/(\d+)") |
||||||
|
ipaddr=$(echo $address | awk -F'/' '{print $1}') |
||||||
|
netmask=$(echo $address | awk -F'/' '{print $2}') |
||||||
|
gateway=$(ip r show dev $i | grep -oP "default via \K[1-9][\d]{1,2}(\.\d{1,3}){3}") |
||||||
|
cat > /etc/sysconfig/network-scripts/ifcfg-$i <<EOF |
||||||
|
TYPE="Ethernet" |
||||||
|
PROXY_METHOD="none" |
||||||
|
BROWSER_ONLY="no" |
||||||
|
BOOTPROTO="static" |
||||||
|
DEFROUTE="yes" |
||||||
|
NAME="$i" |
||||||
|
IPADDR="${ipaddr}" |
||||||
|
GATEWAY="${gateway}" |
||||||
|
PREFIX=${netmask} |
||||||
|
DNS1=114.114.114.114 |
||||||
|
DNS2=8.8.8.8 |
||||||
|
UUID="`uuidgen`" |
||||||
|
DEVICE="$i" |
||||||
|
ONBOOT="yes" |
||||||
|
EOF |
||||||
|
colorTools SUCCESS "网络配置完成" |
||||||
|
done |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
# yum源配置 |
||||||
|
function yumConfigure(){ |
||||||
|
colorTools INFO "开始yum配置" |
||||||
|
cd /etc/yum.repos.d/ && rename .repo .repo.bak *.repo &>/dev/null |
||||||
|
set -e |
||||||
|
if [ $localYum -eq 1 ];then |
||||||
|
curl -s download.beyourself.org.cn/yum.sh | bash |
||||||
|
colorTools SUCCESS "配置本地源完成,请在/etc/hosts文件中修改本地源ip地址解析" |
||||||
|
elif [ $localYum -eq 0 ];then |
||||||
|
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo |
||||||
|
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo |
||||||
|
fi |
||||||
|
set +e |
||||||
|
colorTools SUCCESS "yum 源配置完成" |
||||||
|
} |
||||||
|
|
||||||
|
# 系统常规配置 |
||||||
|
function other(){ |
||||||
|
colorTools INFO "开始常规配置" |
||||||
|
colorTools INFO "开始防火墙配置" |
||||||
|
systemctl stop firewalld && \ |
||||||
|
systemctl disable firewalld |
||||||
|
colorTools INFO "开始selinux配置" |
||||||
|
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config && \ |
||||||
|
setenforce 0 |
||||||
|
colorTools INFO "开始安装常用软件 ${yumList}" |
||||||
|
yum install -y ${yumList} |
||||||
|
colorTools INFO "开始主机名配置 ${HOSTNAME}" |
||||||
|
hostnamectl set-hostname $HOSTNAME |
||||||
|
colorTools INFO "开始时区配置并进行时间校准" |
||||||
|
timedatectl set-timezone Asia/Shanghai && \ |
||||||
|
ntpdate ntp.aliyun.com |
||||||
|
colorTools SUCCESS "常规配置完成" |
||||||
|
} |
||||||
|
|
||||||
|
# 系统参数优化 |
||||||
|
function optimized(){ |
||||||
|
colorTools INFO "开始优化系统" |
||||||
|
colorTools INFO "开始优化内核参数" |
||||||
|
cat > /etc/sysctl.conf <<EOF |
||||||
|
# 在FIN-WAIT-2状态的时间,默认值是60秒 |
||||||
|
net.ipv4.tcp_fin_timeout = 1 |
||||||
|
# 在第一次keep alive请求发送后,不活动连接的时间,单位为秒,默认值为18000 |
||||||
|
net.ipv4.tcp_keepalive_time = 1200 |
||||||
|
# 在第一次keep alive请求发送后,不活动连接的确认次数,默认值为9 |
||||||
|
net.ipv4.tcp_keepalive_probes = 3 |
||||||
|
# 开启路由转发 |
||||||
|
net.ipv4.ip_forward = 1 |
||||||
|
# 开启反向路由 |
||||||
|
# net.ipv4.conf.all.rp_filter = 1 |
||||||
|
EOF |
||||||
|
sysctl -p |
||||||
|
colorTools INFO "开始优化系统参数" |
||||||
|
cat > /etc/security/limits.conf <<EOF |
||||||
|
* soft nofile 102400 |
||||||
|
* hard nofile 102400 |
||||||
|
EOF |
||||||
|
colorTools SUCCESS "优化系统完成" |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
for i in "$@";do |
||||||
|
if [[ "$i" =~ '--' ]];then |
||||||
|
varName=${i%=*} |
||||||
|
varName=${varName#--} |
||||||
|
varValue=${i#*=} |
||||||
|
eval "$varName='$varValue'" |
||||||
|
fi |
||||||
|
done |
||||||
|
envCheck |
||||||
|
case $1 in |
||||||
|
"main") |
||||||
|
yumConfigure |
||||||
|
other |
||||||
|
optimized |
||||||
|
networkConfigure |
||||||
|
;; |
||||||
|
"networkConfigure") |
||||||
|
networkConfigure |
||||||
|
;; |
||||||
|
"other") |
||||||
|
other |
||||||
|
;; |
||||||
|
"optimized") |
||||||
|
optimized |
||||||
|
;; |
||||||
|
"yumConfigure") |
||||||
|
yumConfigure |
||||||
|
;; |
||||||
|
*) |
||||||
|
# 脚本后面带参数,只执行指定内容 |
||||||
|
echo -e "\tUsage: $0 [main|networkConfigure|other|optimized|yumConfigure] [options] 执行[全部功能|网络配置|其他配置|优化系统|yum配置]" |
||||||
|
# 修改配置 |
||||||
|
echo -e "\toptions: \n\t--localYum=0/1, 0为阿里云源,1为本地源\n\t--netInterface='ens33 ens36 ens37' 网络接口,多个接口使用数组\n\t--HOSTNAME='localhost' 主机名\n\t--yumList='vim wget' 安装软件数组,多个软件使用数组" |
||||||
|
exit 0 |
||||||
|
;; |
||||||
|
esac |
||||||
|
colorTools SUCCESS "$1 配置完成, 正在进行网络重启" |
||||||
|
systemctl restart network |
@ -0,0 +1,30 @@ |
|||||||
|
#!/usr/bin/env bash |
||||||
|
#history |
||||||
|
|
||||||
|
# 获取登录ip地址 |
||||||
|
# USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'` |
||||||
|
USER_IP=$(env |grep SSH_CLIENT | awk '{print $1}' | sed 's/SSH_CLIENT=//' | awk -F " " '{print $1}') |
||||||
|
# 指定历史命令路径 |
||||||
|
HISTDIR=/usr/share/.history |
||||||
|
if [ -z $USER_IP ] |
||||||
|
then |
||||||
|
USER_IP=`hostname` |
||||||
|
fi |
||||||
|
if [ ! -d $HISTDIR ] |
||||||
|
then |
||||||
|
mkdir -p $HISTDIR |
||||||
|
chmod 777 $HISTDIR |
||||||
|
fi |
||||||
|
if [ ! -d $HISTDIR/${LOGNAME} ] |
||||||
|
then |
||||||
|
mkdir -p $HISTDIR/${LOGNAME} |
||||||
|
chmod 300 $HISTDIR/${LOGNAME} |
||||||
|
fi |
||||||
|
# 设置历史命令条数 |
||||||
|
export HISTSIZE=4000 |
||||||
|
# 设置文件后缀 |
||||||
|
DT=`date +%Y%m%d_%H%M%S` |
||||||
|
export HISTFILE="$HISTDIR/${LOGNAME}/${USER_IP}.history.$DT" #文件路径 |
||||||
|
export HISTTIMEFORMAT="[%Y.%m.%d %H:%M:%S] " #记录格式 |
||||||
|
# 设置权限 |
||||||
|
chmod 600 $HISTDIR/${LOGNAME}/*.history* 2>/dev/null |
@ -0,0 +1,8 @@ |
|||||||
|
#!/usr/bin/bash |
||||||
|
echo "版本信息可查看 https://dn-dao-github-mirror.daocloud.io/docker/compose/releases/" |
||||||
|
LEVEL=${DOCKER_COMPOSE_LEVEL:-1.20.1} |
||||||
|
curl -L https://get.daocloud.io/docker/compose/releases/download/${LEVEL}/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose && chmod a+x /usr/local/bin/docker-compose |
||||||
|
|
||||||
|
if [ -z $DOCKER_COMPOSE_LEVEL ];then |
||||||
|
echo "采用默认版本1.20.1,如需要指定版本,可以在终端执行 export DOCKER_COMPOSE_LEVEL=版本" |
||||||
|
fi |
@ -0,0 +1,35 @@ |
|||||||
|
#!/bin/bash |
||||||
|
|
||||||
|
TAG_PREFIX= |
||||||
|
|
||||||
|
save(){ |
||||||
|
if [ ! -d "./images" ]; then |
||||||
|
mkdir images |
||||||
|
fi |
||||||
|
cd images |
||||||
|
docker images --format "{{.ID}} {{.Repository}}:{{.Tag}} {{.Size}}" |grep $TAG_PREFIX > images_pull.txt |
||||||
|
while read line |
||||||
|
do |
||||||
|
image_id=`echo $line | awk '{print $1}'` |
||||||
|
image_repository=`echo $line | awk '{print $2}'` |
||||||
|
image_size=`echo $line | awk '{print $3}'` |
||||||
|
docker save -o $image_id.tar $image_repository && \ |
||||||
|
echo "Image $image_repository saved, size $image_size" |
||||||
|
done < images_pull.txt |
||||||
|
} |
||||||
|
|
||||||
|
load(){ |
||||||
|
cd images |
||||||
|
while read line |
||||||
|
do |
||||||
|
image_id=`echo $line | awk '{print $1}'` |
||||||
|
image_repository=`echo $line | awk '{print $2}'` |
||||||
|
docker load -i $image_id.tar && \ |
||||||
|
echo "Image $image_repository loaded" |
||||||
|
done < images_pull.txt |
||||||
|
} |
||||||
|
if [ -z "$1" ]; then |
||||||
|
echo "Usage: image_operation.sh [save|load]" |
||||||
|
fi |
||||||
|
|
||||||
|
eval $1 |
@ -0,0 +1,34 @@ |
|||||||
|
#!/usr/bin/bash |
||||||
|
|
||||||
|
set -e |
||||||
|
unset c |
||||||
|
color(){ |
||||||
|
declare -A c=([Error]=31 [Success]=32 [Warning]=33 [Info]=34) |
||||||
|
#echo -e "\033[${c[$1]}m[`date +%T`]($1) $2\033[0m" |
||||||
|
printf "\033[${c[$1]}m%-10s%-10s %-30s\033[0m\n" "[`date +%T`]" "($1)" "$2" |
||||||
|
sleep 0.5 |
||||||
|
} |
||||||
|
|
||||||
|
install(){ |
||||||
|
color Info "开始安装docker服务" |
||||||
|
yum install -y yum-utils device-mapper-persistent-data lvm2 git && \ |
||||||
|
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo && \ |
||||||
|
yum install -y docker-ce |
||||||
|
mkdir -p /etc/docker |
||||||
|
color Success "安装完成" |
||||||
|
color Info "开始配置镜像加速器" |
||||||
|
tee /etc/docker/daemon.json <<-'EOF' |
||||||
|
{ |
||||||
|
"registry-mirrors": ["https://pilvpemn.mirror.aliyuncs.com"] |
||||||
|
} |
||||||
|
EOF |
||||||
|
cat >> /etc/sysctl.conf <<EOF |
||||||
|
net.bridge.bridge-nf-call-ip6tables = 1 |
||||||
|
net.bridge.bridge-nf-call-iptables = 1 |
||||||
|
net.ipv4.ip_forward=1 |
||||||
|
EOF |
||||||
|
systemctl daemon-reload && \ |
||||||
|
systemctl enable docker --now |
||||||
|
} |
||||||
|
install |
||||||
|
color Success "配置完成" |
@ -0,0 +1,8 @@ |
|||||||
|
#!/usr/bin/bash |
||||||
|
|
||||||
|
yum -y install bash-completion |
||||||
|
source /usr/share/bash-completion/bash_completion |
||||||
|
|
||||||
|
source <(kubectl completion bash) |
||||||
|
|
||||||
|
echo "source <(kubectl completion bash)" >> ~/.bashrc |
@ -0,0 +1,46 @@ |
|||||||
|
#!/bin/bash |
||||||
|
# by newrain |
||||||
|
# time 2019-11-28 |
||||||
|
# lv 2.0 |
||||||
|
level=5.7 |
||||||
|
password="QianFeng@123" |
||||||
|
remote_user="remote" |
||||||
|
remote_passwd="QianFeng@123" |
||||||
|
unset c |
||||||
|
color(){ |
||||||
|
declare -A c=([Error]=31 [Success]=32 [Warning]=33 [Info]=34) |
||||||
|
#echo -e "\033[${c[$1]}m[`date +%T`]($1) $2\033[0m" |
||||||
|
printf "\033[${c[$1]}m%-10s%-10s %-30s\033[0m\n" "[`date +%T`]" "($1)" "$2" |
||||||
|
sleep 0.5 |
||||||
|
} |
||||||
|
|
||||||
|
color Info "此脚本用于yum 安装mysql" |
||||||
|
color Warning "此脚本将删除所有mysql数据,如需备份请ctrl+c终止脚本,程序将在3秒后执行" |
||||||
|
sleep 3 |
||||||
|
if [[ $UID -ne 0 ]];then |
||||||
|
color Warning "使用root 执行此脚本" |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
|
||||||
|
color Warning "清理环境" |
||||||
|
systemctl stop mysqld mariadb &>/dev/null |
||||||
|
yum erase -y `rpm -qa |grep mariadb` 2>/dev/null |
||||||
|
yum erase -y `rpm -qa |grep mysql` 2>/dev/null |
||||||
|
rm -rvf /etc/my.cnf /var/lib/mysql /var/log/mysql* |
||||||
|
userdel -rf mysql &>/dev/null |
||||||
|
ping -c1 -w1 www.baidu.com &>/dev/null |
||||||
|
if [[ $? -eq 0 ]];then |
||||||
|
if [ ! -f /tmp/.init ];then |
||||||
|
yum install -y https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm |
||||||
|
fi |
||||||
|
else |
||||||
|
color Error "网络错误" |
||||||
|
exit 22 |
||||||
|
fi |
||||||
|
yum -y install mysql-community-server mysql-community-devel --disablerepo mysql80 --enablerepo mysql57 --nogpgcheck |
||||||
|
systemctl start mysqld |
||||||
|
color Warning "启动成功,初始密码如下(mysql5.7前版本没有初始密码)" |
||||||
|
passwd=$(grep -o 'root@localhost.*' /var/log/mysqld.log | awk 'END{print $NF}') |
||||||
|
mysqladmin -uroot -p$passwd password $password && \ |
||||||
|
mysql -uroot -p$password -e "grant all on *.* to \"$remote_user\"@'%' identified by \"$remote_passwd\"; flush privileges;" |
||||||
|
color Success "安装完成 初始密码为$password" |
@ -0,0 +1,82 @@ |
|||||||
|
#!/usr/bin/bash |
||||||
|
|
||||||
|
unset c |
||||||
|
color(){ |
||||||
|
declare -A c=([Error]=31 [Success]=32 [Warning]=33 [Info]=34) |
||||||
|
#echo -e "\033[${c[$1]}m[`date +%T`]($1) $2\033[0m" |
||||||
|
printf "\033[${c[$1]}m%-10s%-10s %-30s\033[0m\n" "[`date +%T`]" "($1)" "$2" |
||||||
|
sleep 0.5 |
||||||
|
} |
||||||
|
cpu(){ |
||||||
|
cpus=$(grep processor /proc/cpuinfo |wc -l) |
||||||
|
cpuModel=$(grep "model name" /proc/cpuinfo | uniq | awk -F ':' '{print $2}') |
||||||
|
cpuCache=$(grep "cache size" /proc/cpuinfo | uniq | awk -F ':' '{print $2}') |
||||||
|
printf "%-10s\t%-50s\n" "[CPU]" "[Info]" |
||||||
|
printf "%-10s\t%-50s\n" "cpu核心:" "${cpus/ /}核" |
||||||
|
printf "%-10s\t%-50s\n" "cpu型号:" "${cpuModel/ /}" |
||||||
|
printf "%-10s\t%-50s\n" "cpu缓存:" "${cpuCache/ /}" |
||||||
|
} |
||||||
|
memory(){ |
||||||
|
memTotal=$(awk -F':' '/MemTotal:/{print $2}' /proc/meminfo | awk '{print $1,$2}') |
||||||
|
memFree=$(awk -F':' '/MemFree:/{print $2}' /proc/meminfo | awk '{print $1,$2}') |
||||||
|
memBuffer=$(awk -F':' '/Buffers:/{print $2}' /proc/meminfo | awk '{print $1,$2}') |
||||||
|
memCached=$(awk -F':' '/^Cached:/{print $2}' /proc/meminfo | awk '{print $1,$2}') |
||||||
|
swapTotal=$(awk -F':' '/SwapTotal:/{print $2}' /proc/meminfo | awk '{print $1,$2}') |
||||||
|
swapFree=$(awk -F':' '/SwapFree:/{print $2}' /proc/meminfo | awk '{print $1,$2}') |
||||||
|
memDevice=$(dmidecode |grep -P -A 5 "Memory Device"|grep Size|grep -v 'Range' | wc -l) |
||||||
|
maxMem=$(dmidecode |grep "Maximum Capacity" | awk '{print $3,$4}') |
||||||
|
maxHz=$(dmidecode |grep "Max Speed" |uniq | awk '{print $3,$4}') |
||||||
|
printf "%-10s\t%-50s\n" "[Memory]" "[Info]" |
||||||
|
printf "%-10s\t%-50s\n" "内存总量:" "$memTotal" |
||||||
|
printf "%-10s\t%-50s\n" "内存剩余:" "$memFree" |
||||||
|
printf "%-10s\t%-50s\n" "内存写缓:" "$memBuffer" |
||||||
|
printf "%-10s\t%-50s\n" "内存读缓:" "$memCached" |
||||||
|
printf "%-10s\t%-50s\n" "临时缓存总量:" "$swapTotal" |
||||||
|
printf "%-10s\t%-50s\n" "临时缓存剩余:" "$swapFree" |
||||||
|
printf "%-10s\t%-50s\n" "内存条数:" "$memDevice" |
||||||
|
printf "%-10s\t%-50s\n" "最大支持内存:" "$maxMem" |
||||||
|
printf "%-10s\t%-50s\n" "内存频率:" "$maxHz" |
||||||
|
} |
||||||
|
disk(){ |
||||||
|
printf "%-10s\t%-15s\t%-30s\t%-5s\n" "[MountPoint]" "[Used]" "[FileSystem]" "[Size]" |
||||||
|
df -Th | awk 'BEGIN{ORS="\n"}$2 ~ /(ext|xfs)/{printf "%-10s\t%-15s\t%-30s\t%-5s\n",$NF,$(NF-1),$1,$3}' |
||||||
|
} |
||||||
|
|
||||||
|
os(){ |
||||||
|
os_release=$(hostnamectl | awk -F': ' '/Operating System/{print $2}') |
||||||
|
os_kernel=$(hostnamectl | awk -F': ' '/Kernel/{print $2}') |
||||||
|
hostname=$(hostnamectl | awk -F': ' '/Static hostname/{print $2}') |
||||||
|
printf "%-10s\t%-20s\n" "[Info]" "[Value]" |
||||||
|
printf "%-20s\t%-20s\n" "系统版本:" "$os_release" |
||||||
|
printf "%-20s\t%-20s\n" "内核版本:" "$os_kernel" |
||||||
|
printf "%-20s\t%-20s\n" "主机名称:" "$hostname" |
||||||
|
netIf=$(ip -f inet a | awk '/^[0-9]/{print $0}' |awk -F':' '{print $2}') |
||||||
|
netIfs=$(echo netIf |wc -w) |
||||||
|
printf "%-20s\t%-20s\t%-18s\n" "[InterFace]" "[IpAddress]" "[MacAddress]" |
||||||
|
for i in $netIf |
||||||
|
do |
||||||
|
# 网卡ip |
||||||
|
iname=$(ip -f inet a show dev $i | awk '/inet/{print $2}') |
||||||
|
# 网卡mac |
||||||
|
mname=$(ip -f link a show dev $i |awk '/link/{print $2}') |
||||||
|
printf "%-20s\t%-20s\t%-18s\n" "$i" "$iname" "$mname" |
||||||
|
done |
||||||
|
} |
||||||
|
|
||||||
|
color Info "开始读取本地信息" |
||||||
|
|
||||||
|
main(){ |
||||||
|
color Success "中央处理器信息" |
||||||
|
# cpu 信息查询函数 |
||||||
|
cpu |
||||||
|
color Success "内存信息" |
||||||
|
# 内存 信息查询函数 |
||||||
|
memory |
||||||
|
color Success "网络信息" |
||||||
|
os |
||||||
|
# 磁盘信息 |
||||||
|
color Success "磁盘信息" |
||||||
|
disk |
||||||
|
} |
||||||
|
|
||||||
|
main |
@ -0,0 +1,106 @@ |
|||||||
|
#!/usr/bin/bash |
||||||
|
|
||||||
|
color(){ |
||||||
|
unset c |
||||||
|
declare -A c=([Error]=31 [Success]=32 [Warning]=33 [Info]=34) |
||||||
|
#echo -e "\033[${c[$1]}m[`date +%T`]($1) $2\033[0m" |
||||||
|
printf "\033[${c[$1]}m%-10s%-10s %-30s\033[0m\n" "[`date +%T`]" "($1)" "$2" |
||||||
|
sleep 0.5 |
||||||
|
} |
||||||
|
|
||||||
|
static_addr(){ |
||||||
|
ifname=$(ip -f inet a | awk '/^2/{print $2}') |
||||||
|
ifname=$(echo ${ifname/:/}) |
||||||
|
ipaddr=$(ip -f inet a show dev $ifname | awk '/inet/{print $2}' | awk -F'/' '{print $1}') |
||||||
|
prefix=$(ip -f inet a show dev $ifname | awk '/inet/{print $2}' | awk -F'/' '{print $2}') |
||||||
|
gateway=$(ip r |awk '/default/{print $3}') |
||||||
|
cat > /etc/sysconfig/network-scripts/ifcfg-$ifname <<EOF |
||||||
|
TYPE="Ethernet" |
||||||
|
PROXY_METHOD="none" |
||||||
|
BROWSER_ONLY="no" |
||||||
|
BOOTPROTO="static" |
||||||
|
DEFROUTE="yes" |
||||||
|
IPV4_FAILURE_FATAL="no" |
||||||
|
NAME="${ifname}" |
||||||
|
UUID="`uuidgen`" |
||||||
|
DEVICE="${ifname}" |
||||||
|
ONBOOT="yes" |
||||||
|
IPADDR=${ipaddr} |
||||||
|
PREFIX=${prefix} |
||||||
|
GATEWAY=${gateway} |
||||||
|
DNS1=${gateway} |
||||||
|
DNS2=114.114.114.114 |
||||||
|
DNS3=8.8.8.8 |
||||||
|
EOF |
||||||
|
systemctl restart network |
||||||
|
ping -w1 -c1 www.baidu.com &>/dev/null && \ |
||||||
|
return 10 || \ |
||||||
|
return 20 |
||||||
|
} |
||||||
|
|
||||||
|
local_yum_make(){ |
||||||
|
cd /etc/yum.repos.d/ && \ |
||||||
|
rename .repo .repo.bak *.repo &>/dev/null |
||||||
|
grep '10.8.161.40 package.qf.com' /etc/hosts &>/dev/null |
||||||
|
if [ $? -ne 0 ];then |
||||||
|
cat >> /etc/hosts <<EOF |
||||||
|
10.8.161.40 package.qf.com |
||||||
|
EOF |
||||||
|
fi |
||||||
|
curl -o /etc/yum.repos.d/centos7.repo http://download.beyourself.org.cn/repo/centos7-repo && \ |
||||||
|
yum repolist && yum clean all && yum makecache && \ |
||||||
|
color Success "本地源配置完成" || color Error "yum配置错误,可以\ncd /etc/yum.repos.d/ && rm -rf centos7.repo && rename .repo.bak .repo *.repo.bak \n使用手动恢复历史yum" |
||||||
|
} |
||||||
|
|
||||||
|
remote_yum_make(){ |
||||||
|
cd /etc/yum.repos.d/ && \ |
||||||
|
rename .repo .repo.bak *.repo &>/dev/null |
||||||
|
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo |
||||||
|
curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo |
||||||
|
yum repolist && yum clean all && yum makecache && \ |
||||||
|
color Success "阿里源配置完成" || color Error "yum配置错误,可以\ncd /etc/yum.repos.d/ && rm -rf centos7.repo && rename .repo.bak .repo *.repo.bak \n使用手动恢复历史yum" |
||||||
|
} |
||||||
|
|
||||||
|
init(){ |
||||||
|
color Success "开始配置静态ip" |
||||||
|
static_addr |
||||||
|
if [ $? -eq 10 ];then |
||||||
|
color Success "静态ip配置并检测完成" |
||||||
|
else |
||||||
|
color Error "静态ip配置异常" |
||||||
|
fi |
||||||
|
color Info "正在关闭防火墙、selinux" |
||||||
|
color Warning "注意,这将降低服务器安全性" |
||||||
|
systemctl disable firewalld postfix --now && \ |
||||||
|
setenforce 0 ; sed -i 's/SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config && \ |
||||||
|
color Success "配置完成" || color Error "配置异常,请检查" |
||||||
|
color Info "配置yum源, 此操作将备份您的历史源" |
||||||
|
ping -w 1 -c 1 10.8.161.40 &>/dev/null |
||||||
|
if [ $? -eq 0 ];then |
||||||
|
local_yum_make |
||||||
|
else |
||||||
|
remote_yum_make |
||||||
|
fi |
||||||
|
color Info "开始安装常用软件" |
||||||
|
yum install -y wget unzip vim yum-utils httpd-tools psacct net-tools nc ntpdate jq htop && \ |
||||||
|
color Success "安装完成" || color Warning "部分包可能失败" |
||||||
|
color Info "开始进行时间校准" |
||||||
|
ntpdate ntp.aliyun.com && \ |
||||||
|
# 修改时间到硬件 |
||||||
|
clock -w |
||||||
|
#保存时间到硬件 |
||||||
|
hwclock -s |
||||||
|
color Success "时间校准完成" |
||||||
|
# color Info "修改终端前缀显示" |
||||||
|
# cat > /etc/profile.d/psdiy.sh <<EOF |
||||||
|
# export PS1="[\e[32m(\t)\u\e[36m@\h\e[31m\e[0m \W]\$ " |
||||||
|
# EOF |
||||||
|
# color Success "修改完成,重新进入终端查看" |
||||||
|
echo {"time": "`date +'%F %T'`"} > /tmp/.init |
||||||
|
} |
||||||
|
if [ -f /tmp/.init ];then |
||||||
|
color Success "检测到此前已进行初始化,如需重新执行,请删除: rm -f /tmp/.init" |
||||||
|
exit 0 |
||||||
|
fi |
||||||
|
init |
||||||
|
color Success "初始化完成" |
@ -0,0 +1,39 @@ |
|||||||
|
#!/usr/bin/bash |
||||||
|
|
||||||
|
path=/opt/py3104 |
||||||
|
unset c |
||||||
|
color(){ |
||||||
|
declare -A c=([Error]=31 [Success]=32 [Warning]=33 [Info]=34) |
||||||
|
#echo -e "\033[${c[$1]}m[`date +%T`]($1) $2\033[0m" |
||||||
|
printf "\033[${c[$1]}m%-10s%-10s %-30s\033[0m\n" "[`date +%T`]" "($1)" "$2" |
||||||
|
sleep 0.5 |
||||||
|
} |
||||||
|
|
||||||
|
mkdir -pv $path |
||||||
|
cd $path && \ |
||||||
|
yum -y install gcc gcc-c++ zlib-devel bzip2-devel sqlite-devel readline-devel libffi-devel && \ |
||||||
|
color Info "openssl 包下载,请稍等..." && \ |
||||||
|
wget http://download.beyourself.org.cn/package/openssl-1.1.1n.tar.gz && \ |
||||||
|
tar xf openssl-1.1.1n.tar.gz && \ |
||||||
|
cd openssl-1.1.1n && \ |
||||||
|
./config --prefix=/usr/local/openssl && \ |
||||||
|
make -j $(cat /proc/cpuinfo | grep processor |wc -l) && make install && cd .. && \ |
||||||
|
wget http://download.beyourself.org.cn/package/Python-3.10.4.tar.xz && \ |
||||||
|
tar xf Python-3.10.4.tar.xz && \ |
||||||
|
cd Python-3.10.4 && \ |
||||||
|
./configure --enable-shared --prefix=/usr/local/python3.10.4 --with-openssl=/usr/local/openssl --with-openssl-rpath=auto && \ |
||||||
|
make -j $(cat /proc/cpuinfo | grep processor |wc -l) && \ |
||||||
|
make install && \ |
||||||
|
echo "/usr/local/python3.10.4/lib" >> /etc/ld.so.conf && \ |
||||||
|
ldconfig && \ |
||||||
|
echo "export PATH=/usr/local/python3.10.4/bin:\$PATH" >> /etc/profile && \ |
||||||
|
color Success "python安装完成" |
||||||
|
|
||||||
|
color Info "配置pip加速" |
||||||
|
mkdir ~/.pip &>/dev/null |
||||||
|
tee ~/.pip/pip.conf <<EOF |
||||||
|
[global] |
||||||
|
index_url=https://mirrors.aliyun.com/pypi/simple |
||||||
|
timeout=6000 |
||||||
|
EOF |
||||||
|
color Success "配置完成" |
@ -0,0 +1,100 @@ |
|||||||
|
#!/usr/bin/bash |
||||||
|
|
||||||
|
<<! |
||||||
|
redis 多实例配置脚本 |
||||||
|
! |
||||||
|
|
||||||
|
REDIS_INSTALL_PATH=/data/application/redis |
||||||
|
REDIS_COMMAND_PATH=$REDIS_INSTALL_PATH/src |
||||||
|
REDIS_CONFIG_PATH=$REDIS_INSTALL_PATH/redis.conf |
||||||
|
REDIS_BIND_IP="0.0.0.0" |
||||||
|
REDIS_PORT=6379 |
||||||
|
REDIS_INSTANCE_PATH=/opt/instace/redis |
||||||
|
ERROR_INFO=" |
||||||
|
Usage: $0 \n |
||||||
|
\t-i\t--install 安装redis\n |
||||||
|
\t-s\t--instance 多实例配置\n |
||||||
|
\t--start\t启动redis\n |
||||||
|
\t--stop\t停止redis\n" |
||||||
|
|
||||||
|
install_function(){ |
||||||
|
if [ ! -d $REDIS_INSTALL_PATH ];then |
||||||
|
mkdir -p $REDIS_INSTALL_PATH |
||||||
|
fi |
||||||
|
yum -y install gcc gcc-c++ make wget |
||||||
|
wget http://download.redis.io/releases/redis-4.0.9.tar.gz && \ |
||||||
|
tar -zxvf redis-4.0.9.tar.gz && \ |
||||||
|
cp -r redis-4.0.9/* $REDIS_INSTALL_PATH && \ |
||||||
|
rm -rf redis-4.0.9 redis-4.0.9.tar.gz |
||||||
|
cd $REDIS_INSTALL_PATH && \ |
||||||
|
make |
||||||
|
echo -e "安装完成\nredis安装目录:$REDIS_INSTALL_PATH\nredis配置文件:$REDIS_CONFIG_PATH\nredis命令目录:$REDIS_COMMAND_PATH" |
||||||
|
} |
||||||
|
|
||||||
|
install_instance_function(){ |
||||||
|
INSTANCE_NAME=$1 |
||||||
|
if [ ! -d $REDIS_INSTANCE_PATH ];then |
||||||
|
mkdir -p $REDIS_INSTANCE_PATH |
||||||
|
fi |
||||||
|
if [ ! -d $REDIS_INSTALL_PATH ];then |
||||||
|
echo "请先安装redis,或修改脚本中的安装目录" |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
if [ -d $REDIS_INSTANCE_PATH/$INSTANCE_NAME ];then |
||||||
|
echo "实例已存在" |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
mkdir -p $REDIS_INSTANCE_PATH/$INSTANCE_NAME |
||||||
|
cp $REDIS_CONFIG_PATH $REDIS_INSTANCE_PATH/$INSTANCE_NAME/redis.conf |
||||||
|
sed -i "s#^port.*#port $INSTANCE_NAME#" $REDIS_INSTANCE_PATH/$INSTANCE_NAME/redis.conf |
||||||
|
sed -i "s#^bind.*#bind $REDIS_BIND_IP#" $REDIS_INSTANCE_PATH/$INSTANCE_NAME/redis.conf |
||||||
|
sed -i "s#^pidfile.*#pidfile $REDIS_INSTANCE_PATH/$INSTANCE_NAME/redis_$INSTANCE_NAME.pid#" $REDIS_INSTANCE_PATH/$INSTANCE_NAME/redis.conf |
||||||
|
sed -i "s#^logfile.*#logfile $REDIS_INSTANCE_PATH/$INSTANCE_NAME/redis_$INSTANCE_NAME.log#" $REDIS_INSTANCE_PATH/$INSTANCE_NAME/redis.conf |
||||||
|
sed -i "s#^dir.*#dir $REDIS_INSTANCE_PATH/$INSTANCE_NAME#" $REDIS_INSTANCE_PATH/$INSTANCE_NAME/redis.conf |
||||||
|
sed -i "s#^daemonize.*#daemonize yes#" $REDIS_INSTANCE_PATH/$INSTANCE_NAME/redis.conf |
||||||
|
echo -e "实例安装完成\n实例目录:$REDIS_INSTANCE_PATH/$INSTANCE_NAME\n实例配置文件:$REDIS_INSTANCE_PATH/$INSTANCE_NAME/redis.conf" |
||||||
|
} |
||||||
|
|
||||||
|
option=$(getopt -l "help::,install,instance,start,stop" -o "i,s:" -a -- "$@") |
||||||
|
if [ $# -lt 1 ];then |
||||||
|
echo -e $ERROR_INFO |
||||||
|
exit 0 |
||||||
|
fi |
||||||
|
eval set -- "$option" |
||||||
|
while true |
||||||
|
do |
||||||
|
case $1 in |
||||||
|
-i|--install) |
||||||
|
install_function |
||||||
|
shift 1 |
||||||
|
;; |
||||||
|
-s|--instance) |
||||||
|
install_instance_function $2 |
||||||
|
shift 2 |
||||||
|
;; |
||||||
|
--start) |
||||||
|
for i in `ls $REDIS_INSTANCE_PATH` |
||||||
|
do |
||||||
|
$REDIS_COMMAND_PATH/redis-server $REDIS_INSTANCE_PATH/$i/redis.conf |
||||||
|
echo "启动实例$i" |
||||||
|
done |
||||||
|
shift 1 |
||||||
|
;; |
||||||
|
--stop) |
||||||
|
for i in `ls $REDIS_INSTANCE_PATH` |
||||||
|
do |
||||||
|
$REDIS_COMMAND_PATH/redis-cli -p $i shutdown |
||||||
|
echo "停止实例$i" |
||||||
|
done |
||||||
|
shift 1 |
||||||
|
;; |
||||||
|
--) |
||||||
|
shift |
||||||
|
break |
||||||
|
;; |
||||||
|
*) |
||||||
|
echo -e $ERROR_INFO |
||||||
|
exit 0 |
||||||
|
;; |
||||||
|
esac |
||||||
|
done |
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue