目录
项目 | 难度 | key |
---|---|---|
输出一行文字 | 1 | echo |
输出若干行文字脚本 | 2 | << EOF |
输出若干行文字到指定文件脚本 | 3 | |
1 | ||
1 | ||
创建若干文件夹脚本 | 5 | seq |
创建若干文件脚本 | 10 | |
1 | ||
1 | ||
验证本机某端口是否打开 | 4 | lsof |
验证本机若干端口是否打开 | 10 | 数组用法 |
1 | ||
批量启动zookeeper 服务器 | 8 | |
批量查看zk服务器是否启动 | 4 | |
1 | ||
定时备份数据库 | 10 | mysqldump |
批量关闭虚拟机(文件中读取列表) | 7 | |
批量关闭虚拟机(手工指令列表) | 7 | |
1 | ||
1 |
标题1
要求
实现过程描述
实现脚本
备注
01 输出一行文字
实现脚本
[root@shell37 ~]# vim echotxt.sh
echo hello world!
[root@shell37 ~]# sh echotxt.sh
hello world!
备注
02 输出若干行文字
实现脚本
[root@shell37 ~]# vim echosomeline.sh
cat << EOF
hello wold!
i love u
this is tiza
this is leo
this is end
!
EOF
[root@shell37 ~]# sh echosomeline.sh
hello wold!
i love u
this is tiza
this is leo
this is end
!
备注
cat << EOF ----表示 将后面的输入交给cat 显示
在shell中,文件分界符(通常写成EOF,你也可以写成FOE或者其他任何字符串)紧跟在<<符号后,意思是分界符后的内容将被当做标准输入传给<<前面的命令,直到再次在独立的一行遇到这个文件分界符(EOF或者其他任何字符,注意是独立一行,EOF前面不能有空格)。通常这个命令是cat,用来实现一些多行的屏幕输入或者创建一些临时文件。
03 输出若干行文字到指定文件
实现脚本
把输出追加到文件 写法一:
[root@shell37 ~]# vim echosomeline2txt.sh
cat << EOF > ./someline.txt
hello wold!
i love u
this is tiza
this is leo
this is end
!
EOF
[root@shell37 ~]# sh echosomeline2txt.sh
当前目录下会有文件someline.txt 生成
-rw-r--r--. 1 root root 60 Mar 16 08:08 someline.txt
[root@shell37 ~]# cat someline.txt
hello wold!
i love u
this is tiza
this is leo
this is end
!
把输出追加到文件 写法2:
cat >./someline2.txt << EOF
hello wold!
i love u
this is second someline
EOF
~
备注
2、把输出追加到 out.txt 文件
root@******:~# cat<out.txt
输出重定向到空设备文件
要求
实现过程描述
Linux下使用shell命令时经常使用类似这样的Shell输出重定向:
1>/dev/null 2>&1
在Shell命令的结尾,我们可以通过>符号来重定向输出。
- 标准输入stdin文件描述符为0,标准输出stdout文件描述符为1,标准错误stderr文件描述符为2
- /dev/null 空设备文件,相当于垃圾桶
- 重定向符号:>
逐一解释上面的Shell重定向命令:
(1) >符号代表输出重定向
(2) >前面的数字:
0代表标准输入
1代表stdout标准输出,默认值为1,所以”1>/dev/null”可以简写为”>/dev/null”
2代表stderr标准错误输出
(3)2>&1代表把stderr标准错误输出 重定向 到stdout标准输出
所以,1>/dev/null 2>&1的解释就是
将stdout标准输出重定向到空设备文件/dev/null ,同时将stderr标准错误输出的重定向跟stdout标准输出重定向一致,也输出到空设备文件/dev/null。
https://blog.csdn.net/sunxiaopengsun/article/details/83623495
实现脚本
// 正常 的输出打印
[root@storm51 ~]# echo aaaa
aaaa
// 输出重定向到Null
[root@storm51 ~]# echo aaaa 1>/dev/null 2>&1
[root@storm51 ~]#
备注
04 创建文件夹
要求
/opt/leoShell/leoL1 文件夹下创建三个文件夹
实现过程描述
实现脚本
[root@aliyunleo leoShell]# vim shell_01_mkdir.sh
[root@aliyunleo leoShell]# sh shell_01_mkdir.sh
for num in $(seq 1 3);
do
mkdir -p /opt/leoShell/leoL1/leoL2_0${num}
done
备注
[root@aliyunleo leoShell]# pwd
/opt/leoShell
[root@aliyunleo leoShell]# tree
.
├── leoL1
│ ├── leoL2_01
│ ├── leoL2_02
│ └── leoL2_03
└── shell_01_mkdir.sh
4 directories, 1 file
11 创建文件
要求
/opt/leoShell/leoL2 文件夹下创建三个文件,并作有效输入内容
实现过程描述
实现脚本
[root@aliyunleo leoShell]# pwd
/opt/leoShell
[root@aliyunleo leoShell]# vim shell_02_mkfile.sh
for num in $(seq 1 3);
do
mkdir -p /opt/leoShell/leoL2
touch /opt/leoShell/leoL2/script-00${num}.sh
cat << EOF >/opt/leoShell/leoL2/script-00${num}.sh
this is num 00${num}; hello man!
EOF
done
[root@aliyunleo leoShell]# sh shell_02_mkfile.sh
[root@aliyunleo leoShell]# tree leoL2
leoL2
├── script-001.sh
├── script-002.sh
└── script-003.sh
0 directories, 3 files
[root@aliyunleo leoShell]# cat leoL2/script-001.sh
this is num 001; hello man!
备注
21 验证本机端口是否开启
要求
实现过程描述
实现脚本
[root@10-1-129-151 ~]# vim port_is_open.sh
#!/bin/bash
port=80
str=`lsof -i:80 | wc -l`
if [ "$str" -gt "0" ];then
echo "$port is open"
else
echo "$port is closed"
fi
[root@10-1-129-151 ~]# sh port_is_open.sh
80 is closed
备注
22 验证本机多个端口是否开启
要求
实现过程描述
实现脚本
[root@10-1-129-151 ~]# vim ports_is_open.sh
#!/bin/bash
ports=(22 23 80 8080 6379)
echo "数组元素个数为: ${#ports[@]}"
for port in ${ports[@]};
do
str=`lsof -i:$port | wc -l`
if [ "$str" -gt "0" ];then
echo "$port is open"
else
echo "$port is closed"
fi
done
[root@10-1-129-151 ~]# sh ports_is_open.sh
数组元素个数为: 5
22 is open
23 is closed
80 is closed
8080 is closed
6379 is closed
备注
31 验证多台服务器某个端口是否打开
要求
实现过程描述
实现脚本
[root@10-1-129-151 shelltest]# cat ip.txt
10.1.129.151
10.1.129.161
[root@10-1-129-151 shelltest]# cat remote_port_is_open.sh
#!/bin/bash
IP_FILES="./ip.txt"
COMMAND="$*"
for IP in `cat $IP_FILES`
do
# 验证指定IP 22 端口是否开启
echo -e "\033[32mThe $IP : port 22 results:\033[0m"
nc -zvw3 $IP 22
echo
done
[root@master ~]# chmod +x remote_port_is_open.sh
[root@10-1-129-151 shelltest]# sh remote_port_is_open.sh
---- 22 已开启
The 10.1.129.151 : port 22 results:
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 10.1.129.151:22.
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.
---- 22 已开启
The 10.1.129.161 : port 22 results:
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 10.1.129.161:22.
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.
备注
31验证多台服务器多个端口是否打开
要求
实现过程描述
实现脚本
[root@10-1-129-151 shelltest]# cat ip.txt
10.1.129.151
10.1.129.161
[root@10-1-129-151 shelltest]# cat port.txt
22
80
[root@10-1-129-151 shelltest]# cat remote_multiple_port_is_open.sh
#!/bin/bash
for ip in `more ip.txt`
do
for port in `more port.txt`
do
echo -e "\033[32mThe $ip $port results:\033[0m"
nc -zvw3 $ip $port
echo
done
done
[root@10-1-129-151 shelltest]# chmod +x remote_multiple_port_is_open.sh
结果
[root@10-1-129-151 shelltest]# sh remote_multiple_port_is_open.sh
The 10.1.129.151 22 results:
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 10.1.129.151:22.
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.
The 10.1.129.151 80 results:
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connection refused.
The 10.1.129.161 22 results:
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 10.1.129.161:22.
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.
The 10.1.129.161 80 results:
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connection refused.
41 定时备份数据库
要求
平台已经安装过Mysql ,如果没有安装过mysql 详见
linux centos 安装 mysql5.7
https://blog.csdn.net/wei198621/article/details/115052757
可以通过下面语句测试mysql 是否安装,及是否可以正常使用,
本示例mysql 安装在 38 机器上面
Last login: Mon Mar 22 08:01:28 2021 from 192.168.121.1
[root@shell38 ~]# systemctl status mysqld
Active: active (running) since Mon 2021-03-22 08:01:40 PDT; 22h ago
... ...
[root@shell38 ~]# mysql -u root -p
Enter password: root198621
......
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| leodb |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql> use leodb;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+-----------------+
| Tables_in_leodb |
+-----------------+
| myorder |
+-----------------+
1 row in set (0.01 sec)
mysql> select * from myorder;
+------+------+
| id | name |
+------+------+
| 100 | dog |
+------+------+
1 row in set (0.09 sec)
mysql>
实现过程描述
- 脚本在 /usr/sbin/mysql_db_backup.sh (root用户操作)
- crond 调度 leodb 到 /data/backup/db
- 备份后的文件要打包成 ###.tar.gz 形式 如2021-03-21_202020.tar.gz
- 检查是否有十天前的备份文件存在,如果有,删除
在这里插入代码片
--第一步验证 结果
[root@shell38 sbin]# sh mysql_db_backup.sh
2021-03-23_072605
--第二步验证 结果
[root@shell38 2021-03-23_072605]# pwd
/data/backup/db/2021-03-23_072605
--第三步验证 结果
[root@shell38 2021-03-23_072605]# pwd
/data/backup/db/2021-03-23_072605
[root@shell38 2021-03-23_072605]# ll
total 4
-rw-r--r--. 1 root root 750 Mar 23 07:26 2021-03-23_072605.sql.gz
---------------解压gz文件
[root@shell38 2021-03-23_072605]# gunzip 2021-03-23_072605.sql.gz
[root@shell38 2021-03-23_072605]# ll
total 4
-rw-r--r--. 1 root root 2033 Mar 23 07:26 2021-03-23_072605.sql
[root@shell38 2021-03-23_072605]# cat 2021-03-23_072605.sql
-- MySQL dump 10.13 Distrib 5.7.33, for Linux (x86_64)
--
-- Host: localhost Database: leodb
-- ------------------------------------------------------
-- Server version 5.7.33
--
-- Current Database: `leodb`
--
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `leodb` /*!40100 DEFAULT CHARACTER SET latin1 */;
USE `leodb`;
-- Table structure for table `myorder`
DROP TABLE IF EXISTS `myorder`;
CREATE TABLE `myorder` (
`id` int(11) DEFAULT NULL,
`name` varchar(32) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
INSERT INTO `myorder` VALUES (100,'dog');
--第四步验证 结果
[root@shell38 db]# pwd
/data/backup/db
[root@shell38 db]# ll
total 4
-rw-r--r--. 1 root root 985 Mar 23 07:39 2021-03-23_073920.tar.gz
[root@shell38 db]#
--第五步验证 结果
[root@shell38 sbin]# sh mysql_db_backup.sh
2021-03-23_074508
mysqldump: [Warning] Using a password on the command line interface can be insecure.
2021-03-23_074508/
2021-03-23_074508/2021-03-23_074508.sql.gz
backup database leodb success
--第五步
[root@shell38 db]# crontab -l
30 2 * * * /usr/sbin/mysql_db_backup.sh
实现脚本
[root@shell38 sbin]# pwd
/usr/sbin
[root@shell38 sbin]# cat mysql_db_backup.sh
#!/bin/bash
#backup dir
BACKUP=/data/backup/db
#current time
DATETIME=$(date +%Y-%m-%d_%H%M%S)
#------------------------------------stop and test 01
echo $DATETIME
#address
HOST=localhost
#user
DB_USER=root
#pass
DB_PW=root198621
#db
DATABASE=leodb
# create backup dir if not exist then create
# current shou test it could create a directory
# /data/backup/db/2021-03-23_071543
#------------------------------------stop and test 02
[ ! -d "${BACKUP}/${DATETIME}" ] && mkdir -p "${BACKUP}/${DATETIME}"
#backup db
mysqldump -u${DB_USER} -p${DB_PW} --host=${HOST} -q -R --databases ${DATABASE} | gzip > ${BACKUP}/${DATETIME}/$DATETIME.sql.gz
#------------------------------------stop and test 03
#mk gz to tar.gz
cd ${BACKUP}
tar -zcvf $DATETIME.tar.gz ${DATETIME}
# delete the dir before
rm -rf ${BACKUP}/${DATETIME}
#------------------------------------stop and test 04
# remove the files 10 days
find ${BACKUP} -atime +10 -name "*.tar.gz" -exec rm {} \;
echo "backup database ${DATABASE} success "
[root@shell38 sbin]#
备注
批量关闭虚拟机(文件中读取列表)
要求
实现过程描述
仿照文章
https://blog.csdn.net/qq_43083688/article/details/109730518
实现脚本
[root@centos7-7 bin]# pwd
/usr/local/bin
[root@centos7-7 bin]# ll
-rw-r--r--. 1 root root 186 Apr 11 00:57 shutdownorder4stormlist.txt
-rwxr--r--. 1 root root 776 Apr 11 00:55 shutdownorder4storm.sh
[root@centos7-7 bin]# cat shutdownorder4storm.sh
#!/bin/bash
while true ;do
host=`awk 'NR>1{print $1}' /usr/local/bin/shutdownorder4stormlist.txt | sort -r`
echo "
1. shutdown all hosts
2. reboot all hosts
3. exit
"
read -p "please input option: " option
case $option in
1)
echo "===========shutdown now============"
for hosts in ${host}
do
ssh -f $hosts shutdown -h now && echo -e "\033[32m ${hosts} has closed 33[0m" || echo -e "\033[31;5m ${hosts} close failed \033[0m"
sleep 1;
done
;;
2)
echo "===========reboot============"
for hosts in ${host}
do
ssh -f $hosts reboot && echo -e "\033[32m ${hosts} has rebooted \33[0m" || echo -e "\033[31;5m ${hosts}reboot failed \033[0m"
sleep 1;
done
;;
3|exit|quit|e|q)
exit;
;;
*)
echo "INput args Error!!"
;;
esac
done
[root@centos7-7 bin]#
[root@centos7-7 bin]# cat shutdownorder4stormlist.txt
# current file is for storm include storm zk
192.168.121.111 zk1
192.168.121.112 zk2
192.168.121.113 zk3
192.168.121.51 storm51
192.168.121.52 storm52
192.168.121.53 storm53
备注
批量关闭虚拟机(手工指令列表)
要求
实现过程描述
shutdownorder4anyhosts.sh zk1 zk2 zk3
zk1 zk2 为 /etc/hosts 中指定过的名称 ,也可以直接是Ip地址
shutdownorder4anyhosts.sh 192.168.121.111
实现脚本
[root@centos7-7 bin]# pwd
/usr/local/bin
[root@centos7-7 bin]# ll
-rwxr--r--. 1 root root 703 Apr 11 01:08 shutdownorder4anyhosts.sh
[root@centos7-7 bin]# cat shutdownorder4anyhosts.sh
#!/bin/bash
while true ;do
host=$@
echo "
1. shutdown all hosts
2. reboot all hosts
3. exit
"
read -p "please input option: " option
case $option in
1)
echo "===========shutdown now============"
for hosts in ${host}
do
ssh -f $hosts shutdown -h now && echo -e "\033[32m ${hosts} has closed 33[0m" || echo -e "\033[31;5m ${hosts} close failed \033[0m"
sleep 1;
done
;;
2)
echo "===========reboot============"
for hosts in ${host}
do
ssh -f $hosts reboot && echo -e "\033[32m ${hosts} has rebooted \33[0m" || echo -e "\033[31;5m ${hosts}reboot failed \033[0m"
sleep 1;
done
;;
3|exit|quit|e|q)
exit;
;;
*)
echo "INput args Error!!"
;;
esac
done
[root@centos7-7 bin]#
[root@centos7-7 bin]# shutdownorder4anyhosts.sh zk1 zk2 zk3
1. shutdown all hosts
2. reboot all hosts
3. exit
please input option: 1
===========shutdown now============
...
...
备注
批量启动zookeeper 服务器
要求
实现过程描述
实现脚本
[root@centos7-7 bin]# pwd
/usr/local/bin
[root@centos7-7 bin]# cat ctlzookeeperauto.sh
#!/bin/bash
case $1 in
"start"){
for i in zk1 zk2 zk3
do
echo "***************$i***********"
ssh $i "/root/zookeeper-3.4.12/bin/zkServer.sh start /root/zkdata/zoo.cfg"
done
};;
"stop"){
for i in zk1 zk2 zk3
do
echo "***************$i***********"
ssh $i "/root/zookeeper-3.4.12/bin/zkServer.sh stop /root/zkdata/zoo.cfg"
done
};;
esac
[root@centos7-7 bin]# ll
备注
批量查看zk服务器是否启动
要求
实现过程描述
实现脚本
[root@centos7-7 bin]# cat xcallzk.sh
#!/bin/bash
params=$@
i=1
for (( i=1 ; i <= 3 ; i = $i + 1 )) ; do
echo ============= zk$i $params =============
ssh zk$i "$params"
done
执行过程 ,此过程需要配置 jps 指令的软连接
xcallzk.sh jps
[root@centos7-7 bin]# pwd
/usr/local/bin
[root@centos7-7 bin]# ll
-rwxr--r--. 1 root root 394 Apr 8 06:06 ctlzookeeperauto.sh
lrwxrwxrwx. 1 root root 36 Apr 8 06:09 jps -> /usr/local/java/jdk1.8.0_251/bin/jps
-rwxr--r--. 1 root root 145 Apr 8 06:06 xcallzk.sh