then
echo “${ADDRESS} is undergoing maintenance”
else
echo “station is unexpecedly DOWN!”
fi
## 13.编写脚本createuser.sh,实现如下功能:使用一个用户名作为参数,如果指定参数的用户存在就显示其存在,否则添加它。并设置初始化密码为123456,显示添加用户的id号等信息在此新用户第一次登录时,会提示用户立即更改密码,如果没有参数,就提示:请输入用户名。
read -p “Please input the username :” NAME
INFO=“echo id ${NAME}
”
if
id ${NAME} &> /dev/null
then
echo -e “\033[1;32mThe user ${NAME} is exist,and KaTeX parse error: Undefined control sequence: \n at position 22: …'s information:\̲n̲{INFO}\033[0m”
else
echo -e "The user ${NAME} dont exist "
echo -e “\033[1;31mI will crate the account ${NAME},please choice “yes” or “no” \033[0m”
read -p "Please choice :" YN
if
[[ ${YN} =~ ^([Yy]|[Ee]|[Ss])$ ]];
then
useradd ${NAME};
echo "${NAME}:123456" |chpasswd
chage -d1 ${NAME}
echo "The default password is 123456 ,you must change your passwd next login (force)"
else
echo -e "\033[1;33mwill leave and exit!!!\033[0m"
fi
fi
## 14.编写脚本yesorno.sh,提示用户输入yes或no,并判断用户输入的是yes或者no,或者其他的信息。
read -p “Do you agree(yes/no)?” INPUT
VALUE=echo $INPUT |tr -s 'A-Z' 'a-z'
case ${INPUT} in
yes|ye|y)
echo “you input is YES”
;;
no|n)
echo “you input is NO”
;;
*)
echo “you input is others”
esac
## 15.编写脚本filetype.sh判断用户输入文件文件路径,显示其文件类型,(普通,目录吗,连接,其他文件类型)
read -p “Please input the file name what you want to test:” FILE
if
[ -f ${FILE} ]
then
echo “Its a normal file!”
elif
[ -d ${FILE} ]
then
echo “Its a directory!”
elif
[ -l ${FILE} ]
then
echo"Its a link file!"
elif
[ -b ${FILE} ]
then
echo “Its a block file!”
elif
[ -c ${FILE} ]
then
echo “Its a character file!”
elif
[ -s ${FILE} ]
then
echo “Its a socket file!”
elif
[ -p ${FILE} ]
then
echo “Its a pipe file!”
fi
## 16.编写脚本checkint.sh判断用户输入的参数是否为正整数
read -p “Please input the number:” NUM
if
[ -n “echo ${NUM} |sed 's/[0-9]/g/'
” ] && [ ${NUM} -gt 0 ]
[[ ${NUM} =~ ^([0-9]+)$ ]] && [ ${NUM} -gt 0 ]
then
echo “The number is positive int”
else
echo “The number is not positive int”
fi
~
## 17.编写脚本reset.sh,实现系统安装后的初始化环境,包括1,别名 2,环境变量,,如PS1等3,安装常用软件包如:tree5,实现固定的IP设置6vim的设置等。
正在完善中。。。
## 18.程序出错,中断整个脚本
方法一、
if
[ $? -ne 0 ]
then
return $?
方法二、
set -e 加set -e参数,但凡脚本出现非0返回值,中断整个脚本
## 19.利用for循环语句进行一些工作
### 19.1 判断/var/目录下所有文件的类型
read -p "please input the directory : " DIR
for i in ls ${DIR}
do
if
[ -b
D
I
R
/
{DIR}/
DIR/{i} ]
then
echo “${i} is a block file”
elif
[ -c
D
I
R
/
{DIR}/
DIR/{i} ]
then
echo “${i} is a character file”
elif
[ -f
D
I
R
/
{DIR}/
DIR/{i} ]
then
echo “${i} is a normal file”
elif
[ -h
D
I
R
/
{DIR}/
DIR/{i} ]
then
echo “${i} is a link file”
elif
[ -p
D
I
R
/
{DIR}/
DIR/{i} ]
then
echo “${i} is a pipe file”
elif
[ -d
D
I
R
/
{DIR}/
DIR/{i} ]
then
echo “${i} is a directory!”
elif
[ -s
D
I
R
/
{DIR}/
DIR/{i} ]
then
echo “${i} is a socket file”
fi
done
### 19.2添加10个用户user1-user10,密码为8位随机字符
#!/bin/bash
for i in {1…10}
do
useradd user${i}
pass=cat /dev/urandom |tr -dc '[[:alnum:]]' |head -c 8
echo ${pass} |passwd --stdin
echo ${pass} >> /data/passwd.txt
done
echo “the user user{i} is created!”
### 19.3/etc/rc.d/rc3.d目录下分别分别有多个以k开头和以S开头的文件;分别读取每个文件以k开头的输出为文件加stop,以S开头的输出为文件名加start,如K34filename stop S66filename start
for i in ls /etc/rc.d/rc3.d
do
if
[ “$(echo
i
∣
c
u
t
−
c
1
)
"
=
=
"
S
"
]
t
h
e
n
e
c
h
o
−
e
"
{i} |cut -c1)" == "S" ] then echo -e "
i∣cut−c1)"=="S"]thenecho−e"{i} start”
else
echo -e “${i} stop”
fi
done
### 19.4编写脚本,提示输入正整数n的值,计算1+2+…n的总和
#!/bin/bash
read -p “please input positive int n” N
for((sum=0,i=1;i<=${N};sum+=i,i++))
do
true
done
echo “the result is ${sum}”
### 19.5计算100以内所有能被3整除的整数之和
#!/bin/bash
sum=0
for i in {1…100}
do
if
[
[
[
[{i}%3] -eq 0 ]
then
sum=
[
[
[sum+$i]
fi
done
echo “the result is $sum”
### 19.6编写脚本,提示请输入网址,如192.168.0.0,判断输入的网段中主机在线的状
read -p “please input the adress” ADDRESS
if
ping -c2 -w2 KaTeX parse error: Expected 'EOF', got '&' at position 11: {ADDRESS} &̲> /dev/null the…{ADDRESS} is up"
elif
grep -q “
A
D
D
R
E
S
S
"
/
m
a
i
n
t
e
n
a
n
c
e
.
t
x
t
t
h
e
n
e
c
h
o
"
{ADDRESS}" ~/maintenance.txt then echo "
ADDRESS" /maintenance.txtthenecho"{ADDRESS} is undergoing maintenance”
else
echo “station is unexpecedly DOWN!”
fi
### 19.7打印99乘法表
### 19.8在/etcdir目录下创建10个html文件,文件名格式为数字N(从1到10)加随机8个字母,如:1AbCdeFgH.html
mkdir -p /data/num_uradom
for i in {1…10}
do
cd /data/num_urandom
touch ${i}cat /dev/urandom |tr -dc '[[:alnum:]]' |head -c8
.html
done
### 19.9打印等腰三角形
for((i=1;i<=9;i++))
do
for((j=9;j>=i;j–))
do
echo -n " "
done
for((j=2;j<=i;j++))
do
echo -n "\*"
for((j=1;j<=i;j++))
do
echo -n "\*"
done
done
done
### 19.10猴子第一天摘下若干个桃子,当即吃了一半,还不够,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,只剩下一个桃子,求第一天摘了多少桃子。
#!/bin/bash
sum=1
for ((n=1;n<10;n++));do
??sum=
[
2
∗
[2*
[2∗[$sum+1]]
done
echo “所摘桃子数: $sum”``
## 20.利用while实现脚本
### 20.1编写脚本,求100内所有正奇数之和
### 20.2编写脚本,提示输入网络地址,如192.168.0.0,判断输入的网段中主机的在线状态,并统计在线和离线主机各有多少
### 20.3编写脚本,打印9x9乘法表
### 20.4 编写脚本用变量RANDOM生成10个随机数,输出这10个数字,并显示其中的最大值和最小值。
### 20.5编写脚本,实现打印国际象棋
for((i=1;i<=8;i++));do
for((j=1;j<=8;j++));do
let sum=(“
i
"
+
"
i"+"
i"+"j”)%2
if [ “${sum}” -eq 1 ];then
echo -ne “\033[1;43m \033[0m”
else
echo -ne “\033[1;47m \033[0m”
fi
done
echo
done
### 20.6后续六个字符串:efbaf257cd、4be9c40b8b、44b2395c46、f8c8873ce0、b902c16c8b、ad865d2f63是通过对随机数变量RANDOM随机执行命令:echo$RANDOM|md5sum|cut -c1-10后的结果,请破解这些字符对应的RANDOM值。
## 21.每隔三秒钟到系统上获取已经登录的用户信息;如果发现用户hacker登录,则将登录时间和主机记录于日志/var/log/login.log中,并退出脚本
until who |grep -q ‘^panda’ ;do
sleep 3
done
who |grep ‘^hacker’ |tr -s ’ ’ |cut -d ’ ’ -f1,3,5 >>/var/log/login.log
echo “日志信息已记录”
## 22 . 用文件名做参数,统计所有参数文件的总行数
read -p "Please input a little filename: " FILES
while [ -n “$FILES” ];do
echo -e “\033[1;33m lines are cat $FILES |wc -l
\e[0m”
break
done
## 23.用两个以上的数字为参数,显示其中的最大值和最小值。(精)
两个数字比较:
if [ $# -ne 2 ];then
echo -e “\033[1;31m input two number at least!!! \033[0m”
elif [[
1
=
[
0
−
9
]
+
1 =~ ^[0-9]+
1= [0−9]+ ]] && [[
2
=
[
0
−
9
]
+
2 =~ ^[0-9]+
2= [0−9]+ ]];then
if [ $1 -lt $2 ];then
echo “the largest number is $2:$2 ,the less number is $1:$1”
elif [ $1 -gt $2 ];then
echo “the largest number is $1:$1 ,the less number is $2:$2”
else
echo "two number is queal"a
fi
else
echo -e “\033[1,31m please input number!!!\33[0m”
fi
大于两个数字以上:
#!/bin/bash
declare -i max min
declare -a nums
sum=KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲ nums=(@)
for((i=0;i<=$sum;i++));do
[ KaTeX parse error: Expected 'EOF', got '&' at position 11: i -eq 0 ] &̲& max={nums[0]} && min=${nums[0]} && continue
[ KaTeX parse error: Expected '}', got 'EOF' at end of input: {nums[i]} -gt KaTeX parse error: Expected 'EOF', got '&' at position 7: max ] &̲& max={nums[$i]} && continue
[ KaTeX parse error: Expected '}', got 'EOF' at end of input: {num[i]} -lt KaTeX parse error: Expected 'EOF', got '&' at position 7: min ] &̲& min={nums[$i]}
done
echo "all the parameter are : $@ "
echo “the max parameter is : $max”
echo “the min parameter is : $min”
## 24.编写函数,实现os的版本判断
注意:此处写成case模式更为繁琐,是为了实现更高级架构而设计成此
version=cat /etc/redhat-release | grep -o '[[:digit:]]' |head -c1
case
v
e
r
s
i
o
n
i
n
4
)
e
c
h
o
"
t
h
e
v
e
r
s
i
o
n
i
s
:
C
e
n
t
O
S
{version} in 4) echo "the version is :CentOS
versionin4)echo"theversionis:CentOS{version}"
;;
5)
echo “the version is :CentOS
v
e
r
s
i
o
n
"
;
;
6
)
e
c
h
o
"
t
h
e
v
e
r
s
i
o
n
i
s
:
C
e
n
t
O
S
{version}" ;; 6) echo "the version is :CentOS
version";;6)echo"theversionis:CentOS{version}”
;;
7)
echo “the version is :CentOS
v
e
r
s
i
o
n
"
;
;
8
)
e
c
h
o
"
t
h
e
v
e
r
s
i
o
n
i
s
:
C
e
n
t
O
S
{version}" ;; 8) echo "the version is :CentOS
version";;8)echo"theversionis:CentOS{version}”
esac
## 25.编写函数,实现取出当前系统eth0的IP地址
#ifconfig eth0 |sed -nr ‘2s/[^0-9]+([0-9.]+).*/\1/p’
#ifconfig eth0 |head -n2 |tail -n1 |tr -s ’ ’ |cut -d ’ ’ -f3
eth0(){
ifconfig eth0 |grep -w ‘inet’ |tr -s ’ ’ |cut -d ’ ’ -f3
}
eth0
## 26.编写函实现打印绿色ok和红色failed
okorfailed(){
if [ $? = 0 ];then
echo -e “\033[32m [ OK ]\033[0m”
else
echo -e “\033[1;31m [ Failed ] \033[0m”
fi
}
okorfailed
方法二:调用/etc/init.d/functions
#!/bin/bash
. /etc/init.d/functions
function ok(){
echo_success
}
function failure(){
echo_failure
}
## 27.编写函数,实现判断是否无未知参数,如无参数,提示错误
function arg (){
if [ $# -eq 0 ];then
echo “please input a arg!”
else
echo “total $# arg”
fi
}
arg 1 2 3 4
~
## 28.编写函数,实现两个数字作为参数返回最大值
#!/bin/bash
declare -i max min
declare -a nums
nums=(KaTeX parse error: Undefined control sequence: \* at position 1: \̲*̲) for((i=0;i<=#;i++));do
[ KaTeX parse error: Expected 'EOF', got '&' at position 11: i -eq 0 ] &̲& max={nums[0]} && min=${nums[0]} && continue
[ KaTeX parse error: Expected '}', got 'EOF' at end of input: {nums[i]} -gt KaTeX parse error: Expected 'EOF', got '&' at position 7: max ] &̲& max={sums[$i]} && continue
[ KaTeX parse error: Expected '}', got 'EOF' at end of input: {nums[i]} -lt KaTeX parse error: Expected 'EOF', got '&' at position 7: min ] &̲& min={nums[$i]}
done
echo “the max parameter is $max”
## 29.编写脚本/root/bin/testsrv.sh完成如下要求
(1)脚本可接受参数:start,stop,restart,status
(2)如果参数非此四者之一,提示使用格式后报错退出
(3)如是start:则创建/var/lock/subsys/SCRIPT\_NAME,并显示启动成功
(4)如果是stop:则删除/var/lock/subsys/SCRIPT\_NAME,并显示“停止完成”考虑:如果事先已经停止过了,该如何处理?
(5)如果是restart,则先stop,再start,考虑:如果本来没有start,如何处理?
(6)如果是status,则如果/var/lock/subsys/SCRIPT\_NAME文件存在,则显示“SCRIPT\_NAME is running …”,如果是/var/locksubsys/SCRIPT\_NAME文件不存在,则线回收“SCRIPT\_NAME is stopped…”
(7)在所有模式下禁止启动该服务,可用chkconfig和service
命令管理
说明:SCRIPT\_NAME为当前脚本
#!/bin/bash
name=$0
dir=/var/lock/subsys/
function judge(){
if [[ ! $arg =~ “start”|“stop”|“restart”|“status” ]];then
echo “please in put start、stop、restart、status”
fi
exit
}
function start1(){
mkdir -p ${dir}
touch
d
i
r
{dir}
dir{name}
echo “launch successful!”
}
function stop1(){
if [ -e
d
i
r
{dir}
dir{name} ];then
rm -rf
d
i
r
{dir}
dir{name}
echo “stop success!”
else
echo “already stop!”
fi
}
function restart1(){
if [ ! -e
d
i
r
{dir}
dir{name} ];then
stop1
start1
fi
}
function status1(){
if [ -e
d
i
r
{dir}
dir{name} ];then
echo “
d
i
r
{dir}
dir{name} is running!”
else
echo “
d
i
r
{dir}
dir{name} is stopped…”
fi
}
cat<<EOF
input the parameter:
start)
stop)
restart)
status)
EOF
read -p “please input :” arg
judge
case arg in
start)
start1
;;
stop)
stop1
;;
restart)
restart1
;;
status)
status1
;;
*)
echo “please input the right parameter!”
exit 1
esac
## 30.编写脚本/root/bin/copycmd.sh
(1)提示用户输入一个可执行命令名称
(2)获取此命令所依赖的所有库文件列表
(3)复制命令至某目标目录(例如/mnt/sysroot)下的对应路径下
如: /bin/bash==>/mnt/sysroot/bash
/usr/bin/passwd==>/mnt/sysroot/usr/bin/passwd
(4)复制此命令依赖的所有库文件至目标目录下的对应路径下,:如/lib64/ld-linux-x86-64.so.2==>/mnt/sysroot/lib64/ld-linux-x86-64.so.2
(5)每次复制完成一个命令后,不要退出,而是提示用户键入新的要复制的命令,并重复完后才能上述功能;知道用户输入quit退出。
知识点:
1.读取用户输入read命令,-p参数加上提示语句
2.获取命令所在文件所依赖的库列表,ldd (后面跟命令文件位置)
3.which +cmd 可以查出命令文件所在的位置。但是如果命令有别名,也会显示命令alias,可以加参数 --skip-alias 跳过别命名输出。
## 31.利用sshpass实现批量key验证
PASS=abc123
NET=10.0.0.
rpm -q sshpass &> /dev/null || yum -y install sshpass &> /dev/null
ssh-keygen -P “” -f /root/.ssh/id_rsa
for i in {3…254};do
{
sshpass -p ${PASS} ssh-copy-id -i /root/.ssh/id_rsa
N
E
T
{NET}
NET{i} -o StrictHostKeyChecking=no &> /dev/null
}&
done
wait
###########################################################
NET=10.0.0.
rpm -q sshpass &> /dev/null || yum -y install sshpass &> /dev/null
ssh-keygen -P “” -f /root/.ssh/id_rsa
for i in {3…254};do
sshpass -f /data/passwd.txt ssh-copy-id -i /root/.ssh/id_rsa
N
E
T
{NET}
NET{i} -o StrictHostKeyChecking=no &> /de
v/null
done
wait
########################################################
rpm -q sshpass &> /dev/null || yum -y install sshpass &> /dev/null
while read ip pass ;do
sshpass -p ${pass} ssh-copy-id -i /root/.ssh/id_rsa ${IP} -O StrictHostKeyChecking=no &>/dev/null
done</data/account.txt
wait
###
##
为了做好运维面试路上的助攻手,特整理了上百道 **【运维技术栈面试题集锦】** ,让你面试不慌心不跳,高薪offer怀里抱!
这次整理的面试题,**小到shell、MySQL,大到K8s等云原生技术栈,不仅适合运维新人入行面试需要,还适用于想提升进阶跳槽加薪的运维朋友。**
![](https://img-blog.csdnimg.cn/img_convert/e9eddf184eeaf41f0553f8791c684dbf.png)
本份面试集锦涵盖了
* **174 道运维工程师面试题**
* **128道k8s面试题**
* **108道shell脚本面试题**
* **200道Linux面试题**
* **51道docker面试题**
* **35道Jenkis面试题**
* **78道MongoDB面试题**
* **17道ansible面试题**
* **60道dubbo面试题**
* **53道kafka面试**
* **18道mysql面试题**
* **40道nginx面试题**
* **77道redis面试题**
* **28道zookeeper**
**总计 1000+ 道面试题, 内容 又全含金量又高**
* **174道运维工程师面试题**
> 1、什么是运维?
> 2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?
> 3、现在给你三百台服务器,你怎么对他们进行管理?
> 4、简述raid0 raid1raid5二种工作模式的工作原理及特点
> 5、LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?
> 6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?
> 7、Tomcat和Resin有什么区别,工作中你怎么选择?
> 8、什么是中间件?什么是jdk?
> 9、讲述一下Tomcat8005、8009、8080三个端口的含义?
> 10、什么叫CDN?
> 11、什么叫网站灰度发布?
> 12、简述DNS进行域名解析的过程?
> 13、RabbitMQ是什么东西?
> 14、讲一下Keepalived的工作原理?
> 15、讲述一下LVS三种模式的工作过程?
> 16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?
> 17、如何重置mysql root密码?
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618542503)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
高**
* **174道运维工程师面试题**
> 1、什么是运维?
> 2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?
> 3、现在给你三百台服务器,你怎么对他们进行管理?
> 4、简述raid0 raid1raid5二种工作模式的工作原理及特点
> 5、LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?
> 6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?
> 7、Tomcat和Resin有什么区别,工作中你怎么选择?
> 8、什么是中间件?什么是jdk?
> 9、讲述一下Tomcat8005、8009、8080三个端口的含义?
> 10、什么叫CDN?
> 11、什么叫网站灰度发布?
> 12、简述DNS进行域名解析的过程?
> 13、RabbitMQ是什么东西?
> 14、讲一下Keepalived的工作原理?
> 15、讲述一下LVS三种模式的工作过程?
> 16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?
> 17、如何重置mysql root密码?
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618542503)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**