linux下批量修改文件网址:
http://oldboy.blog.51cto.com/2561410/711342
1.企业面试题1:
在/oldboy目录下,创建oldboy-{1-10}文件(用for循环实现)。
方法一:
#bin!bash
[ !-d /oldboy ] && mkdir /oldboy
for f in `seq 10`
do
touch /oldboy/oldboy-$f
done
方法二:
cd /oldboy
touch oldboy-{1..10}
2.企业面试题2:
将以上文件名中的oldboy全部改成linux(用for循环实现)。提示:以后再考大家把文件名中的oldboy批量替换成linux,并且扩展名改成大写
方法一:
#bin!bash
[ -d /oldboy ] && cd oldboy
for f in `ls oldboy*`
do
mv $f `echo $f | sed 's#oldboy#linux#g'`
done
方法二:(不用for循环)rename重命名命令
rename oldboy linux *oldboy*
# from:改的对象 to:将from改成什么 file:对什么文件改
3.企业面试3
创建是个用户,并产生密码(密码不重复)
方法:
for i in `seq -w 10`
do
useradd oldboy$i && echo "oldboy$i" | passwd --stdin oldboy$i (对用户修改密码)
done
4.企业面试题4:
批量创建10个系统帐号oldboy01-oldboy10并设置密码(密码为随机8位字符串)。
随机数产生:
1.echo $RANDOM
产生8位随机数:
echo $RANDOM | md5sum| cut -c 1-8
2.openssl产生随机数
openssl rand -base64 8
3.date 通过时间获得随机数
date +%s%N | md5sum| cut -c 1-8
方法:
for i in `seq -w 10`
do
pass=`echo $RANDOM| md5sum | cut -c 1-8`
useradd oldboy$i && \
echo " $pass" | passwd --stdin oldboy$i (对用户修改密码)
echo -e " user: oldboy$i \t pass:$pass" >> /tmp/user.log
done
数字加0的思路:http://oldboy.blog.51cto.com/2561410/788422
5.企业面试5
测试网络是否连接
解答:ping是否通
ping通后,返回值为0 (echo $? 为0)
#/bin/bash
for n in `seq 254`
do
ping -c2 10.0.0.$n >/dev/null 2 >$1
if [ $? -eq 0 ]
then
echo "10.0.0.$n is up ">>/tmp/uplist.log
else
echo "10.0.0.$n is up">>/tmp/downlist.log
fi
done
6.企业面试6
写一个脚本解决DOS攻击生产案例
提示:根据web日志或者或者网络连接数,监控当某个IP并发连接数或者短时内PV达到100,即调用防火墙命令封掉对应的IP,监控频率每隔3分钟。防火墙命令为:iptables -A INPUT -s 10.0.1.10 -j DROP
解答:
方法一:
web 也可以分析日志,把单IP PV数高的封杀掉
awk ' {print $1} ' access.log | grep -v "^$" |sort | uniq -c
(grep -v "^$" 去除空行)
(uniq -c 排重复 添序号)
4 10.0.0.31
3 10.0.0.32
1 10.0.0.35
#/bin/bash
while true
do
awk ' {print $1} ' access.log | grep -v "^$" |sort |uniq -c > /tmp/tmp.log
exec < /tmp/tmp.log
while read line
do
ip=` echo $line | awk ' {print $2} ' `
count=` echo $line| awk '{print $1} ' `
if [ $count -gt 100 ] && [ `iptables -nL | grep "$ip" | wc -l` -lt 1 ] (防止iptables策略添加太多)
then
iptables -I INPUT -s $ip -j DROP
echo " $line is dropped" >> /tmp/droplist.log
fi
done
sleep 5 (每5秒执行一次)
done
方法二:网络连接数 netstat
协议 收到 发送 本地地址 外部地址 状态 (6列)
TCP 0 0 192,0,0,:900 192,178.0:800 ESTTABLESD
netstat -an | grep EST |awk -F ' [ :]+' ' {print $6} ' (-F [ : ]空格和:分隔的) []中间一个空格一个:
netstat -an | grep EST |awk -F ' [ :]+' ' {print $6} ' | sort | uniq -c
1 12.117.81..1
8 180.118.186.0
1 202.0.0.20
grep EST |awk -F ' [ :]+' ' {print $6} ' | sort | uniq -c
#/bin/bash
while true
do
grep EST a.log | awk -F '[ :]+' '{print $6}' |sort |uniq -c > /tmp/tmp/log
exec < /tmp/tmp.log
while read line
do
ip=` echo $line | awk ' {print $2} ' `
count=` echo $line| awk '{print $1} ' `
if [ $count -gt 100 ] && [ `iptables -nL | grep "$ip" | wc -l` -lt 1 ] (防止iptables策略添加太多)
then
iptables -I INPUT -s $ip -j DROP
echo " $line is dropped" >> /tmp/droplist.log
fi
done
sleep 5 (每5秒执行一次)
done
7.企业面试题7
mysql分库备份脚本
<pre name="code" class="objc">#!/bin/bash
MYUAER=root
MYPASS=oldboy
CmdPath=”/application/mysql/bin
SOCK=/data/ 3306 /mysql.sock"
MYCMD=" mysql -u$MYUSER -p$MYPASS -S $SOCKET"
MYDUMP=" mysqldump -u$MYUSER -p$MYPASS -S $SOCKET"
for database in oldboy ff dd (for database in `#MYCMD -e "show databeaes;" | sed '1,2d' | egrep -v "mysql | schema"` 去掉前两行说明,即为所有数据库的库名,完成对其所有库备份,排除mysql schema,否则会报错,但是不排除也可以备份)
do
$MYDUMP $database | gzip > /server/backup/${database}_$(data +%F).sql.gz
done
</pre><pre>
最后会生成:
dd_2014-2-1.sql.gz
ff_2014-2-1.sq;.gz
oldboy_2012-2-1.sql.gz
mysql分表备份
#!/bin/bash
MYUAER=root
MYPASS=oldboy
CmdPath=”/application/mysql/bin
SOCK=/data/ 3306 /mysql.sock"
MYCMD=" mysql -u$MYUSER -p$MYPASS -S $SOCKET"
MYDUMP=" mysqldump -u$MYUSER -p$MYPASS -S $SOCKET"
for database in `#MYCMD -e "show databeaes;" | sed '1,2d' | egrep -v "mysql | schema"`
do
mkdir /server/backup/${database} -p
for table in `$MYCMD -e "show tables from &database;" | sed '1d'` (第一行去掉,剩下为所有表名)
do
$MYDUMP $database $table| gzip > /server/backup/${database}/${database}_${table}_$(data +%F).sql.gz
done
done
会生成:/server/backup/dd /server/backup/ff目录在其目录下生成对应的表
tree /server/backup
8.企业面试8
把单词中字母个数大于6的打印出来
for word in i am oldboy teacher welcome to oldboy training class.
do
[ ${#word} -le 6] && echo $word (#word代表word单词个数)
done
或者: [ echo $word | wc -L -le 6 ]
</pre><pre name="code" class="objc">#!/bin/bash
array=(i am oldboy teacher welcome to oldboy training class)
for((i=0; i<${#array[@]};i++))
do
if [ `expr length "${array[$i]}"` -le 6 ]
then
echo ${array[i]}
fi
done
9.企业面试9
从第一行开始间隔10行打印,直到51行结束
seq 1 10 51 (从1 到51 步长10,隔十取)
1 11 21 31 41 51
sed -n '1p' /etc/services (取第一行)
方法一:
#!/bin/bash
for n in `seq 1 10 51`
do
sed -n '”${n}p“ /etc/services (-n取消默认输出,${n}p是说np是变量,是为了让系统知道n是变量,所以加上{n}p)
done
方法二:
sed -n '1~10p' /etc/services (~10代表步长10)
方法三:(awk)
seq 10 >oldboy.txt
awk ' { if (NR>2&&NR<6) print $0}' oldboy.txt (打印3-5行 $0打印整行)
awk ' { if (NR%10 ==1) print $0} ' /etc/services (行对10取余为1打印)