使用for循环在/oldboy目录下批量创建10个html文件,其中每个文件需要包含10个随机小写字母加固定字符串oldboy。
知识储备:随机数生成
方法1:
openssl rand -base64 40|sed 's#[^a-z]##g'|cut -c 2-11
#生成40位随机数字,替换掉不是小写字符的,cut截取10位字母
---------------------------------------------------
脚本实现:
[root@m01 /server/scripts/web01/shell]#cat file_name.sh
#!bin/bash
Path=/oldboy
[ -d $Path ]||mkdir $Path
cd $Path
for n in {1..10}
do
random=`openssl rand -base64 45|sed 's#[^a-z]##g'|cut -c 1-10`
touch $Path/${random}_oldboy.html
done
在上一题的基础上把oldboy改成oldgirl,小写的后缀改成大写的。
知识储备:mv 更改文件名
file1=gmbumhxazk_oldboy.html
echo ${file1/oldboy.html/oldgirl.HTML}
mv $file1 ${file1/oldboy.html/oldgirl.HTML}
脚本:
[root@m01 /server/scripts]#cat 19_1_2.sh
#!bin/bash
Path=/oldboy
[ -d $Path ]||mkdir $Path
cd $Path
for file in `ls *_oldboy.html`
do
mv $file ${file/oldboy.html/oldgirl.HTML}
done
----------------------------------------
扩展:方法2:rename
rename "oldgirl.HTML" "oldboy.html" *HTML
from to 针对后缀为HTML的文件
示例:gmbumhxazk_oldboy.html
[root@m01 /oldboy]#rename "oldboy.html" "oldgirl.HTML" *html
[root@m01 /oldboy]#ls
gmbumhxazk_oldgirl.HTML
-------------------------------
方法3:awk命令拼接
实现:mv hznbmkezvq_oldboy.html hznbmkezvq_oldgirl.HTML
ls *html|awk -F "[_.]" '{print "mv",$0,"oldgirl_"$2".HTML"}'
以上命令相当于mv oldboy_ciskonulft.html oldgirl_ciskonulft.HTML
ls *html|awk -F "[_.]" '{print "mv",$0,"oldgirl_"$2".HTML"}'|bash 交给bash执行
批量创建10个系统账号oldboy01-oldboy10并设置密码(密码为随机数,要求是字符和数字等的混合)。
[root@m01 /server/scripts]#cat 19_1_3.sh
#!bin/bash
. /etc/init.d/functions
for user in oldboy{01..10}
do
passwd=`echo $user|md5sum|cut -c 1-8` #创建随机密码
if [ `id $user 2>/dev/null|wc -l` -ge 1 ] #错误定向到空,判断用户是否存在
then
action "The $user already exists." /bin/false
continue
else
useradd $user &>/dev/null &&{
echo "$passwd"|passwd --stdin $user &>/dev/null #创建密码,不输出
echo -e "$user\t$passwd" >>/tmp/user.txt #把密码写入文件
}
if [ $? -eq 0 ];then
action "create $user successfully!" /bin/true
else
action "create $user with error!" /bin/false
fi
fi
done
写一个shell脚本,判断10.0.0.0/24网络里,当前在线的IP有哪些?
[root@m01 /server/scripts]#cat 19_1_14.sh
#!bin/bash
for n in {1..254}
do
{
ping -W 2 -c 2 10.0.0.$n &>/dev/null #-W 超时时间 ,-c次数
if [ $? -eq 0 ]
then
echo "10.0.0.$n is alive."
#else
# echo "10.0.0.$n is dead."
fi
}&
done
---------------------------------------------------------------------------------------------------------------
nmap命令-网络探测工具和安全和端口扫描器
-sP:进行ping扫描 (主机发现),然后打印出对扫描做出响应的那些主机。 没有进一步的测试(如端口扫描或者操作系统探测)。
-sS:TCP SYN扫描,只扫描不进行连接,在一个没有入侵防火墙的快速网络上,每秒钟可以扫描数千个端口。
nmap -sP 10.0.0.0/24|awk '/Nmap scan report for/{print $NF}' #只返回存活ip
用来检查远端服务端口是否通畅
nmap 10.0.0.7 -p 80|grep open|wc -l #存活返回1
请根据Web日志或系统网络连接数,监控某个IP的并发连接数,若短时内PV达到100,即调用防火墙命令封掉对应的IP。防火墙命令为:“iptables -I INPUT -s IP地址 -j DROP”。
参考答案:
先分析Web日志,可以每分钟或每小时分析一次,这里给出按小时处理的方法。
可以将日志按小时进行分割,分成不同的文件,根据分析结果把PV数高的单IP封掉。例如,每小时单IP的PV数超过500,则即刻封掉,这里简单地把日志的每一行近似看作一个PV,实际工作中需要计算实际页面的数量,而不是请求页面元素的数量,另外,很多公司都是以NAT形式上网的,因此每小时单IP的PV数超过多少就会被封掉,还要根据具体的情况具体分析,本题仅给出一个实现的案例,读者使用时需要考虑自身网站的业务去使用。
知识储备:
iptables -L -n:查看ip的访问情况
uniq 用于报告或者忽略重复行
-c:count,在该行显示重复连接的次数
-d:仅显示重复出现的行列
-u:仅显示出现一次的行列
sort 对文本文件内容进行排序,可以针对文件的内容按照单位进行排序
-r:以相反的顺序来排序
-b:忽略每行前面开始出现的空行
-c:检查文件是否已经按照顺序排序
-n:按照数值大小排序
-o:将排序后的内容结果指定到文件当中
-t:分个字符,指定排序时所用的栏位分隔字符
------------------------------------------
[root@web02 /server/scripts]#vim ctrl_ddos.sh
#!/bin/sh
function check(){
netstat -an >netstat.log
#对文件进行处理,把外网访问的所有的ip地址进行分类按,访问次数进行排名,导入到一个临时的文件,然后对这个临时文件进行提取ip和次数
awk -F "[: ]+" '/ESTABLISHED/{print $(NF-2)}' netstat.log | sort | uniq -c| sort -rn| head -10 >/tmp/ip.log
while read line
do
ip=`echo $line|awk {print $2}`
count=`echo $line|awk '{print $1}'`
if [ $count -gt 500 ] && [ `iptables -L -n|grep "$ip"|wc -l` -lt 1 ]
then
echo "$ip is dangerous!"
iptables -I INPUT -s $ip -j DROP #封杀pv大于500的ip,测试可以个位数
echo "$line is dropped." >>/tmp/droplist_$(date +%F).log #导出日志
else
echo "$line is safe."
fi
done</tmp/ip.log
}
main(){
while true
do
check
sleep 180
done
}
[root@web02 /server/scripts]#cat mysql_backup_db.sh
#!/bin/sh
user=root
passwd=密码
backup=/tmp/mysql
[ -d $backup ]||mkdir /tmp/mysql -p
for dbname in `mysql -u${user} -p${passwd} -e "show databases;" 2>/dev/null|sed 1d|egrep -v "_schema"`
do
mysqldump -u${user} -p${passwd} -B $dbname 2>/dev/null|gzip >${backup}/${dbname}_$(date +%F).sql.gz
done
解决mysql与mysqldump要用户密码问题:在/etc/my.cnf加入模块的用户密码,授权:chmod 400 /etc/my.cnf
mysql.sock被删除了,systemctl restart mysqld就行了
[root@web02 /server/scripts]#cat mysql_backup_tables.sh
#!/bin/sh
user=root
passwd=密码
backup=/tmp/mysql
[ -d $backup ]||mkdir /tmp/mysql -p
for dbname in `mysql -u${user} -p${passwd} -e "show databases;" 2>/dev/null|sed 1d|egrep -v "_schema"`
do
for tablename in `mysql -e "show tables from $dbname;"|sed 1d`
do
mysqldump -u${user} -p${passwd} --lock-tables=0 $dbname $tablename 2>/dev/null|gzip >${backup}/${dbname}_${tablename}_$(date +%F).sql.gz
done
done
利用bash for循环打印下面这句话中字母数不大于6的单词(某企业面试真题)。
I am oldboy teacher welcome to oldboy training class
知识储备:
计算变量长度
如word=sakjndhkasj
echo ${#word}
echo ${word|wc -L
xpr length "${word}"
echo $word|awk '{print length}'
echo $word|awk '{print length($0)}'
-------------------------------------
[root@m01 /server/scripts/web01/shell]#cat word.sh
#!bin/bash
chars="I am oldboy teacher welcome to oldboy training class"
for word in $chars
do
if [ ${#word} -le 6 ]
then
echo $word
fi
done
------------------------------振哥答案---------------------------------------------------------------------
[root@m01 /server/scripts]#cat word.sh
#!bin/bash
arr=(I am oldboy teacher welcome to oldboy training class)
for n in ${#arr[*]}
do
if [ ${#arr[n]} -le 6 ]
then
echo "${arr[n]}"
fi
done
综合实战案例:开发Shell脚本分别实现以脚本传参及read读入的方式比较2个整数大小。用条件表达式(禁止if)进行判断并以屏幕输出的方式告知用户比较的结果。
注意:一共要开发2个脚本。当使用脚本传参及read读入的方式时,需要对变量是否为数字,以及传参个数是否正确给予提示。
[root@m01 /server/scripts]#cat 6_35_1.sh
#!bin/bash
read -p "please input two num:" a b
judge(){
[ -z "$a" ]||[ -z "$b" ]&&{
echo "please input two num again."
exit 1
}
expr $a + $b + 10 &>/dev/null
[ $? -eq 0 ]||{
echo "please input two num again."
exit 1
}
}
compare(){
[ $a -lt $b ]&&{
echo "$a < $b"
exit 0
}
[ $a -eq $b ]&&{
echo "$a = $b"
exit 0
}
[ $a -gt $b ]&&{
echo "$a > $b"
exit 0
}
}
main(){
judge
compare
}
main
-----------------------------------
if方法:
[root@m01 /server/scripts]#cat compare.sh
#!bin/bash
compare(){
read -p "please input two num:" a b
expr $a + $b + 10 &>/dev/null
if [ $? -eq 0 ]
then
if [ $a -lt $b ];then
echo "$a < $b"
elif [ $a -eq $b ];then
echo "$a = $b"
else
echo "$a > $b"
fi
else
echo "please input two num again."
fi
}
main(){
compare
}
main
打印选择菜单。
[root@m01 /server/scripts]#cat guess.sh
#!bin/bash
cat<<EOF
1.doc
2.cat
3.pig
4.exit
EOF
while true
do
read -p "please input your num:" n
case $n in
1)
echo "I guess,you like doc."
;;
2)
echo "I guess,you like cat."
;;
3)
echo "I guess,you like pig."
;;
4|*)
echo "I don't know what you like"
exit
esac
done
[root@m01 /server/scripts]#cat check_url.sh
#!bin/bash
. /etc/init.d/functions
check_count=0
url_list=(
http://www.baidu.com
http://blog.etiantian.org
http://10.0.0.7
)
wait_url(){
echo -n '3秒后,进行检查URL操作.'
for ((i=0;i<3;i++))
do
echo -n "."
sleep 1
done
echo
}
check_url(){
wait_url
a=`echo ${#url_list[*]}`
for ((i=0;i<$a;i++))
do
wget -o /dev/null -T 3 --tries=1 --spider ${url_list[$i]} >/dev/null 2>&1
#wget -q ${url_list[$i]}
if [ $? -eq 0 ];then
action "${url_list[$i]}" /bin/true
else
action "${url_list[$i]}" /bin/false
fi
done
((check_count++))
}
main(){
while true
do
check_url
echo "----------check count:${check_count}---------"
sleep 10
done
}
main
知识储备:
查看服务与端口号
netstat -lntup|grep 3306|wc -l
netstat -lntup|grep mysql|wc -l
ss -lntup|grep mysql #ss类似于netstat
lsof -i :3306
ps -ef|grep nginx|grep -v grep|wc -l
--------------------------
[root@m01 /server/scripts]#cat nginx.sh
#!bin/bash
if [ ` ps -ef | grep -v grep | grep nginx | wc -l ` -ge 1 ]
then
echo "Nginx is Running."
else
echo "Nginx is Stopped."
Fi
-----------------------------------------------
yum install telnet nmap nc -y
nmap 127.0.0.1 -p 3306|grep open|wc -l
#<==查看远端3306端口是否开通,过滤open关键字,结果返回1,说明有open关键字,表示3306端口是通的。
echo -e "\n"|telnet 127.0.0.1 3306 2>/dev/null/grep Connected|wc -l
#<==telnet是常用来检测远端服务器端口是否通畅的一个好用的命令,在非交互时需要采用特殊写法才行,过滤的关键字为Connected,返回1,说明有Connected,表示3306端口是通的。
nc -w 2 127.0.0.1 3306 &/dev/null
#<==nc的命令很强大,这里用来检测端口。根据执行命令的返回值判断端口是否通畅,如果返回0,则表示通畅,-w为超时时间。
扩展
检测服务
yum install telnet nmap nc -y
nmap 127.0.0.1 -p 3306|grep open|wc -l
#查看远端3306端口是否开通,过滤open关键字,结果返回1,说明有open关键字,表示3306端口是通的。
echo -e "\n"|telnet 127.0.0.1 3306 2>/dev/null/grep Connected|wc -l
#telnet是常用来检测远端服务器端口是否通畅的一个好用的命令,在非交互时需要采用特殊写法才行,过滤的关键字为Connected,返回1,说明有Connected,表示3306端口是通的。
nc -w 2 127.0.0.1 3306 &/dev/null
#nc的命令很强大,这里用来检测端口。根据执行命令的返回值判断端口是否通畅,如果返回0,则表示通畅,-w为超时时间。
=========================================================================================
检测网站url:
wget --spider --timeout=10 --tries=2 www.baidu.com &>/dev/null
#wget后面加url的检测方法,&>/dev/nul1表示不输出,只看返回值。--spider的意思是模拟爬取,--timeout=10的意思是10秒超时,--tries=2表示如果不成功,则重试2次。
wget -T 10 -q --spider http://www.baidu.com &>/dev/null
#用法同第一个wget,-q表示安静的。
curl -s -o /dev/null http://www.baidu.com &>/dev/null
#利用curl进行检测,-s为沉默模式,-o /dev/null表示将输出定向到空。
if [ `netstat -lntup|grep mysqld|wc -l` -gt 0 ]
then
echo "MySQL is running."
exit 0
else
echo "MySQL is Stopped."
systemctl start mysqld
fi
监控Web站点目录(/var/html/www)下的所有文件是否被恶意篡改(文件内容被更改了),如果有则打印改动的文件名(发邮件),定时任务每3分钟执行一次。
1、问题分析
文件内容被改:大小数量、修改时间会变-----利用md5sum指纹校验。
2、解答:
1)建立数据
2)建立初始文件指纹库与文件库
3、检验文件内容与数量
4、开发检查指纹识别脚本
#选取/application/nginx/html作为站点目录,建立文件内容指纹库----md5sum -c可以检测文件内容变化
[root@web02 /]#find /application/nginx/html -type f|xargs md5sum >/opt/fingerprint.db.ori
#建立文件数量和名字库-----备份的文件与站点的文件比对可以检测被篡改的文件
[root@web02 /]#find /application/nginx/html -type f >/opt/file.db.ori
[root@web02 /server/scripts]#cat 19_14_1.sh
#!/bin/sh
retval=0
fgprint_path=/opt/fingerprint.db.ori
file_db_path=/opt/flie.db.ori
error_log=/opt/web_error.log
check_dir=/application/nginx/html
[ -e $check_dir ]||exit 1
#judge file content
echo "--------------$(date +%F,%T)-------------" >>$error_log
echo '#md5sum -c --quiet /opt/fingerprint.db.ori' >>$error_log
md5sum -c --quiet $fgprint_path &>>$error_log
retval=$?
#judge file count
find $check_dir -type f >/opt/file.db_curr.ori
echo "#diff /opt/file.db*" &>>$error_log
diff /opt/file.db* &>>$error_log
if [ $retval -ne 0 -o `diff /opt/file.db*|wc -l` -ne 0 ]
then
echo "Site with error!"
else
echo "Site is ok."
fi
nginx编译安装参考方法2:https://blog.csdn.net/qq_42468502/article/details/108815245
13.1 脚本:
[root@web01 /etc/init.d]#cat nginxd
#!bin/bash
#description:stop/start nginx server
path=/application/nginx/sbin
retval=0
. /etc/init.d/functions
function start(){
if [ `netstat -lntup|grep nginx|wc -l` -eq 0 ];then
$path/nginx
retval=$?
if [ $retval -eq 0 ];then
action $"nginx is started." /bin/true
else
action $"nginx is started." /bin/false
return $retval
fi
else
echo "nginx is running."
return 0
fi
}
function stop(){
if [ `netstat -lntup|grep nginx|wc -l` -eq 1 ];then
$path/nginx -s stop
retval=$?
if [ $retval -eq 0 ];then
action $"nginx is stopped." /bin/true
return $retval
else
action $"nginx is stopped." /bin/false
return $retval
fi
else
echo "nginx is no running."
return $retval
fi
}
case "$1" in
start)
start
retavl=$?
;;
stop)
stop
retval=$?
;;
resart)
stop
sleep 2
start
retval=$?
;;
*)
echo $"Usage: $0 {start|stop|restart}"
exit 1
esac
exit $retval
13.2 授予脚本执行权限:
chmod +x /etc/init.d/nginxd
13.3 测试脚本:
[root@web01 /etc/init.d]#sh nginx.sh start
nginx is running.
[root@web01 /etc/init.d]#sh nginx.sh stop
nginx is stopped.
13.4 server配置:
[root@web01 /usr/lib/systemd/system]#cat nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/application/nginx/logs/nginx.pid
ExecStart=/etc/init.d/nginxd start
ExecReload=/etc/init.d/nginxd restart
ExecStop=/etc/init.d/nginxd stop
[Install]
WantedBy=multi-user.target
授予权限:
chmod +x /usr/lib/systemd/system/nginx.service
用法:systemctl start|stop|restart nginx
rpm -qa rsync 查看是否安装rsyncd服务
server服务配置文件:
[root@web01 /]#vim /etc/systemd/system/rsyncd_oldboy.service
[Unit]
Description=Rsync service
After=network.target
[Service]
Type=forking
PIDFile=/var/run/rsyncd.pid
ExecStart=/etc/rc.d/init.d/rsyncd start
ExecReload=/etc/rc.d/init.d/rsyncd restart
ExecStop=/etc/rc.d/init.d/rsyncd stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
启动脚本:
[root@web01 /]#cat /etc/rc.d/init.d/rsyncd
#!/bin/bash
if [ $# -ne 1 ]
then
echo $"usage:$0 {start|stop|restart}"
exit 1
fi
if [ "$1" = "start" ]
then
rsync --daemon
sleep 2
if [ `netstat -lntup|grep rsync|wc -l` -ge 1 ]
then
echo "rsyncd is started."
exit 0
fi
elif [ "$1" = "stop" ]
then
killall rsync $>/dev/null
sleep 2
if [ `netstat -lntup|grep rsync|wc -l` -eq 0 ]
then
echo "rsyncd is stopped."
exit 0
fi
if [ "$1" = "restart" ]
then
killall rsync
sleep 1
killpro=`netstat -lntup|grep rsync|wc -l`
rsync --daemon
sleep 1
startpro=`netstat -lntup|grep rsync|wc -l`
if [ $killpro -eq 0 -a $startpro -ge 1 ]
then
echo "rsyncd is restarted"
exit 0
fi
else
echo $"usage:$0 {start|stop|restart}"
exit 1
fi
测试:
[root@web01 /etc/systemd/system]#systemctl start rsyncd_oldboy.service
Warning: rsyncd_oldboy.service changed on disk. Run 'systemctl daemon-reload' to reload units.
[root@web01 /etc/systemd/system]#systemctl daemon-reload
[root@web01 /etc/systemd/system]#systemctl start rsyncd_oldboy.service
[root@web01 /etc/systemd/system]#lsof -i :873
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsync 5242 root 3u IPv4 68562 0t0 TCP *:rsync (LISTEN)
rsync 5242 root 5u IPv6 68563 0t0 TCP *:rsync (LISTEN)
[root@web01 /etc/systemd/system]#systemctl stop rsyncd_oldboy.service
[root@web01 /etc/systemd/system]#lsof -i :873
学生有去企业项目实践的机会,但是,名额有限,仅限3人(班长带队)。
因此需要开发一个抓间的程序来挑选学生,具体要求如下:
1)执行脚本后,输入想去的同学的英文名字全拼,产生随机数(01~99之间的数字),数字越大就越有机会去参加项目实践,对于前面已经抓到的数字,下次不能再出现。
2)输入第一个名字之后,屏幕输出信息,并将名字和数字记录到文件里,程序不能退出,继续等待别的学生输入。
答案转自:天津项目学生实践抓阄题目
方法1:
>/tmp/a.log
while true
do
while true
do
random=`echo $((RANDOM%99))`
if [ `grep -w $random /tmp/a.log|wc -l` -eq 1 ]
then
random=`echo $((RANDOM%99))`
else
break
fi
done
read -p "请输入姓名全拼:" name
if [ "$name" == "exit" ]
then
echo "抓阄结束,结果如下"
break
else
echo -e "$random\t$name"|tee -a /tmp/a.log
fi
done
sort -rn -k1 /tmp/a.log|head -3
方法2:
[root@oldboy scripts]# cat zhuajiu1.sh
#!/bin/bash
>/tmp/name.log
random(){
random="$((RANDOM%100))"
if [ `egrep -w "$random" /tmp/name.log|wc -l` -ge 1 ]
then
continue
fi
}
name(){
read -p "请输入你的名字的全拼:" name
if [ "$name" = "exit" ];
then
break
fi
if [ `egrep -w "$name" /tmp/name.log|wc -l` -ge 1 ]
then
echo "名字重复,请重新输入"
continue
fi
echo -e "$random\t\t$name"|tee -a /tmp/name.log
}
main(){
while true
do
random
name
done
echo "抓阄结束,排序结果如下:"
sort -rn -k1 /tmp/name.log|head -3
}
main
已知下面的字符串是通过将RANDOM随机数采用md5sum加密后任意取出连续10位的结果,请破解这些字符串对应的md5sum前的数字?
21029299
00205d1c
a3da1677
1f6d12dd
890684b
1、RANDOM范围0-32767
#!bin/bash
arr=(
21029299
00205d1c
a3da1677
1f6d12dd
890684b
)
Num=0
get_md5() {
>md5.txt #第一次创建,装随机数
#for n in {1..32767}
for ((Num=0;Num<=32767;Num++))
do
{ #大括号内容并发执行
Stat=$(echo $Num|md5sum|cut -c 1-8)
echo "$Stat $Num" >> md5.txt #建立数字和md5sum后内容的对应关系
}&
done
return 0
}
find_md5() {
word=$(echo "${arr[@]}"|sed -r 's# |\n#|#g') #把数组整成一行:21029299|00205d1c|a3da1677|1f6d12dd|890684b
grep -E "$word" md5.txt
}
main() {
if [ ! -s md5.txt ] #如果文件大小为0
then
get_md5
fi
find_md5
}
main