提交版本

master v22.1212.1
Your Name 2 years ago
commit a3a51074a0
  1. 11
      README.md
  2. 53
      database/backup.sh
  3. 59
      database/dbBak.sh
  4. 116
      database/install_db_v3.sh
  5. 93
      database/source_mysql.sh
  6. 81
      database/yum-mysql.sh
  7. 365
      games/bash2048.sh
  8. 77
      games/jumpserver.sh
  9. 215
      games/snake.sh
  10. 635
      games/tetris.sh
  11. 29
      jumpserver/jumpserver1.0/jumpserver.sh
  12. 50
      jumpserver/jumpserver1.0/tools.sh
  13. 28
      jumpserver/jumpserver2.0/jumpserver.sh
  14. 56
      jumpserver/jumpserver2.0/tools.sh
  15. 21
      os-test/dashboard.sh
  16. 73
      os-test/monitor.sh
  17. 68
      os-test/mysql.sh
  18. 14
      os-test/netflow.sh
  19. 100
      os-test/osinit.sh
  20. 200
      os-test/系统初始化实例脚本.sh
  21. 30
      os/get-cmd-history.sh
  22. 8
      os/get-docker-compose.sh
  23. 35
      os/get-docker-image.sh
  24. 34
      os/get-docker-latest.sh
  25. 8
      os/get-k8s-cmd.sh
  26. 46
      os/get-mysql57.sh
  27. 82
      os/get-os-info.sh
  28. 106
      os/get-os-init.sh
  29. 39
      os/get-py3104.sh
  30. 100
      os/get-redis-instance.sh
  31. 1400
      os/get-shadowsocks-all.sh

@ -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…
Cancel
Save