# 第一模块 走进Linux的世界

# 安装部署 Linux 系统

# 查看发行版本

  • cat /etc/redhat-release

# RPM(红帽软件包管理器)

  • 简化安装

# Yum 软件仓库

  • 解决软件包之间的依赖关系

# systemd 初始化进程

  • systemd目标(target)代替了 System V init 中运行级别的概念,如图
  • ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/defalut.target
  • RHEL 7 系统中使用systemctl命令来管理服务
  • systemctl reload 比 sytemctl 更健康

# 新手必须掌握的 Linux 命令

  • 计算机硬件由多种设备组成,而让各种硬件设备协同工作的就是系统内核,一般不去直接编辑内核中参数,而是让用户通过基于系统调用中开发出的程序或服务来管理计算机

# 强大好用的 Shell

命令名称 [命令参数] [命令对象]

  • 注意,命令名称、命令参数、命令对象之间请用空格键分隔
  • 命令对象一般是指要处理的文件、目录、用户等资源
  • 命令参数,用于扩展命令功能,如 man --help 或 man
"echo [字符串 | $变量]"
> echo Linuxprobe.com
> echo $SHELL


"date [选项] [+指定的格式]"
> date
> date "+%Y-%m-%d %H:%M:%S"
> date -s "20170901 8:30:00"


"wget [参数] 下载地址"
> wget http://www.linuxprobe.com/docs/LinuxProbe.pdf

"进程相关"
> ps aux
> top

"内存相关"
> free -h

"内核版本"
> uname -a
"系统版本"
> cat /etc/redhat-release

"查看命令记录 -c清除"
> history [-c]

# 对服务程序进行配置是通过编辑程序的配置文件完成
"cat 小猫咪 查看内容较少的纯文本"
> cat [选项] [文件]
> cat bar.service
> cat -n bar.service  # -n 行号
"more 查看内容较多纯文本 空格或回车 可翻页"
"head 查看纯文本的前N行"
> head -n 20 bar.service
"tail 查看纯文本的末尾N行 uwsgi.log"
> tail -n 20 bar.service
"wc 统计文本 -l行数 -w单词书 -c字节数"
> wc -l /etc/passwd
"stat 查看文件信息"
"file 查看文件类型"

"tar gunzip 解压缩相关"

"grep 在文本中执行关键字搜索,并显示匹配的结果"
-i 忽略大小写
-n 显示行号
-v 反向选择
> grep '"id":"22804","list_id":"1737"' schedule_official_live_switch.log
> grep -C3 '856070277967511552' uwsgi.log-20220213

"find 按照指定条件来查找文件 find [查找路径] 寻找条件 操作"
> find /etc -name "host*" -print

# 管道符、重定向与环境变量

命令组合使用,提升工作效率

  • 文件读写操作有关的重定向技术,解决输出信息的保存问题
  • 管道命令符,命令之间搭配的使用方法
  • Linux 系统命令行中的通配符和常见转义符,为Shell脚本打好功底

# 输入输出重定向

  • 标准输入重定向(STDIN,文件描述符为 0):默认从键盘输入,也可从其他文件或命 令中输入
  • 标准输出重定向(STDOUT,文件描述符为 1):默认输出到屏幕
  • 错误输出重定向(STDERR,文件描述符为 2):默认输出到屏幕
  • 注:> 或 >> 默认指定的标准输出重定向,等同于 1> 或 1>>,如果想表示同时标准和错误输出重定向,可用 &> 或 &>> 表示
  • 自动化 Shell 脚本,常用把错误信息重定向到脚本中 2>>

# 管道命令符

格式:"命令A | 命令B" 把前一个命令原本要输出到屏幕的数据当作是后一个命令的标准输入

  • 如 grep "/sbin/nologin" /etc/passwd | wc -l 原本 grep 输出到屏幕的结果,作为wc输入
  • 如 ls -al /etc/ | more

# 命令行的通配符

通配符就是通用的匹配信息的符号

  • 星号(*)代表匹配零个或多个字符
  • 问号(?)代表匹配单个字符
  • 中括号内加上数字[0-9]代表匹配 0~9之间的单个数字的字符
  • 中括号内加上字母[abc]则是代表匹配 a、b、c 三个字符中的任意一个字符
ls -l /dev/sda*
ls -l /dev/sda?
ls -l /dev/sda[0-9]

# 常用的转义字符

为了能够更好地理解用户的表达,Shell 解释器还提供了特别丰富的转义字符来处理输入的特殊数据 4 个最常用的转义字符如下所示

  • 反斜杠(\):使反斜杠后面的一个变量变为单纯的字符串
  • 单引号(''):转义其中所有的变量为单纯的字符串
  • 双引号(""):保留其中的变量属性,不进行转义处理
  • 反引号(``):把其中的命令执行后返回结果
PRICE=5
echo "Price is $PRICE"
echo "Price is $$PRICE"
echo "Price is \$$PRICE"
echo 'Price is \$$PRICE'
echo `uname -a`

# 重要的环境变量

Linux 作为一个多用户多任务的操作系统,能够为每个用户提供独立的、合适的工作运行环境,因此,一个相同的变量会因为用户身份的不同而具有不同的值

在Linux系统中一切都是文件,Linux命令也不例外,那执行一条命令后,Linux系统中发生了什么

  1. 绝对路径或相对路径的方式输入命令(如/bin/ls),直接执行
  2. 执行 alias 逻辑,"alias 别名=命令",取消别名 "unalias 别名"
  3. 判断内部命令还是外部命令,"type 命令名称",内部命令直接执行
  4. 外部命令,从 $PATH 变量的路径依次查找执行 "echo $PATH"

经典问题:"为什么不能将当前目录(.)添加到PATH中呢?"

如果黑客在公共目录/tmp存放了与ls或cd命令相同的木马文件,而用户又恰巧在公共目录执行了这些命令,那就中招了。另外有经验的运维人员,在接手一台 Linux系统后,一定要查看PATH变量中可疑的目录。

> echo $HOME

> mkdir /home/workdir
> WORKDIR=/home/workdir
> export WORKDIR        -- 提升我全局变量,su到其他用户时可使用

# Vim 编辑器与 Shell 命令脚本

# Vim 文本编辑器

"在 Linux 系统中一切都是文件,而配置一个服务就是在修改其配置文件的参数"

  • 命令模式:控制光标移动,可对文本进行复制、粘贴、删除和查找等工作
  • 输入模式:正常的文本录入
  • 末行模式:保存或退出文档,以及设置编辑环境

# 命令模式

# 末行模式

# 配置网卡信息

REHL 7中,网卡配置文件的前缀以ifcfg-开始

/etc/sysconfig/network-scripts/ifcfg-ens33

# 配置Yum软件仓库

/etc/yum.repos.d/xxx.repo

# 编写Shell脚本

准确下达命令尤为重要,支持变量和参数,还提供循环、分支等高级编程才有的控制结构特性 工作方式两种:交互式和批处理

在 Shell 脚本中不仅会用到前面学习过的很多 Linux 命令以及正则表达式、管道符、数据流重定向等语法规则,还需要把内部功能模块化后通过辑语句进行处理,最终形成日常所见的 Shell 脚本

# 编写简单的脚本

#!/bin/bash
#For Example
pwd
ls -al
  • 脚本后缀名一般为 .sh
  • 首行注释 #!/bin/bash
  • 可加描述性注释
  • 执行一:bash example.sh
  • 执行二:chmod u+x example.sh && ./example.sh

# 接收用户的参数

更加灵活实时使用脚本,可借助内置变量 $*、$#、$0、$1、$2....

#!/bin/bash
echo "当前脚本名称为$0"
echo "总共有$#个参数,分别是$*"
echo "第一个参数为$1,第三个参数为$3"

# 判断用户的参数

测试语句格式:[ 条件表达式 ] 两边均应有一个空格

  • 文件测试语句,即使用指定条件来判断文件是否存在或权限是否满足等情况的运算符
[ -d /etc/fstab ]
[ -e /etc/fstab ] && echo "Exist"
  • 逻辑测试语句
    • && 表示当前面的命令执行成功后才会执行它后面的命令,and
    • || 表示当前面的命令执行失败后才会执行它后面的命令,or
    • ! 取反,not
[ ! $USER = root ] && echo "user" || echo "root"  # 很像三元运算符
  • 整数值比较语句,仅是对数字的操作,不能将数字与字符串、文件等内容一起操作,注意
    • 等号与赋值命令符冲突
    • 大于号和小于号分别与输出重定向命令符和输入重定向命令符冲突
FreeMem=`free -m | grep Mem: | awk '{print $4}'`
[ $FreeMem -lt 1024 ] && echo "Insufficient Memory"
  • 字符串比较语句,用于判断测试字符串是否为空值,或两个字符串是否相同
[ -z $String]
[ $LANG != "en.US" ] && echo "Not en.US"

# 流程控制语句

# if条件测试语句

  • 单独 if 分支
#!/bin/bash
# 创建指定目录
DIR="/media/cdrom"
if [ ! -e $DIR ]
  then
    mkdir -p $DIR
fi
  • 完整 if... else... 分支
#!/bin/bash
# 测试指定IP是否连通
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null
if [ $? -eq 0 ]
  then
    echo "Host $1 is On-line."
  else
    echo "Host $1 is Off-line."
fi
  • 多分支 if... elif... else...
#!/bin/bash
# 测试输入值
read -p "Enter your score (0-100):" GRADE
if [ $GRADE -ge 85 ] && [ $GRADE -le 100  ]; then
  echo "$GRADE is Excellent"
elif [ $GRADE -ge 70  ] && [ $GRADE -le 84  ]; then
  echo "$GRADE is Pass"
else
  echo "$GRADE is Fail"
fi

# for条件语句循环

  • for var in cat xxx; do... done
#!/bin/bash
read -p "Enter The Users Password: " PASSWD  # 赋值给变量 PASSWD
for UNAME in `cat users.txt`; do    # for循环取值 `cat xxx`
  id $UNAME &> /dev/null            # &> 标准or错误输出,统一丢到垃圾桶
  if [ $? -eq 0  ]; then            # $? 指的是 id $UNAME 执行结果,not &>
    echo "Already exists"
  else
    useradd $UNAME &> /dev/null
    echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null
    if [ $? -eq 0  ]; then
      echo "$UNAME, Create success"
    else
      echo "$UNAME, Create failure"
    fi
  fi
done
# 查看结果 tail -6 /etc/passwd

# 计划任务服务程序

  • 一次性计划任务 atd
yum install -y at
systemctl start atd
systemctl enable atd

echo "nginx -s reload" | at 23:30
  • 长期性计划任务 crond,"分 时 日 月 星期 命令",如果有些字段没有设置,需要 * 占位
crontab -e
crontab -l

# 在每周一、三、五的凌晨3点25分,使用tar命令把网站的数据目录打包备份
25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwroot
  • 1,3,5 隔开表示多个时间段、12-15 可表示连续时间段、/2 每隔2分钟(或小时)执行一次
  • 计划任务的命令,一定要绝对路径的方式来写
  • 在crond 服务的配置参数中,可以#号开头写上注释信息
  • 计划任务中的“分”字段必须有数值,绝对不能为空或是*号,而"日"和 "星期"字段不能同时使用,否则就会发生冲突

# 用户身份与用户权限

# 用户身份与能力

在Linux系统中,UID就相当于我们的身份证号码一样具有唯一性,可通过用户的UID值来判断用户身份

  • 管理员 UID 为 0:系统的管理员用户
  • 系统用户 UID 为 1~999: Linux 系统为了避免因某个服务程序出现漏洞而被黑客提权至整台服器,默认服务程序会有独立的系统用户负责运行,进而有效控制被破坏范围
  • 普通用户 UID 从 1000 开始:是由管理员创建的用于日常工作的用户 一个用户只有一个同名的基本用户组,但是可以有多个扩展用户组

# useradd 命令

格式: "useradd [选项] 用户名"

> useradd -d /home/linux -u 8888 -s /sbin/nologin linuxprobe
> id linuxprobe

# groupadd 命令

格式: "groupadd [选项] 群组名"

> groupadd ronny

# usermod 命令

格式: "useradd [选项] 用户名"

usermod -G root linuxprobe
usermod -u 9999 linuxprobe
usermod -s /bin/bash linuxprobe

# passwd 命令

格式: "passwd [选项] 用户名"

echo "password" | passwd --stdin linuxprobe

passwd -l linuxprobe
passwd -S linuxprobe
  • gpasswd -h 可以从某个组中把某个用户剔除

# userdel 命令

格式: "userdel [选项] 用户名"

userdel -r linuxprobe

# 文件权限与归属

Linux系统中一切都是文件,但是每个文件类型不尽相同 对于一般文件来说

  • "可读"表示能够读取文件的实际内容
  • "可写"表示能够编辑、新增、修改、删除文件的实际内容
  • "可执行"则表示能够运行一个脚本程序 对目录文件来说
  • "可读"表示能够读取目录内的文件列表
  • "可写"表示能够在目录内新增、删除、重命名文件
  • "可执行"则表示能够进入该目录

# 文件的特殊权限

# SUID

仅对拥有执行权限的二进制程序有效,可以让二进制程序的执行者临时拥有属主的权限。类似尚方宝剑普通用户执行 passwd 时,可以访问 /etc/shadow 文件

[root@k8s-master home]# ls -al /etc/shadow
---------- 1 root root 1433 311 00:02 /etc/shadow
[root@k8s-master home]# ls -al /bin/passwd
-rwsr-xr-x. 1 root root 27856 41 2020 /bin/passwd

# SGID

# SBIT

  • 对某个目录设置了 SBIT 粘滞位权限后,该目录中的文件就只能被其所有者执行删除操作了,即便读、写、执行权限全开也不能删除,如 /tmp。
  • 当目录被设置 SBIT 特殊权限位后,文件的其他人权限部分的 x 执行权限就会被替换成 t 或者 T,原本有 x 执行权限则会写成 t,原本没有 x 执行权限则会被写成 T
> cd /
> ls -al 
drwxrwxrwt.   7 root root   93 311 04:11 tmp

# 文件的隐藏属性

Linux 系统中的文件除了具备一般权限和特殊权限之外,还有一种隐藏权限,即被隐藏起来的权限,默认情况下不能直接被用户发觉

# chattr 命令

格式: "chattr +参数 文件" or "chattr -参数 文件"

# lsattr 命令

格式: "lsattr 文件"

chattr +a linuxprobe
lsattr linuxprobe

# 文件访问控制列表

对某个指定的用户进行单独的权限控制

> su - linuxprobe
> cd /root
Permission denied

# setfacl 命令

格式: "setfacl [选项] 文件名称"

setfacl -Rm u:linuxprobe:rwx /root
su - linuxprobe
cd /root
ls -ld /root
  • 针对目录文件需要使用 -R 递归参数
  • 针对普通文件则使用 -m 参数
  • 如果想要删除某个文件的 ACL,则可以使用 -b 参数
  • 越学越多,敢说精通 Linux ? 文件的权限最后一个点(.) 变成加好(+)

# getfacl 命令

格式: "getfacl [选项] 文件名称"

getfacl /root

# su命令与sudo服务

  • su 完全切换到新的用户,即把环境变量信息也变更为新用户的相应信息,而不是保留原始的信息,强烈建议在切换用户身份时添加这个减号(-) su - linuxprobe

  • sudo 命令把特定命令的执行权限赋予给指定用户,这样既可保证普通用户能够完成特定的工作,也可以避免泄露 root 管理员密码

# 存储结构与磁盘划分

# 一切从"/"开始

  • 一切皆文件,大小写敏感,道德上遵循 文件系统层次化标准 FHS

# 物理设备的命名规则

udev服务会一直以守护进程的形式运行并侦听内核发出的信号来管理/dev 目录下的设备文件

# 文件系统与数据资料

文件系统的作用是合理规划硬盘,以保证用户正常的使用需求

  • Ext3
  • Ext4
  • XFS,RHEL7默认的文件管理系统,最大存储容量为18EB

# 挂载硬件设备

当用户需要使用硬盘设备或分区中的数据时,需要先将其与一个已存在的目录文件进行关联,而这个关联动作就是"挂载"

# mount 命令

格式: "mount 文件系统 挂载目录"

mount /dev/sdb2 /backup

# 如果想重启后仍然有效,需手动编辑添加条目
vim /etc/fstab

# umount 命令

格式: "umount [挂载点/设备文件]"

umount /dev/sdb2

# du 命令

格式: "du [选项] [文件]"

  • 查看一个或多个文件占用了多大的硬盘空间
du -sh /*

# 软硬方式链接

  • 硬链接(hard link) 即使原始文件被删除,依然可以通过硬链接文件来访问
  • 软链接(也称符号链接 symbolic link),类似Windows的"快捷方式"

# ln 命令

格式: "ln [选项] 源文件 链接文件"

echo "Welcome to linuxprobe.com" > readme.txt
# 硬链接
ln readme.txt readit.txt
# 软链接
ln -s readme.txt readit.txt

如果没有扎实的理论知识和实践经验做铺垫,尽管能够成功完成实验,但永远不会明白为什么会成功

# 相关链接

  • awk https://www.runoob.com/linux/linux-comm-awk.html
# 用法格式
awk '{[pattern] action}' {filenames}   # 行匹配语句 awk '' 只能用单引号

# 每行按空格或TAB分割,输出文本中的1、4项
> awk '{print $1,$4}' log.txt

# 使用","分割
> awk -F, '{print $1,$2}'  log.txt
  • 本笔记参考网站 https://www.linuxprobe.com/
  • systemctl https://www.jianshu.com/p/3dd6b57a16bf
上次更新: 8/26/2022, 7:08:14 PM