2024年运维最全运维面试题(每日一题)_自动化运维面试问题(1),2024年最新技术实现

为了做好运维面试路上的助攻手,特整理了上百道 【运维技术栈面试题集锦】 ,让你面试不慌心不跳,高薪offer怀里抱!

这次整理的面试题,小到shell、MySQL,大到K8s等云原生技术栈,不仅适合运维新人入行面试需要,还适用于想提升进阶跳槽加薪的运维朋友。

本份面试集锦涵盖了

  • 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密码?

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以点击这里获取!

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

6、使用命令调换 /etc/passwd 文件里所有的第一列和最后一列位置

例:默认:root:x:0:0:root:/root:/bin/bash
修改后:/bin/bash:x:0:0:root:/root:root
awk -F ":" '{a=$1;$1=$NF;$NF=a;print}' /etc/passwd | tr " " ":"
print默认是print $0   。  tr 把分隔符替换成冒号

7、统计/var/log/下所有文件个数

题目解析:
1、/var/log/下所有文件包括当前目录和子目录以及子目录的子目录下面的文件
2、linux下文件有很多类型,包括 普通文件、链接文件、字符设备文件、块设备文件、socket文件等

find /var/log/ ! -type d | wc -l
74

tree /var/log/ | awk 'END{print $3}'
74

第七周

1、题目:批量添加20个用户,用户名为user1~20,密码为5个随机字符(要求不能使用shell循环语句)

echo user{1..20}|xargs -n1|sed -r 's#(.\*)#useradd \1 \&\& echo \1 >>/tmp/passwd.txt \&\& echo $RANDOM |md5sum |cut -c 1-5>>/tmp/passwd.txt \&\& echo `tail -1 /tmp/passwd.txt`|passwd --stdin \1#g'|bash

2、如何过滤出已知当前目录下home中的所有一级目录(提示:不包含home目录下面目录的子目录及隐藏目录,即只能是一级目录)?

方法1:通过find直接查找指定类型的文件
find ./home -type d -maxdepth 1

方法2:ls -l结果中以d开头的就是目录
ls -l ./home | grep "^d"

ls -S 以文件的大小进行排序
ls -R 将目录下所有的子目录的文件都列出来
ls -t 按时间进行文件的排序。    最快速度查看到最近更新
ls -r 文件名反向逆序,大到小。   直接 ls -l看的话是小到大 数字 A-Z

方法3:awk过滤以d开头
ls -l ./home | awk '/^d'

3、只能保留最近 7 天的访问日志

find /application/logs/ -type f -mtime +7 -name "\*.log"|xargs rm –f  
##也可以使用-exec rm -f {} \;进行删除

4、打印行号及内容

cat -n nginx.conf
grep -n . 1.sh

5、系统运行级别

0 关机
1 单用户
2 多用户,没有nfs支持
3 完全多用户,
4 保留
5 X Windows
6 重启

6、如何优化Linux系统

1、不用root,添加普通用户,通过sudo授权管理
2、更改默认的远程连接SSH服务端口及禁止root用户远程连接
3、定时自动更新服务器时间
4、配置国内yum源
5、关闭selinux及iptables(iptables工作场景如果有外网IP一定要打开,高并发除外)
6、调整文件描述符的数量
7、精简开机启动服务(crond rsyslog network sshd) chkconfig --list
8、内核参数优化(/etc/sysctl.conf)
9、更改字符集,支持中文,但建议还是用英文字符集,防止乱码 echo $LANG
10、锁定关键系统文件 chattr +i i表示不得任意更动文件或目录
11、清空/etc/issue,去除系统及内核版本登录前的屏幕显示

7、解压压缩

-P或–absolute-names 文件名使用绝对名称,不移除文件名称前的"/"号。
-c是打包,-x是解包
-z,-j是压缩和解压缩

a.请用 tar 打包/etc 整个目录(打包及压缩)
打包及压缩:tar zcvf etc.tar /etc
b.请用 tar 打包/etc 整个目录(打包及压缩,但需要排除/etc/services 文件)
打包及压缩:tar zcvf etc.tar.gz /etc --exclude=/etc/services
c.请把 a 点命令的压缩包,解压到/tmp 指定目录下
解压:tar zxvf etc.tar.gz -C /opt/

第八周

1、过滤字符串 I am kolor, myqq is 3302 ,过滤出kolor和3302

无逗号  I am kolor myqq is 3302
awk '{print $3" "$6}' 1.txt
cut -d" " -f3,6 1.txt
cut -c 6-11,20-  1.txt

有逗号  I am kolor, myqq is 3302
awk '{print $3" "$6}' 1.txt | sed s#,#""#

2、查看/etc/services 文件内容有多少行?

wc -l /etc/services
cat -n /etc/services | tail -1 | awk ‘{print $1}’
awk ‘{print NR}’ /etc/services|tail -1
grep -n $ /etc/services|tail -1

3、过滤出/etc/services 文件包含 3306 或 1521 两数据库端口的行的内容。

grep -E “3306|1521” /etc/services

4、描述 linux 系统从开机到登陆界面的启动过程

开机自检,MBR引导,加载grub菜单,在grub菜单里面加载kernel,启动init进程,init是Linux系统启动时第一个启动的进程,init读取inittab文件,先执行/etc/rc.d/rc.sysinit初始化脚本(设置主机名,加载inittab,设置网卡和一些PCI设备),根据inittab设置的级别指向相对应的脚本,如果是3模式则指向/etc/rc3.d下面的脚本以及程序,执行rc.local,最后启动mingetty进程,进入登陆界面。

5、如何取得/kolor 文件的权限对应的数字内容,如-rw-r–r– 为 644, 要求使用命令取得644 这样的数字。

stat kolor | sed -n ‘4p’ | awk ‘{print $2}’ | tr -cd “[0-9]”
stat kolor | awk -F “[(/]” ‘NR==4 {print $2}’
stat -c %a kolor 查看文件属性权限 -c 表示格式化

6、显示指定行内容

第二行

sed -n '2p' file.test 
awk 'NR==2 {print $0}' file.test 

第三行至第五行内容

sed -n '3,5p' file.test 
awk '{if(NR>2&&NR<6) print $0}' file.test 

显示奇数行与偶数行
sed

[root@test1 test]# sed -n '1~2p' file.test 
1
3
5
7
9
[root@test1 test]# sed -n '2~2p' file.test 
2
4
6
8
10
[root@test1 test]# sed -n 'p;n' file.test 
1
3
5
7
9
[root@test1 test]# sed -n 'n;p' file.test 
2
4
6
8
10

awk

[root@test1 test]# awk 'NR%2==1' file.test 
1
3
5
7
9
[root@test1 test]# awk 'NR%2==0' file.test 
2
4
6
8
10
[root@test1 test]# awk '{if(NR%2==1) print $0}' file.test 
1
3
5
7
[root@test1 test]# awk '{if(NR%2==0) print $0}' file.test 
2
4
6
8
10

显示匹配到的行

[root@test1 test]# sed -n '/5/p' file.test 
5 line 5
[root@test1 test]# awk '/5/' file.test 
5 line 5
[root@test1 test]# grep 5 file.test 
5 line 5

7、查找当前目录下所有文件,并把文件中的 www.baidu.com 字符串替换成 www.abc.cc

find ./ -type f|xargs sed -i 's#www\.baidu\.com#www\.abc\.cc#g'

第九周

1、sudo su 和 su

sudo su - 该命令是通过sudo权限进行角色转换(默认是切换到root),输入的是指向命令当时账号的密码,而非root密码。 当前用户暂时申请root权限,sudo是用户申请管理员权限执行一个操作,而此处的操作就是变成管理员。
su - 该命令是真正用户切换命令(默认是切换到root),输入的是root的密码

2、如何把文件中的空行过滤掉

方法一:简单粗暴

grep -v "^$" test.txt
sed '/^$/d' test.txt 
awk /[^^$]/ test.txt
awk '!/^$/' test.txt

注:
^$表示空行。
Grep -v 表示排除。
Sed //d 表示删除
Awk !// 表示排除或取反。

方法2:考虑到可能有空格方法

grep -v "^[ ]\*$" test.txt
sed  '/^[ ]\*$/d' test.txt
awk '!/^[ ]\*$/' test.txt
说明:
[ ]*表示连续出现0个或多个空格,表示0个的时候就相当于是^$即空行。

方法3:考虑到可能有空格或tab键

sed '/^[ \t]\*$/d' kolor.txt
awk '!/^[ \t]\*$/' kolor.txt
说明:
Grep命令默认不支持\t表示tab键。
这里面我们用sed和awk方法即可。

3、查看命令路径

whereis -b ifconfig
whcih ifconfig

4、查看哪些用户在线的linux命令

w
who

5、关机重启注销

关机

# shutdown -h now --->立刻关机(生产常用)
# shutdown -h +1 --->1分钟后关机
# init 0
# halt
# poweroff

重启

# reboot 
# shutdown -r now
# shutdown -r +1

注销

# logout

6、分时日月周crontab

每天晚上12点
0 0 * * *

每天的23点整
0 23 * * *

每隔两小时 * */2 * * *

7、下列路径的内容

/etc/sysctl.conf —–>内核调优的文件
/etc/rc.local —–>开机自启动命令的文件
/etc/hosts —–>本机的域名解析文件
/etc/fstab —–>开机设备自动挂载的文件
/var/log/secure —–>系统登陆的安全日志

第十周

1、如何查看用户的 uid 及属于的组信息。

[root@aliyun ~]# id kolor
uid=1010(kolor) gid=1010(kolor) groups=1010(kolor)

2、添加一个用户kolor,并指定属于 sa 组,要求组 ID 为 801, uid 为 808,并且不建立家目录及禁止其登陆。

# groupadd sa -g 801
# useradd kolor -g sa -s /sbin/nologin -M
# id kolor
uid=1010(kolor) gid=1010(kolor) groups=1010(kolor)

3、mysql主从原理?主从不同步怎么办?主从慢,差的多咋办?

①mysql主从原理:
从库生成两个线程,一个I/O线程,一个SQL线程;
i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中;
主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog;
SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致;

②主从不同怎么办
先上Master库:
mysql>show processlist; 查看下进程是否Sleep太多。发现很正常。
show master status; 也正常。
mysql> show master status;
再到Slave上查看
mysql> show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: No

可见是Slave不同步
下面介绍两种解决方法:
方法一:忽略错误后,继续同步
该方法适用于主从库数据相差不大,或者要求数据可以不完全统一的情况,数据要求不严格的情况
解决:
stop slave;
#表示跳过一步错误,后面的数字可变
set global sql_slave_skip_counter =1; ❤

方式二:重新做主从,完全同步
1.先进入主库,进行锁表,防止数据写入
使用命令:
mysql> flush tables with read lock; ❤
注意:该处是锁定为只读状态,语句不区分大小写
2.进行数据备份
#把数据备份到mysql.bak.sql文件
[root@server01 mysql]#mysqldump -uroot -p -hlocalhost > mysql.bak.sql
这里注意一点:数据库备份一定要定期进行,可以用shell脚本或者python脚本,都比较方便,确保数据万无一失
4.把mysql备份文件传到从库机器,进行数据恢复
#使用scp命令
[root@server01 mysql]# scp mysql.bak.sql root@192.168.128.101:/tmp/
5.停止从库的状态
mysql> stop slave;
6.然后到从库执行mysql命令,导入数据备份
mysql> source /tmp/mysql.bak.sql
7.设置从库同步,注意该处的同步点,就是主库show master status信息里的| File| Position两项
change master to master_host = ‘192.168.128.100’, master_user = ‘rsync’, master_port=3306, master_password=’’, master_log_file = ‘mysqld-bin.000001’, master_log_pos=3260;
8.重新开启从同步
mysql> start slave;
9.查看同步状态
mysql> show slave status\G 查看:

③主从慢,差的多咋办
1.从库硬件比主库差,导致复制延迟
2.主从复制单线程,如果主库写并发太大,来不及传送到从库,就会导致延迟。更高版本的mysql可以支持多线程复制
3.慢SQL语句过多
4.网络延迟
5.master负载
主库读写压力大,导致复制延迟,架构的前端要加buffer及缓存层
6.slave负载
一般的做法是,使用多台slave来分摊读请求,再从这些slave中取一台专用的服务器,只作为备份用,不进行其他任何操作
另外,2个可以减少延迟的参数:
–slave-net-timeout=seconds 单位为秒。默认设置为 3600秒
#参数含义:当slave从主数据库读取log数据失败后,等待多久重新建立连接并获取数据
–master-connect-retry=seconds 单位为秒。 默认设置为 60秒
#参数含义:当重新建立主从连接时,如果连接建立失败,间隔多久后重试。

4、mount永久挂载

vi /etc/fstab
UUID=904C23B64C23964E /media/aborn/data ntfs defaults 0 2
其中第一列为UUID, 第二列为挂载目录(该目录必须为空目录,必须存在),第三列为文件系统类型,第四列为参数,第五列0表示不备份,最后一列必须为2或0(除非引导分区为1)

5、打印一个目录下所有包含字符串A的行

grep -rn "A" ./
-n 行号
-r 目录递归
或
find ./ -name "\*.\*" | xargs grep "A"

6、iptables

iptables有4表5链:
filter表——过滤数据包
Nat表——用于网络地址转换(IP、端口)
Mangle表——修改数据包的服务类型、TTL、并且可以配置路由实现QOS
Raw表——决定数据包是否被状态跟踪机制处理

INPUT链——进来的数据包应用此规则链中的策略
OUTPUT链——外出的数据包应用此规则链中的策略
FORWARD链——转发数据包时应用此规则链中的策略
PREROUTING链——对数据包作路由选择前应用此链中的规则(所有的数据包进来的时侯都先由这个链处理)
POSTROUTING链——对数据包作路由选择后应用此链中的规则(所有的数据包出来的时侯都先由这个链处理)

★7、页面无法访问排查思路

场景一:无错误状态码
若是云服务器可能存在账号处于欠费状态
WEB服务没有启动
端口没有正常监听
防火墙或者防火墙策略限制
排查思路说明:
·使用命令telnet IP Port 进行测试

场景二:网站访问异常代码4XX。
排查思路:
通过查看其配置文件,并检测其配置文件语法,发现语法正常;
通过命令行查看其web服务端口运行正常,没有进程僵尸状况;
具体读配置文件,然后再查找客户客户配置文件所指定的具体目录
·404报错的具体原因是访问的路径url目录在服务上没有找到,如果直接使用ip或者域名访问,那么实际访问的页面是站点根目录下的默认文件(配置文件中index后指定的文件),如果服务器上站点根目录上没有这个文件,则会出现404错误。

第十一周

1.sed用法+1

cat /tmp/passwd
koloredu.com
123456789
kolor
oldgirl

1)删除文件每行的第二个字符
方法一:

[root@kolorEdu tmp]# sed 's#.##2' passwd
odboyedu.com
13456789
odboy
odgirl

方法二:

[root@kolorEdu tmp]# sed -r 's#(.).(.\*)#\1\2#g' passwd
odboyedu.com
13456789
odboy
odgirl

2)把所有小写字母用括号()括起来

[root@kolorEdu tmp]# sed 's#[a-z1-9]#(&)#g' passwd
(o)(l)(d)(b)(o)(y)(e)(d)(u).(c)(o)(m)
(1)(2)(3)(4)(5)(6)(7)(8)(9)
(o)(l)(d)(b)(o)(y)
(o)(l)(d)(g)(i)(r)(l)

字符(&)的用法

"s/^AA.\*/&XX" : 把所有以AA开头的行,在行尾假设XX,其中的字符(&)表示所有以AA开头的字符串。

满足匹配的字符串文本内容
$ echo "AABB" | sed "s/AA/AAXX/g" 
AAXXBB
$ echo "AABB" | sed "s/AA/&XX/g"
AAXXBB

例子3. 给所有的连续字符A加后缀XX
这个怎么写呢,如果不用字符(&)好像不方便,因为不确定有多少个A字符。
$ echo "AAABB" | sed "s/A\+/XX/g"
XXBB  这样是不正确的

使用字符(&)
$ echo "AAABB" | sed "s/A\+/&XX/g"  
AAAXXBB

2.取出/tmp目录下面的10个文件的第一行

在目录/tmp下找到10个以abc开头的文件,然后把这些文件的第一行内容保存到文件new中

cat /server/scripts/find.sh
#!/bin/sh
for filename in `find /tmp -type f -name "abc*"|head -n 10`
do
sed -n '1p' $filename>>new
done

3.通过Iptables来限定apache每秒钟连接数为1,峰值为3

iptables -A INPUT -d 172.16.100.1 -p tcp --dport -m limit --limit 1/second --limit-burst 3 -j ACCEPT

4.假设Apache 产生的日志文件名为access_log,在apache 正在运行时,执行命令mv access_log access_log.bak,执行完后,请问新的apache 的日志会打印到哪里,为什么?

新的日志会打印在access_log.bak 中,因为apache 启动时会找access_log 文件,随时准备向文件中加入日志信息,虽然此时文件被改名,但是由于服务正在运行,因为它的inode 节点的位置没有变,程序打开的fd 仍然会指向原来那个inode,不会因为文件名的改变而改变。apache 会继续向已改名的文件中追加日志,但是若重启apache 服务,系统会检查access_log文件件是否存在,若不存在则创建。

5.实现172.16.1.0/24段所有主机通过124.32.54.26外网IP共享上网

方法一:echo 1 > /proc/sys/net/ipv4/ip_forward

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 124.32.54.26

方法二:在内核参数文件/etc/sysctl.conf中增加如下内容net.ipv4.ip_forward = 1,然后执行:sysctl -p

如果不是固定的124.32.54.26怎么办?

解答:我们都知道当我们使用联通或者电信上网的时候,一般它都会在每次你开机的时候随机生成一个外网的IP,意思就是外网地址是动态变换的。这时我们就要将外网地址换成
MASQUERADE(动态伪装):它可以实现自动寻找到外网地址,而自动将其改为正确的外网地址。

iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j MASQUERADE

第十二周

1.优化shell脚本

#!/bin/bash
grep kolor /etc/passwd &>/dev/null
REVAL=$?
if [ $REVAL -eq 0 ]
then 
    echo "kolor user already exists"
else
    useradd kolor
fi

参考答案一:

#!/bin/bash
if grep -q kolor /etc/passwd
then 
    echo "kolor user already exists"
else
    useradd kolor
fi

加-q选项,执行结果是:如果找到了,会返回0,否则,返回1。

参考答案二:

[ `grep kolor /etc/passwd|wc -l` -eq 1 ]&& echo ok ||echo no

2.如何让linux也像windows那样有一个回收站,避免数据的误删除,进而恢复误删数据?

-i:默认选项,当目标文件存在时,提示是否覆盖
$@表示所有参数
$#表示所有参数的个数
把下面这些代码放到一个tr.sh脚本,然后在 .bashrc下添加 source /root/tr.sh (每一次更改都要重新执行.bashrc)

直接 cat >> .bashrc <<EOF

#!/bin/bash
mkdir -p ~/.trash           #创建一个目录作为回收站,这里使用的是用户家目录下的.trash目录
cat >> .bashrc
alias rm=trash             #命令别名 rm改变为trash,通过将rm命令别名值trash来实现把rm改造成删除文件至回收站
alias r=trash
alias rl='ls ~/.trash'   # rl命令显示回收站中的文件
alias ur=undelfile         # ur命令找回回收站中的文件
alias cl=cleartrash		# cl命令清空回收站中的文件

说明:这个函数的作用是找回回收站下的文件
undelfile(){
    mv -i ~/.trash/\$@  ./
}

-i:默认选项,当目标文件存在时,提示是否覆盖

说明:这个函数是将指定的文件移动到指定的目录下,通过将rm命令别名值trash来实现把rm改造成删除文件至回收站
trash(){
   mv $@   ~/.trash/
}

说明:这个函数的作用是清空回收站目录下的所有文件
cleartrash(){
   read -p "clear sure?[n]" confirm
   [ $confirm == 'y' ] || [ $confirm == 'Y' ] && /bin/rm -rf ~/.trash/*
}

这段代码定义了三个函数trash、undelfile和cleartrash。
trash的作用是移动文件到指定的回收站目录;
undelfile的作用是找回回收站目录中的指定文件;
cleartrash的作用是清空回收站目录。
经rm命令别名为trash来实现rm命令的改造!

trash目录作为回收站,将其它代码加入用户家目录下的.bashrc文件下,这样用户每次登录这段代码就会自动生效!
登录后在bash下执行一遍下面的命令就可以把rm命令改造成删除文件到回收站了!

最终脚本,直接执行通过EOF就会写到.bashrc,注意这种直接写的话要$转义。通过路径调用脚本就不用

mkdir -p ~/.trash
cat >> .bashrc <<EOF
alias rm=trash
alias rl='ls ~/.trash'
alias ur=undelfile
alias cl=cleartrash

undelfile()
{
 mv -i ~/.trash/\$@ ./
}

trash()
{
 mv \$@ ~/.trash/
}

cleartrash(){
 read -p "clear sure?" confirm
 [ \$confirm == 'y' ] || [ \$confirm == 'Y' ] && /bin/rm -rf ~/.trash/\*
}
EOF

在这里插入图片描述

3.基础娱乐命令:像幻灯片一样播放每个字符

如何实现执行一个命令,让文字字符,采用输入回放的效果,逐一显示在屏幕上

echo "Kolor,网工,运维" | pv -qL 20 
#没有这个命令 yum 安装即可 
yum install pv -y #需要使用epel源

4.批量重命名,文件批量重命名为 00.jpg ……10.jpg

# touch {00..10}.html
# ls
00.html  01.html  02.html  03.html  04.html  05.html  06.html  07.html  08.html  09.html  10.html

方法一:rename命令

rename .html .jpg  *.html

方法二:shell

for name in `ls \*.html`;do mv $name ${name%.html}.jpg;done
${file%.\*}:    删掉最后一个  .  及其右边的字符串

在这里插入图片描述
方法三:shell

for n in {00..10};do mv $n.html $n.jpg ;done 

5./etc/profile /etc/bashrc .bashrc .bash_profile的区别

全局环境变量 ↓
/etc/profile 主要用是系统的环境变量,同时我们也放些别名
/etc/bashrc 主要用来存放系统的别名和自己定义的函数(都可以放到 /etc/profile中)

只针对当前登陆的用户生效 ↓
.bashrc 是用户自己定义的别名
.bash_profile 是用户自己定义的环境变量

先读取/etc/profile文件,然后读取用户自己的.bash_profile然后读取.bashrc的内容最后读取/etc/bashrc这个文件。
这是这几个文件在用户登录的时候的运行的顺序。
/etc/profile ——》 .bash_profile ——》 .bashrc ——》 /etc/bashrc

6.如何修改主机名

临时修改:hostname test
永久修改:
方法一:vim /etc/sysconfig/network

# Created by anaconda
NETWORKING=yes
HOSTNAME=test
GATEWAY=192.168.1.137

让主机名能解析 (ping 主机名可以畅通)
ip地址 主机名 放入到/etc/hosts
10.0.0.200 test

方法二:还有一种存在vim /etc/hostname

test

第十三周

1.命令风暴:打印出001 002 003 这样的格式的数字

方法1:{}生成序列

[root@shell ~]# echo 00{1..3}
001 
002 
003

方法2:seq法

[root@shell ~]# seq -w 100
001
002
003
004
005
006
007
…………
[root@shell ~]# seq -w 100 |sed -n '1,3p'
001
002
003
————
[root@shell ~]# seq -w 101 103|sed -e 's/^1/0/g'
001
002
003
[root@shell ~]# seq -f %03g 3
001
002
003

-f, --format=格式 使用printf 样式的浮点格式 
%3g那么数字位数不足部分是空格。
"%03g" 数字位数不足部分是0,%前面制定字符串。

-s, --separator=字符串 使用指定字符串分隔数字(默认使用:\n) 
[root@Gin scripts]# seq -s '=' 1 5
1=2=3=4=5

方法3:for循环

[root@shell ~]# for ((i=1;i<=3;i=i+1));do echo 00$i;done
001
002
003
[root@shell ~]# for ((i=1;i<=3;i=i+1));do printf "%03d\n" $i;done
001
002
003

方法4:sed命令中&命令用法,增加或修改一个字符串。

[root@shell ~]# seq 3|sed 's/^[0-9]/00&/g'
001
002
003

方法5:sed命令中()和\1的用法。

[root@shell ~]# seq 3|sed 's/\(^[0-9]\)/00\1/g'
001
002
003

2.如何实现 Nginx 代理的节点访问日志记录客户的 IP 而不是代理的 IP?

使用proxy反向代理模块中的proxy_set_header参数
proxy_set_header X-Forwarded-For $remote_addr;

3.❤IDC 机房带宽突然从平时 100M 增加到 400M,请你分析问题所在并解决

该故障的影响:直接导致数百台服务器无法连接,该机房全部业务中断。
首先会反射为DDOS问题,结果解决时间加长了,如果能提前做好预案,恢复速度可能就会好很多

分析问题
1)IDC带宽被占满的原因很多,常见的有:

a.真实遭受DDOS攻击
b.内部服务器中毒,大量外发流量
c.网站元素(如图片)被盗连,在门户页面被推广导致大量流量产生
d.合作公司来抓数据,如:对合作单位提供了API数据接口
e.购买了CDN业务,CDN猛抓源站
f.其他原因

2)CDN带宽异常,源站没异常。
这类问题基本都是缓存在CDN的数据被频繁访问引起的。

3) CDN带宽异常,源站也异常。
可能原因如公司做推广,大量数据访问,热点数据cache里不全。或CDN问题导致数据回源(有关CDN回源率问题及提升回源率经验,以后再和大家分享)。影响就是带宽高,后端静态服务器及图片及存储压力大

解决问题
a.如何防止DDOS
①HTTP请求拦截

如果恶意请求有特征,对付起来很简单:直接拦截它就行了。
HTTP 请求的特征一般有两种:IP 地址和 User Agent 字段。比如,恶意请求都是从某个 IP 段发出的,那么把这个 IP 段封掉就行了。或者,它们的 User Agent 字段有特征(包含某个特定的词语),那就把带有这个词语的请求拦截。

拦截可以在三个层次做。
(1)专用硬件
Web 服务器的前面可以架设硬件防火墙,专门过滤请求。这种效果最好,但是价格也最贵。
(2)本机防火墙
操作系统都带有软件防火墙,Linux 服务器一般使用 iptables。比如,拦截 IP 地址1.2.3.4的请求,可以执行下面的命令。

$ iptables -A INPUT -s 1.2.3.4 -j DROP

(3)Web 服务器

Web 服务器也可以过滤请求。拦截 IP 地址1.2.3.4,nginx 的写法如下。

location / {
  deny 1.2.3.4;
}

Apache 的写法是在.htaccess文件里面,加上下面一段。

<RequireAll>
    Require all granted
    Require not ip 1.2.3.4
</RequireAll>

如果想要更精确的控制(比如自动识别并拦截那些频繁请求的 IP 地址),就要用到 WAF。

②带宽扩容
HTTP 拦截有一个前提,就是请求必须有特征。但是,真正的 DDOS 攻击是没有特征的,它的请求看上去跟正常请求一样,而且来自不同的 IP 地址,所以没法拦截。这就是为什么 DDOS 特别难防的原因。
带宽扩容
CDN 指的是网站的静态内容分发到多个服务器,用户就近访问,提高速度。因此,CDN 也是带宽扩容的一种方法,可以用来防御 DDOS 攻击。

网站内容存放在源服务器,CDN 上面是内容的缓存。用户只允许访问 CDN,如果内容不在 CDN 上,CDN 再向源服务器发出请求。这样的话,只要 CDN 够大,就可以抵御很大的攻击。不过,这种方法有一个前提,网站的大部分内容必须可以静态缓存。对于动态内容为主的网站(比如论坛),就要想别的办法,尽量减少用户对动态数据的请求。 Coudflare 是一个免费 CDN 服务,并提供防火墙。

b.如何防止盗链
方法1:判断引用地址(判断浏览器请求时HTTP头的Referer字段的值)
当你的网站程序接收到下载 jacky.mp3 资源请求的时候,先判断http的referer字段的值,如果在对方域名上请求该资源则认为不合法,如果是从 自己的域名(uushare.com)过来的,则可以认为是合法的连接请求,否则就返回一个错误的提示信息。
配置apache服务器。用于图片防盗链(使用url重写)

1.#LoadModule rewrite\_module modules/mod\_rewrite.so 
把#去掉,重启apache

2.在需要防盗的网站或者目录下,写 .htaccess 文件(windows下不能直接创建,可以另存)
并指定防盗链规则,分析referer信息,如果不是来自本站,则重写

重写规则 .htaccess 文件
1.哪种情况重写规则
是jpeg/gif/png图片的时候
是referer头与localhost不匹配的时候

2.如何重写
统一 rewrite 到某个防盗链图片上
RewriteEngine On
//只是在改页面下生效
Rewrite Base /HTTPxieyi/day1
//会对以下格式的文件进行重写规则
RewriteCond %{REQUEST_FILENAME} .*\.(jpg|jpeg|gif|png) [NC]
//如果不是来自localhost的用户,会重写
RewriteCond %{HTTP_REFERER} !localhost [NC]
//会重写到blog网的logo上	
RewriteRule .* http://www.blog/picture/1.png

方法2:使用登录验证
这个方法常见于论坛、社区。当访客请求网站上的一个资源时,先判断此请求是否通过登录验证(在asp.net里常用session或form验证来记录登录状态),如果尚未登录则返回一个错误提示信息。使用这个方法还可以进一步判断登录的用户的权限是否足够,以实现带“权限”的下载。
这种方法的另外一个缺点是访客无法匿名下载,所以这个方法一般只用于论坛和社区网站。

方法3:使用图形验证码
使用这个方法可以保证每次下载都是“人”在你的网站上下载,而不是下载工具。

4.发现文件系统只读了,是什么原因?如何解决?

目前已知造成硬盘分区只读的可能原因有:
文件系统错误
内核相关硬件驱动bug
磁盘坏道
HBA卡故障
RAID卡故障

解决方法:使用fsck命令检查文件系统错误
1.重启系统后看看是否可以自动恢复
2.使用fdisk修复
检查 msdos 档案系统的 /dev/hda5 是否正常,如果有异常便自动修复 :
fsck -t msdos -a /dev/hda5
3.卸载只读的分区,然后重新mount挂载
mount -o remount,rw /

5.binlog是什么?记录的什么?有几种工作模式及企业应用场景

binlog:是用于记录所有更新了数据的操作语句,语句以事件的形式保存,它描述数据的更改过程
作用:用于实时备份数据,数据库的主从复制
log_bin 打开记录binlog功能

binlog的查看

mysqlbinlog /home/mysql/binlog/binlog.000003

binlog的删除:可分为自动与手动删除
自动删除

能过binlog参数expire_logs_days来实现

show binary logs;
show variables like "expire\_logs\_days";
set gloable expire_logs_days=3;

手工删除

reset master 删除主的binlog
reset slave 删除从的中继日志

三种模式:
Row level模式 :
日志会记录每一行数据被修改的形式,然后在从端对相同的数据进行修改
优点:可以不记录执行SQL语句上下文相关的信息,只记录哪一条数据被修改,修改成什么样了
缺点:所有执行的语句都当记录到日志文件中,而且都会以每行记录的修改来记录,会产生大量的日志内容

statement模式:
每一条修改数据的SQL都会记录master的bin-log中,slave在复制的时候SQL进程会解析成和原来master端执行过的相同的SQL来执行
优点:解决了上row level模式的缺点,不需要记录每一行数据的变化,减少日志量,可以得高性能
缺点:由于记录的是执行语句,在此模式下会有主从无法复制的问题出现

mixed自动模式:
MYSQL会根据执行的每一条具体SQL语句来区分对待记录的日志格式,

企业使用场景:
1)如果不会用到mysql特殊的功能,基本都是默认的模式statement模式
2)如果会到mysql的一些特殊功能,基本都是会使用row level模式

第十四周

1.两个文件,把第一个文件中的第2、3行内容添加到第二个文件的第3行后面

[root@kolor ~]# cat 1.txt 
111
222
333
[root@kolor ~]# cat 2.txt 
AAA
bbb
ccc
ddd

修改后
[root@kolor ~]# cat 2.txt 
AAA
bbb
ccc
222
333
ddd

[root@kolor ~]# sed -i "3a$(sed -n '2,3p' 1.txt |xargs |sed 's# #\\n#g')" 2.txt 
[root@kolor ~]# cat 2.txt 
AAA
bbb
ccc 
222
333
ddd

xargs 会把 换行的变成 222 333
3a加进去,默认是按\n分割. 所以要替换空格为\n

2.脚本直接执行没有问题,在定时任务中有问题,什么原因?

就是没有找到ifconfig,与PATH环境变量有关,PATH环境变量在/etc/profile文件中设置,而定时任务却是以nologin方式调用脚本,不会加载/etc/profile,所以导致此脚本在定时任务中执行失败

方法1:在脚本中ifconfig 命令写全路径 /sbin/ifconfig
方法2:在脚本中加入 source /etc/profile

3.nfs客户端挂载信息写入/etc/fstab中,系统重启,没有自动挂载是什么原因?

客户端挂载:
mount -t nfs 10.0.0.101:/data /mnt
挂载信息写入 /etc/fstab 内容如下
10.0.0.101:/data /mnt nfs defaults 0 0

原因:分析一下linux启动过程就知道了,系统启动时,执行挂载操作的时候,网络服务还没有启动,而nfs挂 载需要网络服务
解决方法:
1、 系统启动时,同时启动netfs
chkconfig netfs on
2、 挂载命令写入
/etc/rc.local

4.Nginx需要优化哪些内容?

1.gzip压缩优化
2.expires缓存优化
3.网络IO事件模型优化
4.隐藏软件名称和版本号
5.防盗链优化
6.禁止恶意域名解析
7.禁止通过IP地址访问网站。
8.HTTP请求方法优化。
9.防DOS攻击单IP并发连接的控制,与连接速率控制。
10.严格设置Web站点目录的权限。
11.将Nginx进程以及站点运行于监牢模式(nginx服务降权启动(不能使用80端口,使用其他端口,例如8080)、站点目录设置普通用户)。
12.通过robot协议以及HTTP_USER_AGENT防爬虫优化
13.配置错误页面根据错误码指定网页反馈给用户
14.Nginx日志相关优化
访问日志切割轮询、不记录指定元素日志、最小化日志目录权限。
15.限制上传到资源目录的程序被访问,防止木马入侵系统破坏文件。
16.FastCGI参数buffer和cache以及超时等的优化。
17.php.ini和php-fpm.conf配置文件的优化。
18.有关Web服务的linux内核方面深度优化(网络连接、IO、内存等)。
19.Nginx加密传输优化(SSL)。
20.Web服务器磁盘挂载及网络文件系统优化。
21.使用Nginx cache。
22.nginx WAF(nginx+lua) 安全。

5.企业生产MySQL如何优化?

a:硬件的优化:
1、采用64位cpu,cpu至少4颗,L2缓存越大越好
2、内存要大,32-64G运行1-2个实例,96-128G运行3-4个实例
3、机械盘选用sas盘,转速15000以上,用可能的话使用ssd
4、raid卡使用raid10
5、网卡多块,千兆以上
6、数据库不要使用虚拟化,slave硬件要好于master

b:操作系统优化
1、操作系统选择x86_64位,尽量采用xfs文件系统
2、优化磁盘存储参数
3、优化内核参数
4、优化网络等

c:mysql构架优化
1、根据内存大小,配置服务器跑多实例
2、主从复制采用mixed模式,尽量不要跨机房同步,若要跨机房,尽量采用远程写,本地读
3、定期检查、修复主从复制的数据差异
4、业务拆分,搜索功能不使用MySQL数据库执行;某些高并发,安全性一般的业务使用nosql,如:memcache、 redis等
5、数据库前端加cache,如memcache,用于用户登录,商品查询
6、动态数据静态化,整个文件静态化,页面片段静态化
7、数据库集群读写分离,一主多从,通过dbproxy进行集群读写分离
8、单表超过800万,拆库拆表,如人工将(登录、商品、订单)拆表拆库
9、选择从库备份,并且对数据库进行分表分库备份

d:MySQL数据库层面优化
1、优化my.cnf参数
2、优化库表设计,包括字符集、字符串长度、创建短索引、多用复合索引;
3、SQL语句优化,减少慢语句数量;

e:数据库管理流程、制度优化
1、人的流程:开发—>核心运维/DBA
2、测试流程:内网 IDC测试线上执行
3、客户端管理,PHPMYADMIN

f:MySQL数据库安全优化
1、数据库禁止设置外网
2、数据库文件权限优化;
3、授权用户权限限制,尽量专库专用户
4、限制开发对生产库的操作权限
5、防止SQL语句注入

第十五周

1.显示/etc/inittab中以#开头,且后面跟了一个或多个空白字符,而后又跟了任意非空白字符的行

正则表达式中 \s代表一个空白字符(可能是空格、制表符、其他空白)
-P 可以让grep使用perl的正则表达式语法
方法一:grep/egrep

egrep "^#[[:blank:]]+[^[:blank:]]\*" /etc/inittab  
grep -P "^#[ \t]+[^ \t]\*" /etc/inittab  

grep -P "^#\s+\S+" /etc/inittab

方法二:sed

sed -n '/^#[[:blank:]]+[^[:blank:]]\*/p' /etc/inittab
sed -n '/^#[ \t]+[^ \t]\*/p' /etc/inittab  
sed -nr '/^#\s+\S+/p' /etc/inittab

方法三:awk

awk   '/^#[[:blank:]]+[^[:blank:]]\*/' /etc/inittab
awk   '/^#[ \t]+[^ \t]\*/' /etc/inittab  
awk   '/^#\s+\S+/' /etc/inittab

2.对输入的脚本文件进行语法检查;如果有错误,则提醒用户键入Q或者q无视错误并退出,其它任何键可以通过vim打开这个指定的脚本;

要求文件名以传参的方式进行传入,从标准输入中读取,文件名后缀是”.sh”

#!/bin/bash
#
read -p "Please input check script: " file
if [ -f $file ];then
    sh -x $file >/dev/null 2>&1
    if [ $? -ne 0 ];then
        read -p "You input script $file syntax error.[Type Q|q to exit or Type vim to edit]" answer
        case $answer in
        Q|q)
            exit 0
        ;;
        *)
            vim $file
        ;;
        esac
    fi
fi

3.根据要求写出itpables防火墙规则

iptables支持time时间控制用户行为,如有请写出具体操作步骤,限制在每个星期一的0点0分0秒到23点59分59秒这个时间段内,所有icmp协议报文的应答都会拒绝。

iptables -A INPUT -p ICMP --icmp-type 8 -m time --timestart 00:00:00 --timestop 23:59:59 --weekdays Mon -j DROP

icmp 8 是请求
icmp 0 是应答

4.显示出打印第二列为kolor行的第一列内内容

[root@kolorEdu kolor# cat ip.log
10.0.0.1 kolor
10.0.0.2 oldgirl
10.0.0.3 bingbing
10.0.0.4 tingting
10.0.0.4 kolor
打印第二列为kolor行的第一列内容

方法一:while循环

while read line
do
    name=`echo $line|awk '{print $2}'`    
    if [ "$name" = "kolor" ];then        
    echo $line|awk '{print $1}'    
    fi
done </kolor/ip.log

方法二:grep
[root@show kolor]# grep -Po “\S+\s(?=kolor)” ip.txt
10.0.0.1
10.0.0.4
[root@show kolor]# grep -Po “[0-9. ]+(?=kolor)” ip.txt
10.0.0.1
10.0.0.4
-o:只显示与正则表达式匹配的部分。
\s 表格,换行等空白区域
\S 非空白区域
() 将正则表达式的一部分括起来组成一个单元,可以对整个单元使用数量限定符
零宽断言

  • 零宽度正预测先行断言 (?=exp)匹配exp前面的位置
    例:\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I’m singing while you’re dancing.时,它会匹配sing和danc。

方法三:sed
?

sed -nr '/kolor/ s#(^[^ ]+).\*$#\1#gp' ip.sh

方法四:awk

awk '$2~/kolor/{print $1}' ip.sh
~是匹配的意思,找出包含kolor的
https://www.cnblogs.com/-beyond/p/9254007.html

5.权限拒绝 常见的permission denied 原因

  • 显示目录里面的内容 需要kolor用户对这个目录要有r和x的权限。
  • 删除一个文件需要kolor用户对这个文件的上一级目录 拥有w和x权限。
    因为文件名实际存放在目录的block中。所以kolor用户要删除/etc/passwd 实际上是删除/etc/目录block的信息。
  • 对于修改文件的内容,要看kolor用户对这个文件是否有r和w的权限。

第十六周

1.shell脚本知识点:不影响脚本运行的前提下,对脚本进行加密
方法一:shc
shc -r -f script-name 注意:要有-r选项, -f 后跟要加密的脚本名.
运行后会生成两个文件,script-name.x 和 script-name.x.c
script-name.x是加密后的可执行的二进制文件.
./script-name 即可运行.
script-name.x.c是生成script-name.x的原文件(c语言)

方法二:gzexe
2.shell脚本知识点:书写脚本完成ftp上传下载
FTP如果有些文件需要每天定时进行上传或下载,人为重复相同工作也是没有意义的
因此如何编写自动下载或上传FTP文件脚本?

ftpput.sh 上传文件到ftp脚本

#!/bin/sh        
#FileName:ftpput.sh 
#Function:从本地客户端向ftp服务器上传一个文件 
#Version:V0.1 
#Author: 
#Date:
# $#表示传递给此Shell脚本的参数个数 
# -ne表示不等于 
if [ $# -ne 2 ] 
then  
    echo "Usage $0 <local\_dir/filename> <remote\_dir>"  
    exit 1  
fi    
说明:如果传递的参数个数不等于2个,即提示传参报错信息

# IP表示ftp的服务器ip地址 
IP=127.0.0.1    
#IP=192.168.6.1 
 
# FULLNAME获取本地文件全路径名 
FULLNAME=$1  
 
# DESTDIR获取需要上传的ftp远程目录路径 
DESTDIR=$2 

# basename返回一个路径中的文件名部分 
# 如FULLNAME="/home/Sunrier/Proj/log/test.log"; 
# 当local\_filename=`basename $FULLNAME` 
# 最终local\_filename="test.log" 
local_filename=`basename $FULLNAME`  
 
# DESTFILE表示ftp服务器的路径,以及保存后的文件名 
DESTFILE=$DESTDIR/$local\_filename  

# 自动上传文件到ftp服务器,免交互方式
ftp -i -n <<FTPIT 
open $IP 
user Sunrier redhat 
bin 
passive 
cd /home/remote/log/ftpfile 
put $FULLNAME $DESTFILE 
quit 
FTPIT  
exit 0

ftpget.sh 下载文件到ftp客户端脚本

#FileName:ftpget.sh 
#Function:从ftp服务器上下载一个文件到本地计算机上 
#Version:V0.1 
#Author:
#Date:
     
# $#表示传递给此Shell脚本的参数个数 
# -ne表示不等于 
if [ $# -ne 2 ] 
then  
    echo "Usage $0 <remote\_dir/filename> <local\_dir>"  
    exit 1  
fi 

# IP表示ftp的服务器ip地址 
IP=127.0.0.1    
#IP=192.168.6.1 

# FULLNAME获取从ftp服务器上下载的文件全路径名 
FULLNAME=$1 

# DESTDIR获取从ftp服务器上下载的文件所存放的本地计算机的目录路径 
DESTDIR=$2  
 
# remote\_filename获取从ftp服务器上下载的文件名 
remote_filename=`basename $FULLNAME`  
 
# DESTFILE表示下载文件所存放的本地路径,以及本地保存后的文件名 
DESTFILE=$DESTDIR/$remote\_filename

ftp -i -n <<FTPIT 
open $IP 
user Sunrier redhat 
bin 
cd /home/remote/log/ftpfile 
get $FULLNAME $DESTFILE 
quit 
FTPIT       
exit 0

3.网络并发,并发与架构设计基础知识

想建设一个能承受500万PV/每天的网站吗? 500万PV是什么概念?
服务器每秒要处理多少个请求才能应对?如何计算呢?
PV是什么:PV是page view的简写。PV是指页面的访问次数,每打开或刷新一次页面,就算做一个pv。

日均IP/ PV 访问量约为600 / 2400的意思是,今天访问首页次数为2400次,访问IP为600个。也就是说这600个IP一共访问首页2400次。

计算模型: 
每台服务器每秒处理请求的数量=((80%\*总PV量)/(24小时\*60分\*60秒\*40%)) / 服务器数量 。
其中关键的参数是80%、40%。表示一天中有80%的请求发生在一天的40%的时间内。24小时的40%是9.6小时,有80%的请求发生一天的9.6个小时当中(很适合互联网的应用,白天请求多,晚上请求少)。 

简单计算的结果:
4000000/34560/1=115.7
((80%\*500万)/(24小时\*60分\*60秒\*40%))/1 = 115.7个请求/秒 
((80%\*100万)/(24小时\*60分\*60秒\*40%))/1 = 23.1个请求/秒 

初步结论:
现在我们在做压力测试时,就有了标准,如果你的服务器一秒能处理115.7个请求,就可以承受500万PV/每天。
如果你的服务器一秒能处理23.1个请求,就可以承受100万PV/每天。

留足余量:
以上请求数量是均匀的分布在白天的9.6个小时中,但实际情况并不会这么均匀的分布,会有高峰有低谷。为了应对高峰时段,应该留一些余地,最少也要x2倍,x3倍也不为过。
115.7个请求/秒 *2倍=231.4个请求/秒
115.7个请求/秒 *3倍=347.1个请求/秒
23.1个请求/秒 *2倍=46.2个请求/秒
23.1个请求/秒 *3倍=69.3个请求/秒

最终结论:
如果你的服务器一秒能处理231.4--347.1个请求/秒,就可以应对平均500万PV/每天。
如果你的服务器一秒能处理46.2--69.3个请求,就可以应对平均100万PV/每天。

说明:
这里说明每秒N个请求,就是QPS。因为我关心的是应用程序处理业务的能力。

带宽、硬件

4.虚拟机使用知识点: vmware centos7虚拟机克隆系统如何修改网卡设置?

1、克隆虚拟机,克隆前需关闭虚拟机
2、克隆之后的网卡问题解决,其中需要修改HWADDR ❤ 和UUID
  /etc/sysconfig/network-scripts/ifcfg-ens32
  uuid获取:用命令 nmcli con show 获取
  mac地址获取:从虚拟机的属性里获取

5.❤shell知识点:shell脚本中字符串截取

假设有变量
var=http://www.koloredu.com/123.htm.

1. # 号截取,删除左边字符,保留右边字符。
变量: var=http://www.koloredu.com/123.htm
echo ${var#\*//}
其中 var 是变量名,# 号是运算符,\*// 表示从左边开始删除第一个 // 号及左边的所有字符
即删除 http://
结果是 :www.koloredu.com/123.htm

2. ## 号截取,删除左边字符,保留右边字符。
变量: var=http://www.koloredu.com/123.htm
echo ${var##\*/}
##\*/ 表示从左边开始删除最后(最右边)一个 / 号及左边的所有字符 
即删除 http://www.koloredu.com/
结果是 :123.htm

3. %号截取,删除右边字符,保留左边字符
变量: var=http://www.koloredu.com/123.htm
echo ${var%/\*}
%/* 表示从右边开始,删除第一个 / 号及右边的字符
即删除 /123.htm
结果是:http://www.koloredu.com

4. %% 号截取,删除右边字符,保留左边字符
变量: var=http://www.koloredu.com/123.htm
echo ${var%%/\*}
%%/* 表示从右边开始,删除最后一个 / 号及右边的字符 
即删除  //www.koloredu.com/123.htm.
结果是:http:

5. :x:y格式表示取字符串信息,从左边第x+1个字符开始,及取出字符的y个数
变量: var=http://www.koloredu.com/123.htm
echo ${var:0:5} 
其中的 0 表示左边第一个字符开始,5 表示字符的总个数。
即取值 从字符串的0字符取值h,取5个字符,到字符:(冒号) 
结果是:http:

6. :y格式表示取字符串信息,从左边第y+1个字符开始,一直到结束。
变量: var=http://www.koloredu.com/123.htm
echo ${var:7} 
其中的 7 表示左边第8个字符开始,一直到结束。 
即取值 从字符串的第7位/之后取值,知道字符串结束
结果是 :www.koloredu.com/123.htm

7. :x-y:z格式表示取字符串信息,其中x-y表示字符串的取值范围,从右边第x-y位个字符取值,及取字符的z个字符数
变量: var=http://www.koloredu.com/123.htm
echo ${var:0-7:3}
其中的 0-7 表示右边算起第七个字符开始,3 表示字符的个数。
即取值 0-7从字符串右边取7位,然后再从左边取前3位
PS:特殊说明
①当1-7时,表示0-7取7位,但从最左边的取值中减去1位,即var=987654321   0-7=987654321  1-7=87654321  
②当7-7时,表示0-7取7位,但从最左边的取值中减去7位,即var=987654321   0-7=987654321  7-7=987654321
③当取值的范围小于输出的字符数时,将全部输出,即var=987654321    0-3=321   取4位时,显示321
结果是:123

8. :x-y格式表示取字符串信息,其中x-y表示字符串的取值范围,从右边第0个字符开始,一直到y位结束。
变量: var=http://www.koloredu.com/123.htm
echo ${var:0-7}
表示从右边第七个字符开始,一直到结束。
即取值 0-7从字符串右边取7位 
结果是:123.htm
注:(左边的第一个字符是用单个数字字符0表示,右边的第一个字符用 0-1 表示).com/123.htm.

在这里插入图片描述

第十七周

1.服务器上有哪些常用的操作系统,各有什么特点?
在这里插入图片描述
2.常用的磁盘raid有哪些?描述下原理和区别?
在这里插入图片描述
3.如何找出/usr/local 下面所有shell脚本文件,并设置执行权限?
方法1.正常思路版本

find /usr/local/ -type f -name "\*.sh" |xargs chmod +x
chmod +x ` find /usr/local/ -type f -name "\*.sh"`
find /usr/local/ -type f -name "\*.sh" -exec chmod +x {} \;
可是这个方法不严谨,因为有的脚本不是以.sh结尾的。

方法2.精确方法

通过file命令查看文件类型,通过awk、sed、grep过滤出包含shell script的然后授予x权限。


**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618542503)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

var=http://www.koloredu.com/123.htm
echo ${var:0-7:3}
其中的 0-7 表示右边算起第七个字符开始,3 表示字符的个数。
即取值 0-7从字符串右边取7位,然后再从左边取前3位
PS:特殊说明
①当1-7时,表示0-7取7位,但从最左边的取值中减去1位,即var=987654321   0-7=987654321  1-7=87654321  
②当7-7时,表示0-7取7位,但从最左边的取值中减去7位,即var=987654321   0-7=987654321  7-7=987654321
③当取值的范围小于输出的字符数时,将全部输出,即var=987654321    0-3=321   取4位时,显示321
结果是:123

8. :x-y格式表示取字符串信息,其中x-y表示字符串的取值范围,从右边第0个字符开始,一直到y位结束。
变量: var=http://www.koloredu.com/123.htm
echo ${var:0-7}
表示从右边第七个字符开始,一直到结束。
即取值 0-7从字符串右边取7位 
结果是:123.htm
注:(左边的第一个字符是用单个数字字符0表示,右边的第一个字符用 0-1 表示).com/123.htm.

在这里插入图片描述

第十七周

1.服务器上有哪些常用的操作系统,各有什么特点?
在这里插入图片描述
2.常用的磁盘raid有哪些?描述下原理和区别?
在这里插入图片描述
3.如何找出/usr/local 下面所有shell脚本文件,并设置执行权限?
方法1.正常思路版本

find /usr/local/ -type f -name "\*.sh" |xargs chmod +x
chmod +x ` find /usr/local/ -type f -name "\*.sh"`
find /usr/local/ -type f -name "\*.sh" -exec chmod +x {} \;
可是这个方法不严谨,因为有的脚本不是以.sh结尾的。

方法2.精确方法

通过file命令查看文件类型,通过awk、sed、grep过滤出包含shell script的然后授予x权限。


**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618542503)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

以下是一些常见的Linux运维面试题及答案,供参考: 1. 请介绍一下Linux系统的文件系统。 答:Linux系统的文件系统可以分为根文件系统、用户文件系统和虚拟文件系统。根文件系统包含了Linux系统的核心文件,如/bin、/sbin、/lib等。用户文件系统包含了用户的数据和应用程序,如/home、/usr、/var等。虚拟文件系统是由内核提供的一种文件系统,它不对应任何实际的硬盘分区,而是将各种资源以文件系统的形式呈现出来,如/proc、/sys等。 2. 请介绍一下Linux系统的启动流程。 答:Linux系统的启动流程可以分为BIOS、bootloader、kernel和init四个阶段。BIOS是计算机系统的基本输入输出系统,负责对计算机进行初始化和自检。bootloader是Linux系统的引导程序,负责加载内核和初始化系统环境。kernel是Linux系统的核心,负责管理系统的硬件和软件资源。init是Linux系统的初始化程序,负责完成系统的初始化和启动服务。 3. 请解释一下什么是Linux进程和线程。 答:Linux进程是指正在运行的一个程序的实例,它包含了程序的代码、数据和堆栈等。进程是Linux系统中最基本的资源之一,每个进程都有独立的内存空间和系统资源。Linux线程是进程中的一个执行单元,它与其他线程共享进程的资源,包括内存、文件描述符、信号处理等。 4. 请列举一些Linux系统的常用命令。 答:常用的Linux命令包括cd、ls、mkdir、rm、cp、mv、cat、grep、sed、awk、ps、top、netstat、ifconfig、ping、ssh、scp等。这些命令可以帮助我们进行文件操作、进程管理、网络调试等。 5. 请解释一下Linux系统的权限和文件属性。 答:Linux系统的权限和文件属性是由文件的所有者、用户组和其他用户来决定的。每个文件都有读、写和执行三种权限,分别对应r、w、x三个字符。文件的所有者可以通过chown命令来修改文件的所有者,通过chmod命令来修改文件的权限。文件的属性包括文件类型、所有者、用户组、大小、修改时间等。 以上是一些常见的Linux运维面试题及答案,希望能对您有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值