2024-11-13
linux
00

目录

linux介绍
发展历程
linux的组成
linux发型版本
linux学习准备
远程链接排查三部曲
linux 命令行格式
查询帮助
命令行快捷键
linux关机重启命令
安装软件
linux核心目录
核心目录
目录操作相关命令
特殊符号
vi/vim编辑器
vi的工作模式
命令模式下的快捷键
低行模式的快捷键
vi故障案例
日志操作相关命令
wc
which whereis
文件比较命令
sort/uniq 排序去重组合
案例,sort 对目录文件排序
指定分隔符进行排序
多列排序
uniq
date
date选项
同步时间
案例: 备份文件时给压缩包添加时间
四剑客
find
使用示例
与其他命令配合
grep
sed命令
sed的查找功能
sed的修改功能
sed的删除功能
sed的增加功能
awk
取行
取列
awk统计与计算
文件属性体系
inode与block部分
Linux文件类型
软硬链接
文件大小
时间
打包三剑客
tar命令
gzip
zip/unzip
scp
alias别名
别名的案例
用户管理
用户管理指令
sudo权限管理
堡垒机
权限管理体系
权限计算
修改权限
权限与文件目录
Permission denied故障排查
系统默认权限(了解)
权限控制与系统安全(了解)
3个特殊权限(了解)
Linux特殊属性(了解)

本文介绍了linux进行发展历程、组成和发型版本;
介绍了Linux的核心目录、用户管理和权限管理体系;
对linux命令进行系统的梳理和归纳。

linux介绍

发展历程

Linux是一种自由和开放源代码的操作系统,它基于Unix操作系统

  1. Unix操作系统
    • Unix是由AT&T贝尔实验室开发的一种多用户、多任务操作系统。它于1969年首次推出,并在1970年正式发布。
    • 在Unix系统中,所有操作都是通过命令行界面完成的
    • 最初诞生是给个人用和企业可以免费用,但好景不长开始收费
  2. 之后 谭宁邦 教授站出来说不行,于是自己搞了一个 Mint(mini unix)
  3. 再后来 斯托曼 整出一个给企业使用的版本,发誓要超过 Mint
    • 他建立了一个组织: 自由软件基金会 FSF
    • 这个组织有一个规则、协议: GPL公共通用许可 这个软件开发符合两个规则
      • 所有软件开源,可以随意修改。
      • 改完之后的内容,也要开源。
  4. 最后 一个学生托瓦斯 开发出了linux内核 大约91年
    • 内核 + 斯托曼 开发出的软件, 就是Linux系统

linux的组成

可以把linux系统比做一个鸡蛋

  • 蛋壳 各种命令、服务、软件
  • 蛋清 命令行解析器(解释Linux命令)
  • 蛋黄 Linux内核(控制硬件),无法直接操作内核

image.png

linux发型版本

发行版本:通过内核+命令解释器+不同应用程序/桌面组成的.

image.png

我们一般选择 UbuntuCentOS 系统,

国产系统 国企一般选择华为的 麒麟系统 kylin v10 (它使基于Centos7, 只是更新了内核)

linux学习准备

学习linux 一般是使用VMware 安装虚拟机,安装过程如下

  1. 安装虚拟机
  2. 部署linux系统、配置网络
  3. 使用远程连接工具连接Linux系统。输入命令,管理维护linux

远程连接工具

  1. windows
    • Xshell 5.x 家庭、学校
    • SecureCRT
    • Putty 功能简单
    • mobaXterm 功能多
  2. mac
    • Iterm2
    • SecureCRT
    • finalshell

远程链接排查三部曲

  1. ping检查连通性
    • 格式: ping ip地址或域名
  2. 检查防火墙,安全设备,安全规则拦截
  3. 检查是否提供服务(本质检查端口是否开放)
    • telnet ip或域名 端口

ip 命令

ip address

ip a 简写

linux 命令行格式

远程连接后得到的信息

image.png

可以通过hostnamectl set-hostname 新的主机名就行 修改主机名,下次重新登陆生效

命令行格式如下

command option arguments/parameter

  • 命令  Linux下面通过命令控制整个系统。(一般是单词或缩写)
  • option 同一个命令的不同的功能。执行命令的时候可以加上的条件。
  • argument/parameter 命令处理的目标一般就把选项和参数统称为参数即可。不是所有的常用的命令都需要加上参数、选项。

查询帮助

  • man命令 查询帮助
  • --help查询精简的帮助
  • info帮助 超级详细帮助(一般不用)
  • help查询Linux内置命令(一般不用)

命令行快捷键

Linux快捷键作用
ctrl + a光标移动到行首
ctrl + e光标移动到行尾
ctrl + u把光标所在位置到行首的内容剪切
ctrl + k把光标所在位置到行尾的内容剪切
ctrl + l清屏 相当于clear命令
ctrl + c取消当前的命令
option + page left
option + page right
光标往左/右跳过单词
tab用于自动补全命令或目录

window与linux快捷键的冲突

快捷键linux功能windows功能
ctrl + s锁屏保存
ctrl + q解锁
ctrl + z让当前正在运行的命令,后台挂起。撤销

更多快捷键

linux关机重启命令

  • shutdown   关机
  • shutdown -c  取消关机
  • shutdown -h
    • shutdown -h now 立刻关机
    • shutdown -h 10 10分钟后关机
  • halt   关机,关闭系统,需要手段切到电源
  • poweroff 关机
  • init 0  关机

重启

  • shutdown -r
    • 示例 shutdown -r now 立即重启,
    • shutdown -r 20 20分钟后重启
  • reboot
  • init 6

安装软件

Centos系统使用yum管理软件包,Ubuntu使用apt管理软件包,由于众所周知的问题,需要修改软件源

以Ubuntu 系统为例

  1. 先备份 sudo cp /etc/apt/sources.list /etc/apt/sources.list_bak
  2. sudo vi /etc/apt/sources.list 写入以下内容
sh
deb http://mirrors.tencentyun.com/ubuntu/ focal main restricted universe multiverse deb http://mirrors.tencentyun.com/ubuntu/ focal-security main restricted universe multiverse deb http://mirrors.tencentyun.com/ubuntu/ focal-updates main restricted universe multiverse #deb http://mirrors.tencentyun.com/ubuntu/ focal-proposed main restricted universe multiverse #deb http://mirrors.tencentyun.com/ubuntu/ focal-backports main restricted universe multiverse deb-src http://mirrors.tencentyun.com/ubuntu/ focal main restricted universe multiverse deb-src http://mirrors.tencentyun.com/ubuntu/ focal-security main restricted universe multiverse deb-src http://mirrors.tencentyun.com/ubuntu/ focal-updates main restricted universe multiverse #deb-src http://mirrors.tencentyun.com/ubuntu/ focal-proposed main restricted universe multiverse #deb-src http://mirrors.tencentyun.com/ubuntu/ focal-backports main restricted universe multiverse

参考资料: linux更换软件源

linux核心目录

核心目录

根下的核心目录说明
/etc/系统服务配置文件的目录,存放系统,服务的配置。
/home/普通用户家目录
/root/皇宫,root用户家目录。
/dev/device,设备文件目录,硬盘,光盘。
/tmp/temp临时目录,临时存放内容。
/boot/系统启动与引导相关的文件存放出:存放引导系统启动程序,系统内核镜像。
/lib/lib64library库文件(服务软件的依赖) .so 软件运行所需要的环境。
/lost+found系统宕机 临时保存数据位置
/mntmount tempoary 临时挂载点(磁盘)临时的入口
/optoption 第三方软件 安装位置
/procprocess(进程)虚拟目录 存放的是内存中信息、进程、服务信息、内核信息
/sys虚拟目录 存放的是内存中信息、进程、服务信息
/usr存放用户安装软件
/var经常变换的数据 存放的位置 日志(服务日志)

/var下面的两个重要文件

-说明建议
/var/log/secure存放用户登录情况日志分析是否有恶意破解情况.
/var/log/todo通用各种服务的日志, 日志很多分析服务,系统异常

/proc/ 目录

这个目录下面存放的是系统的各种内存中进程信息,Linux内核配置,系统信息.
这是个虚拟目录,不会占用磁盘空间.

image.png

另外还有两个目录 Centos与Ubuntu有区别

CentosUbuntu说明
/bin/usr/bin二进制文件命令
/sbin/usr/sbin超级命令,只有root可以使用

在linux中

  1. 一切皆文件
  2. 所有的设备,不挂在无法使用

路径的表现形式 相对路径、绝对路径

目录操作相关命令

  • cd   进入到某个目录
    • 补充 cd 回到家目录
  • pwd  print working directory显示当前所在位置
  • mkdir  创建目录
    • -p 创建多层目录
    • -v 显示创建目录过程
  • touch  创建文件
  • ls     list 列表
    • -l long以长格式显示(显示详细信息,比如文件时间,大小,所有者) 简写为ll
    • -t time 按照修改时间排序.
    • -r reverse .... 逆序排序,一般-rt 一起用.
    • -h 以人类可读形式显示大小
    • 案例: 查看/etc目录按照时间排序逆序排序(一个目录中文件太多了,找出最近的文件)
      • ls -lrt /etc/ll -rt /etc/
    • 案例 ls核心功能核心:以人类可读形式显示大小
      • ls -lh /etc/ll -rt /etc/
  • cp    copy 复制文件或目录
    • -a all简单理解为复制所有详情: -dpr
    • -r 递归复制,复制目录及目录的内容
    • -p 复制的时候保持属性不变
    • -d 可以复制软连接
    • cp a.txt b.txt dirs 复制多个文件到某一目录 如果涉及目录 加-a
  • rm    remove 移除,删除文件或目录
    • -f force 强制删除不提示,危险
    • -r 递归删除,删除目录及目录的内容,没有需求不要加上-r
  • mv    move移动或改名
mv从哪里来到哪里去
移动mv文件 目录 ....目标(目录)
改名mv文件或目录文件或目录

提示

touchmkdirmv等命令可以操作多个文件或目录

  • echo  输出信息到屏幕

输出有规律的内容

  • echo {0..10}
  • echo {a..z}
  • echo {a..e}
  • echo {01..10}
  • echo file{01 .. 10}.txt
  • cat 显示文件内容
    • -n number 显示文件内容及行号
    • 示例合并文件cat aa.txt bb.txt >> /tmp/vim.log

案例:cat往文件写内容

sh
cat > ./cat.txt<<EOF > 1 > 2 > EOF ubuntu@myServer:~/linuxLearn$ cat ./cat.txt 1 2 ubuntu@myServer:~/linuxLearn$

特殊符号

  • ~   家目录
  • ..  上级目录
  • -   上次所在目录
  • .   进入当前目录(未来一般与复制,移动一起用)
  • |    管道 将左边的计算结果传递到最右边
  • ` `    反引号里面的内容优先执行
  • >   清空写入
  • >>  追加写入
  • {x..y}  生成序列x~y
  • *   任意内容

vi/vim编辑器

vi与vim的区别

  • vi 系统自带,不需要额外安装,没有vim功能多
  • vi的升级版(vi imporved),未来大部分情况都是用vim即可

vi的工作模式

vi.png

命令模式下的快捷键

  • 移动到最后一行 G(shift+g)
  • 移动到第1行   gg    
  • 移动到某一行   100gg
  • 光标移动到行首   ^(数字6)
  • 光标移动到行尾   $(数字4)
  • 复制当前行           yy
  • 删除当前行           dd
  • 粘贴到当前行后       p
  • 撤销             u(undo)
  • 删除全部
    • 到第一行 按dG

低行模式的快捷键

  • 显示行号             :set nu:set number
  • 取消显示行号         :set nonu
  • 搜索(默认就是向下找) /你要的内容
    • 继续向下搜索         n(next)
    • 继续向上搜索        N
    • 搜索默认向上找       ?你要的内容
  • 替换 :%s#aa#bb#g
    • %表示从第一行到最后一行
    • sg中间用#分割表示替换的内容
  • 复制指定行 复制9-15行到16行
    • 到第9行 按V选择到第15行,到16行 按p
    • 到第9行 按10yy,到16行 按p
    • :9,15copy16
  • 移动指定行
    • :9,15move16

批量处理-了解

批量处理行:复制,删除
shift  + v 进入到可视行模式(批量操作行)
按上下键,选择要处理的范围
如果删除按d,如果复制按y

批量删除某部分内容,批量增加内容
案例1 批量删除文件开头的
ctrl + v,进入批量操作模式
选择要操作的区域
然后按d,删除.

案例2 批量给文件开头增加内容
ctrl + v,进入批量操作模式
选择要操作的区域
选完后,按shift + i (I),进入编辑模式
写入内容
esc等待.

vi故障案例

image.png

产生的原因

  1. vim 编辑文件过程中 突然宕机
  2. 有多个窗口同时编辑该文件

解决方案

  1. 方案1: 删除临时文件,工作中也可以删掉. 根据 提示的路径删除对应的临时文件即可.重新打开文件.
  2. 方案2: 恢复未保存数据

日志操作相关命令

由于linux命令比较琐碎,而我们登录服务器大部分时候都是查看日志,然后操作文件相关,所以我把这些命令都归类到了“日志操作”。

当然四剑客(awk sed grep find)也属于日志操作,但其功能过于复杂(强大)所以单独拎出来在下一段内容讲解,本段落介绍的命令内容相对简单易学。

注意

生产环境下查看日志千万不要使用cat/vim/vi命令,有的日志可能要几G/几十G,如果使用cat查看

  • 会刷屏根本停不下来
  • 有可能导致正在运行的服务因内存不足致使服务宕机
  1. head 显示文件头几行
sh
# head 默认是头10行 head -n5 /etc/passwd # 显示/etc/passwd 的前5行 # 也可以 head -n 5 /etc/passwd head -5 /etc/passwd
  1. tail 显示文件的后几行
  • -n num 指定行号
  • -f follow显示文件末尾的实时更新
    • 简写 tailf
  1. less 按页显示文件内容

一页一页翻看文件内容.也可以进行搜索

less选项与快捷方式说明
q退出
空格或f下一页
b上一页 (back)
G最后1行
g第1行
99g到第99行
/内容搜索,n继续向下搜索,N继续向上搜索

less -N 显示行号

  1. more 按页显示文件内容,到达最后一行就退出.

more功能没less

wc

统计文件中单词情况,大小,行数

image.png

通常我们只看行数 wc -l /etc/services

wc通常用来统计错误日志次数,比如统计ssh失败登陆的次数

grep 'Failed passward' /var/log/secure | wc -l

which whereis

sh
ubuntu@myServer:~$ which head tail less more less wc grep /usr/bin/head /usr/bin/tail /usr/bin/less /usr/bin/more /usr/bin/less /usr/bin/wc /usr/bin/grep ubuntu@myServer:~$ whereis head tail less more less wc grep head: /usr/bin/head /usr/share/man/man1/head.1.gz tail: /usr/bin/tail /usr/share/man/man1/tail.1.gz less: /usr/bin/less /usr/share/man/man1/less.1.gz more: /usr/bin/more /usr/share/man/man1/more.1.gz less: /usr/bin/less /usr/share/man/man1/less.1.gz wc: /usr/bin/wc /usr/share/man/man1/wc.1.gz grep: /usr/bin/grep /usr/share/man/man1/grep.1.gz /usr/share/info/grep.info.gz ubuntu@myServer:~$

区别是whereis更详细会把 帮助文档 列出来

作用: 查找命令是否存在,不存在使用yum/apt 安装

文件比较命令

我们对比下新旧的配置文件,查看修改了哪些内容。可以通过diff,vimdiff命令实现。

image.png

image.png

sort/uniq 排序去重组合

  • sort 排序
  • uniq 去重

sort选项

sort 选项说明
-nnumber把要排序的内容当做是数字,按照数字大小进行排序,默认是按照字符排序,默认升序排序(小大)
-k指定某一列,根据某一列进行排序
-rreverse逆序排序
-t指定分隔符,只能指定1个字符. 默认是空格
sh
ubuntu@myServer:~/linuxLearn$ cat student.txt zhangsan 18 lisi 12 wangwu 24 zhaoliu 30 sunqi 19 ubuntu@myServer:~/linuxLearn$ sort -nr -k2 student.txt zhaoliu 30 wangwu 24 sunqi 19 zhangsan 18 lisi 12 ubuntu@myServer:~/linuxLearn$ # 等效于 sort -rnk2 student.txt

案例,sort 对目录文件排序

sh
ubuntu@myServer:~/linuxLearn$ ls -l /etc/ | sort -rn -k5 | head -n5 -rw-r--r-- 1 root root 40714 Jan 20 2024 ld.so.cache -rw-r--r-- 1 root root 24546 Oct 19 2019 mime.types -rw-r--r-- 1 root root 14867 Feb 1 2019 ltrace.conf -rw-r--r-- 1 root root 14464 Feb 17 2020 services -rw-r--r-- 1 root root 10593 Apr 1 2022 sensors3.conf ubuntu@myServer:~/linuxLearn$

指定分隔符进行排序

sh
ubuntu@myServer:~/linuxLearn$ cat /etc/passwd | head -n5 root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync ubuntu@myServer:~/linuxLearn$ sort /etc/passwd -t ":" -rnk 3 | head -n5 nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin lighthouse:x:1001:1001::/home/lighthouse:/bin/bash ubuntu:x:1000:1000:ubuntu:/home/ubuntu:/bin/bash systemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin lxd:x:998:100::/var/snap/lxd/common/lxd:/bin/false ubuntu@myServer:~/linuxLearn$

多列排序

sh
ubuntu@myServer:~/linuxLearn$ cat student2.txt a 40 linux学院 20000 b 22 linux学院   30000 c 18 linux学院 21000 a6 8 linux学院 15000 a5 8 linux学院 25000 a4 7 linux学院 30000 a3 7 linux学院 4040 a2 7 linux学院 30300 a1 7 linux学院 50000 ubuntu@myServer:~/linuxLearn$ sort -rn -k2 -k4 student2.txt # 优先对第2列排序,如有重复,则对第4列排序 a 40 linux学院 20000 b 22 linux学院   30000 c 18 linux学院 21000 a5 8 linux学院 25000 a6 8 linux学院 15000 a1 7 linux学院 50000 a2 7 linux学院 30300 a4 7 linux学院 30000 a3 7 linux学院 4040 ubuntu@myServer:~/linuxLearn$

uniq

unique独一无二,它是sort的黄金搭档
去重(去除重复的留下唯一的)

sh
ubuntu@myServer:~/linuxLearn$ cat uniq.txt lida lida lida lida lida smile smile smile smile blood blood blood blood zhangsan wangwu ubuntu@myServer:~/linuxLearn$ uniq -c uniq.txt 5 lida 4 smile 4 blood 1 zhangsan 1 wangwu ubuntu@myServer:~/linuxLearn$

示例: 先用sort排序,然后用uniq统计次数,再用sort排序 sort uniq.txt |uniq -c |sort -rn

企业案例: 分析日志/var/log/secure, 分析谁在攻击你

date

设置或查看系统的日期,时间命令

date选项

  • + 以xxxx格式显示日期与时间
    • %F %Y-%m-%d 应用备份文件
    • %w 周几
    • %T %H:%M:%S 时:分:秒
  • -d 按照指定格式展示日期
    • date -d '20241111' 只展示日期
    • date -d '1day' 明天
    • date -d '-1day' 昨天
sh
ubuntu@myServer:~/linuxLearn$ date Mon 11 Nov 2024 03:06:59 PM CST ubuntu@myServer:~/linuxLearn$ date +"%F %H:%M:%S" 2024-11-11 15:07:00 ubuntu@myServer:~/linuxLearn$ date +"%F_%w" 2024-11-11_1 ubuntu@myServer:~/linuxLearn$ ubuntu@myServer:~/linuxLearn$ date -d '20241111' Mon 11 Nov 2024 12:00:00 AM CST ubuntu@myServer:~/linuxLearn$ date -d '1day' Tue 12 Nov 2024 03:11:12 PM CST ubuntu@myServer:~/linuxLearn$ date -d '-1day' Sun 10 Nov 2024 03:11:18 PM CST ubuntu@myServer:~/linuxLearn$

同步时间

sh
#修改系统时间,让系统时间不同步. date -s '20221111' #安装时间同步命令 sudo apt install ntpdate #进行时间同步 ntpdate ntp1.aliyun.com
  • 检查时区 timedatectl status
  • 设置时区 timedatectl set-timezone Asia/Shanghai

案例: 备份文件时给压缩包添加时间

sh
touch backup-`date +%F`.txt

四剑客

四剑客是指(awk sed grep find),也有种说法是三剑客(不包括老四find

find

在指定目录中查找文件

find命令选项

  • -type 什么类型的文件 f表示文件 d表示目录
  • -name
  • -size 根据大小查找文件 +表示大于 -表示小于 +10k(小写K) +10M(大写) G
  • -mtime 根据修改时间查找文件

使用示例

  1. 精确查找与模糊查找
  • find /etc/   -type f  -name 'hostname' /etc/hostname/etc/hostname目录下找到'hostname'的文件
  • find /etc/ -type f -name '*.conf' 出/etc/下面以.conf结尾的文件
  • 找以qq开头的文件: -name 'qq*'
  • 找包含aa的文件: (可能是开头,可能是结尾,可能是中间)
    • -name '*a*'
    • 方案2 find+grep find / -type f |grep 'aa8'
  1. 根据大小查找
  • find /etc/ /tmp/  -type f -size  +10k 在/etc/目录下面找出大于10kb的文件
  1. 根据时间查找
  • -mtime +7 找出7天之前的文件(修改时间是7天之前)
  • -mtime -7 表示 最近7天内的文件
  1. 指定层数

find / -maxdepth 2  -type f -name "*.conf"

-maxdepth 1选项位置第1个,指定find命令查找的最大深度 (层数),不加上就是所有层。

与其他命令配合

  1. 找出/aa/目录下以.txt结尾的文件并显示详细信息
  • ls -lh $(find /aa/ -type f -name '*.txt')
  • ls -lh `find /aa/ -type f -name '*.txt'`
  • find /aa/  -type f  -name '*.txt' |xargs ls -lh
    • xargs 将管道数据变化为命令的参数
  • find + -exec
    • find /aa/ -type f -name '*.txt'   -exec ls -lh {} \;
  1. find与打包压缩

找出/aa/.txt结尾的文件并打包为/tmp/find.tar.gz

  • 方法1 tar zcf /tmp/find.tar.gz  `find /aa/ - type f -name '*.txt'`
  • 方法2 find /aa/  -type f  -name '*.txt'|xargs tar zcf /tmp/etc-xargs.tar.gz
  • 方法3 find /aa/  -type f  -name '*.txt'  -exec tar zcf /tmp/find-exec.tar.gz {} +;

exec命令的使用

  • 命令1 -exec 命令2 {} \; 等价于 命令2 $(命令1)
  • 命令1 -exec 命令2 {} +; 命令1有多个结果,统一变为命令2 的参数运行
  1. findcp

这里也是套格式

  • $() 或 ` `
  • .. -exec .. {} \;
  • .. xargs ..

但问题是 cp 命令 cp 文件或目录1 文件或目录1 ... 目标文件夹 使用 xargs 只会把参数放到尾部,这时我们要了解cp命令的-t选项, 即cp -t 目标文件夹 文件或目录1 文件或目录1 ... 这样就能适配 xargs 了

grep

过滤:在文件中或管道中进行查找,找出想要的内容

grep选项

  • -n 显示行号
  • -v 排除,取反
  • -i 过滤的时候忽略大小写

示例

  • grep 'root' /etc/passwd
  • grep -n 'root' /etc/passwd
  • grep -i  'failed password' var/log/secure
  • grep -v nologin' /etc/passwd

grep 也可以对接管道

  • ps -ef |grep 'crond' 过滤出叫crond的进程

sed命令

sed是四剑客的老大,功能最为强大。

它的功能如下

  • 核心功能:取行、过滤、替换修改文件内容
  • 难点: 向后引用(截取)
  • sed strean editor 流编辑器

sed 命令格式 sed 选项 条件动作 文件

这个“条件动作” 可以结尾 “找谁干啥”

  • 找谁:条件,匹配哪一行,哪些行
  • 干啥:动作

sed的查找功能

grep命令相比

  • 过滤, sed可以指定行号
  • 模糊查找都可以使用正则, sed -r支持扩展正则

示例:

  1. sed -n '3p' /etc/passwd
    • 取出/etc/passwd文件的第三行
    • -n 取消默认输出,不加会全部输出
    • 3表示第三行 p是print打印的意思
  2. sed -n '2,5p' /etc/passwd
    • 取出第2至5行的内容
  3. sed -n '2p;4p' /etc/passwd
    • 取出第2行和第4行的内容
  4. sed -n '/root/p' /etc/passwd
    • 过滤内容包含 "root" 的行
    • 相当于 grep 'root' /etc/passwd
  5. sed -n '/^root/p' /etc/passwd
    • 过滤内容以 "root" 开头的行
    • 这里支持的是基础正则,如果需要使用扩展正则需要使用sed -r选项
  6. 根据范围查找 sed -n '/从哪里来/ , /到哪里去/p' sed.txt
    • sed -n '/102/ , /104/p' sed.txt
    • image.png
    • 补充根据日期查找 sed -n '/10:00:00/ , /11:00:00/p' sed.txt

sed的修改功能

修改也叫替换

sed 's#找谁#替换成什么#g' sed.txt

image.png

解释一下这个命令

  • s表示 substitute 替换
  • g表示 global 全局替换,这一行中把所有匹配到的内容都进行替换,否则只替换每一行第1个匹配的内容

如果本身替换的内容有#怎么办?

也可以写为 s@找谁@替换成什么@g s/找谁/替换成什么/g

"找谁" 这里可以些正则表达式,如下

sed 's#[0-9]#-#g' sed.txt

image.png

去掉g看一下

image.png

sed可以针对一个文件进行先备份在修改保存 sed -i.bak 's#lisi#李四#g' sed.txt image.png

注意:

  • -i是会把修改写入源文件
  • -i紧接着的内容是备份文件名

前面提到 sed的 s###g中 "替换" 可以写正则表达式,后面就可以引用,这就 sed的反向引用(后向引用)

echo 12345678 | sed -r 's#(1)(.+)(8)#\1<\2>\3#g'

image.png

sed的删除功能

  • d delete 删除sed命令删除功能按照为单位进行.
  • 如果仅仅删除某一行的一些字符推荐使用'sa-z]g'

sed '3d' sed.txt

image.png

这里没有加 -i 加上的话就是真的删除了

删除/etc/ssh/sshd_config 带注释的内容 egrep -v '^$|#' /etc/ssh/sshd_config

使用sed命令 sed -r '/^$|#/d' /etc/ssh/sshd_config

用 awk也可以awk  '! /^$|#/' /etc/ssh/sshd_config

sed的增加功能

sed 有三个选项,在指定的行号增加内容

  • -a append 在指定行后面追加内容
  • -i insert 在指定行上面插入一行
  • -c replace 替换指定行的内容

awk

awk是四剑客的老大,功能最为强大

四剑客特点擅长
find查找文件与其他命令配合
grep/egrep过滤过滤速度最快
sed过滤、取行、替换、删除替换、修改文件内容、取行
awk过滤、取行、取列、统计计算、判断、循环...取行、取列、统计计算

awk是一个语言,叫单行脚本

awk的格式 awk   选项   '条件{动作}'   /etc/passwd

awk命令的执行流程

awk.png

取行

  1. 取出/etc/passwd的第1行
  • awk 'NR==1' /etc/passwd
  • 等效于awk  'NR==1{print $0}' /etc/passwd

提示

  • NR Number of Record 记录号,行号.
  • == 表示等于, 这里也支持其他运算符>= != && || >
  • {print $0} 输出整行内容 $0表示当前行的内容. awk满足条件后默认的动作,输出这一行的内容.
  1. 取出/etc/passwd第2行到第5行的内容

awk 'NR2 NR5' /etc/passwd

  1. 过滤出/etc/passwd文件中包含rootnobody的行

awk '/root|nobody/' /etc/passwd

  1. /etc/passwd取出包含root的行到nobody的行

awk '/root/,/nobody/' /etc/passwd

取列

  1. 使用awk取出ls -lh 的大小列和最后2列

ls -lh /etc/hosts |awk '{print $5,$(NF-1),$NF}'

awk中取列的时候说明

  • $数字,表示取列,$1 第1列 $0表示这一行.
  • $NF 最后一列
  • NF Number of Field 每行有多少列
  • $(NF-1) 取出倒数第2列,一般用于正向取发生变化或数字过大.

awk输出与对齐

为了使数据结果好看可以使用\tcolumn -t格式化结果

  • ll -h |awk '{print $5"\t"$9}'
  • ll -h |awk '{print $5,$9}'|column -t
  1. 取出/etc/passwd中的第1列,第3列和最后一列

image.png

ls -l的输出结果不同,/etc/passwd 中的内容以 :分割, awk取列的时候,默认是通过空白字符进行分割的,所以这里要通过 -F的方式指定分割符

awk -F ':' '{print $1,$3,$NF}' /etc/passwd|column -t

image.png

  1. 指定复杂分隔符取出ip

image.png

  • 逐步实现: ip a s eth0 |awk 'NR==3'|awk '{print $2}'|awk -F'/' '{print $1}'
  • 优化一下: ip a s eth0 | awk 'NR==3' |awk -F'[ /]+' '{print $3}'
  • 再优化一下 ip a s eth0 | awk -F'[ /]+' 'NR==3{print $3}'
  1. stat /etc/hosts取出权限部分, 即0644

image.png

stat /etc/hosts | awk -F '[/(]' 'NR==4{print $2}'

  1. 如果系统swap使用超过0则输出"异常系统开始占用swap"

free |awk 'NR==3 && $3>0 {print "异常系统开始占用 swap"}'

  1. 过滤出/etc/passwd第4列的数字是以0或1开头的行,输出第1列,第3列,第4列

awk -F':' '$4 ~ /^[01]/' /etc/passwd

  • ~ 表示包含的意思
  • !~ 表示不包含

awk统计与计算

awk进行统计有2类案例:

  1. 类似于wc -l统计次数.
  2. 进行求和、累加

如果仅仅需要统计出现了多少次, 出现了多少个,可以使用wc -l 方式。

awk '{i=i+1} END{print i}' /etc/passwd

关于这个命令可以看一下前面awk的运行流程图

假设我们使用seq 10生成了10个数,那么怎样使用awk求和?

seq 10 | awk '{i=i+$1}END{print i}'

注: 四剑客的强大之处在于使用正则表达式,实现更复杂的需求。linux的正则表达式与其他语言如JavaScript、Java 中的正则表达式没有多少区别,这里我偷懒,就不介绍正则表达式了。

文件属性体系

ls -lhi

inode与block部分

  • inode索引节点,inode号码类似于身份证号码
  • inode是一个空间,inode号是空间的位置,类似于身份证,inode空间存放:
    • inode空间中存放的是文件属性信息、文件大小、修改、时间、权限、所有者
    • inode空间中存放block的位置(指向文件实体的指针)
    • 这里不存放文件名.(文件名是存放在目录的block中的)
  • block块(数据块): 存放数据

用户访问查看aa.txt文件内容的流程:

  1. 用户访问aa.txt的时候,系统会找出他对应的inode空间(根据inode号码)。
  2. 访问来到inode空间后,确认用户,确认权限。
  3. 权限信息正确就准许通过,可以访问inode对应的 block区域(数据)。

inodeblock特点

  • inode索引节点,存放文件属性信息,block位置。
  • 每创建1个非空文件至少占用1个inode,1个block,一般文件都要有1个inode
  • 1个block默认是4k。
  • inode,block数量是在格式化的时候创建的。
  • 正常情况下block的使用会更快.
  • 创建小文件不足4k,1个block还有剩余空间,无法给其他文件使用.
  • 创建文件大于4k,占用多个block

如何查看

  • 查看block的使用情况命令:(平时说的磁盘空间) df -h 磁盘空间使用情况
  • 查看inode的使用情况命令: df -i

:::tip{title=windowslinux文件类型区别}

  • windows下面通过 扩展名的区分不同文件类型,如果扩展名修改则无法使用.
  • Linux下面扩展名仅仅用于展示,随意修改。但是推荐保留扩展名 :::

Linux文件类型

  • - 文件 file,范围较广
  • d 目录 directory
  • l 软连接,类似于windows快捷方式
  • c 字符设备 char 特殊文件,不断输出,吸入
  • b 块设备 block 硬盘
  • s 套接字 socket文件
  • p 管道文件

可以通过file命令查看详细文件类型

  • text 普通文件(文本文件),我们日常可以查看或直接修改,平时书写就是这种,脚本
  • data 数据文件,需要用专用命令查看. 比如压缩包
  • 二进制文件 大部分都是命令

软硬链接

  • 软链接: 类似于windows中快捷方式,也是一种文件;用于存放源 文件的路径(位置+名字),应用最多.
  • 硬链接: 在同一个分区中,不同的文件的inode号码相同了,这些 文件互为硬链接,很少使用

如何创建

  • ln -s 源文件 软连接文件
  • ln 源文件 硬连接文件

异同

  • 删除软连接、硬连接,源文件不受影响。
  • 删除源文件, 软连接无法使用, 红底白字闪烁.
  • 删除硬链接, 源文件, 软连接无影响.
  • 软连接 创建快捷方式,硬连接 防止文件误删

软连接还可以用来升级软件版本,比如升级nginx,这样即使改坏了,还可以通过删除重新创建软连接指向老版本

文件大小

查看文件大小

  • ls -l -h /etc/hosts
  • ls -l -h /etc/

查看目录大小 du -sh /etc/

  • -h 人类可读形式显示大小.
  • -s 不要显示目录中所有的子目录了,只显示汇总信息,不显示所有 查看指定目录所占的空间.(block)

时间

  • mtime modify 修改时间,最常用
  • atime access 访问时间 (文件变化后,你第一次看的时间)
  • ctime change 文件属性的变化时间

stat 查看文件的属性信息+文件名

打包三剑客

targzipzip/unzip 合称打包三剑客

tar命令

  • 创建 tar zcf 压缩包 被压缩的文件/目录 ....
  • 查看 tar tf /tmp/etc.tar.gz
  • 解压 tar xf /tmp/etc.tar.gz tar xf 压缩包 -C 解压后的存放目录

tar 命令选项

  • v verbose 显示过程(未来不加)
  • c create 创建包(打包),如果只放cf选项就是打包,不压缩。
  • z gzip   tar命令创建包后,通过gzip压缩工具进行压缩。
    • z 使用gzip进行压缩,压缩包以.tar.gz结尾
    • j 使用bzip2进行压缩,压缩包以.tar.bz2结尾
    • J 使用xz进行压缩,压缩包以.tar.xz结尾
  • f file   指定压缩包,f选项放在这几个选项的最后

使用tar 命令时, 建议使用相对路径打包

gzip

  • 压缩 gzip aa.txt
  • 解压 gzip -d aa.txt.gz

zip/unzip

tar无法处理.zip格式的压缩包

  • 压缩 zip  -r etc.zip /etc/
    • -r用于压缩目录
  • 解压 unzip etc.zip

scp

我们使用打包解压命令的时候通常需要上传文件到服务器或从服务器下载文件,这就需要scp命令

scp 本地与服务器传送

  1. scp local_file remote_username@remote_ip:remote_folder # 将本地文件上传到服务器
  2. scp remote_username@remote_ip:remote_folder local_file # 从服务器下载文件到本地

可以通过 -P选项 指定端口 scp -P 端口 local_file remote_username@remote_ip:remote_folder

alias别名

别名就是给命令另起一个名称,方便使用。

ll 就是 ls -l color=auto的别名

  • alias #查看所有别名
  • alias ll #查看ll别名对应的命令
  • unalias 取消别名

应用场景

  • 给常用命令设置个快捷方式,使用简单方便
  • 还可以给危险命令加上的防护措施

别名的案例

  1. 只要运行rm就提示 rm is dangerous,pls use mv
  • alias rm='echo rm command is not found'

如果真的想删除文件

  1. 使用命令绝对路径 /bin/rm file
  2. 使用撬棍(反斜线) \rm file

alias只对当前窗口,如果想永久生效,需修改配置文件

  1. ~/.bashrc(当前用户生效)
  2. /etc/profile(全局)

增加内容alias rm='echo rm command is not found'

还需要执行命令 alias rm='echo rm command is not found' 让配置生效。

用户管理

Linux中的用户是有一个标记,类似于身份号码一样的东西,叫做 UID和GID. 一般情况下UID和GID要唯一。

  • UID user id 用户的id号,身份证号码.
  • GID group id 用户组id号,户口本号码.

UID有一些特点

用户分类分类方法
rootuid是0
普通用户uid1000(Centos7之后)(原来的系统Centos5,Centos6 500), 手动创建, 无法对系统进行更改, 只能在当前家目录和/tmp目录有权限.
虚拟用户uid <1000, 也叫傀儡用户 用于服务,进程运行使用的用户,无法直接使用

Linux下面每创建1个用户,一般会影响下面几个文件。

  • /etc/passwd 存放用户信息
  • /etc/shadow 存放密码信息
  • /etc/group  用户组信息
  • /etc/gshadow 用户组密码信息,几乎不会给用户组设置密码。

注:普通用户 只能操作 自己的家目录和 /tmp目录

image.png

可以通过命令解释器区分用户类型

  • 普通用户的命令解释器是 sh bash
  • 虚拟用户的命令解释器是 sbin/nologin

用户管理指令

  1. useradd 创建用户
    • -u 指定用户uid
    • -s 指定命令解释器,默认是/bin/bash
    • -M 不创建家目录
    • -s-M通常一起使用 示例:sudo useradd -u 1315 -s /sbin/nologin -M mysql2

image.png

注: ubuntu系统推荐使用 adduser,使用useradd会有一些问题(不会创建家目录)

  1. passwd 修改密码
  • sudu -i 先切到root用户
  • useradd staff1
  • passwd staff1
    • image.png
    • image.png
    • --stdin 非交互式设置密码
      • 批量修改密码 echo 1 |passwd --stdin staff

切换用户 su switch user

  • su - staff1 切换到staff1用户
  • - -l -login 是 su的选项
  1. 删除用户 userdel
  • userdel mysql 删除mysql用户
  • userdel -r staff1 删除staff1用户包含家目录

注: ubuntu系统使用deluser命令

但是不建议使用userdel命令,而是通过修改/etc/passwd文件注释该用户,达到删除的效果。

  1. 修改用户信息 usermod

image.png

示例

  • usermod -G root staffstaff用户属于staff组和root
  • usermod -G '' staffstaff用户从root组删除
  1. 查看
  • id 查询用户的uid,gid,用户组信息,检查用户是否存在
  • whoami 查询当前用户的名字
  • w 查看当前登录的用户的信息
  • last 用户的登录情况.
  • lastlog 所有用户最近1次登录情况.

image.png

  1. 用户组命令groupadd

指定用户的uid和gid的时候可以用下groupadd

  • 创建组指定gid groupadd -g 1315 teacher
  • 创建用户指定uid与用户组 useradd -u 1315 -g zs -s /sbin/nologin -M teacher

补充一个故障案例 命令行 -bash-4.2$

这是因为用户家目录没有,用户家目录下面的配置文件没了 ~/.bashrc~/.bash_profile文件

用户家目录是在创建用户的时候创建的,它是从/etc/skel的模版复制而来

可以通过cp /etc/skel/.bash* ~ + 重新登录解决

sudo权限管理

sudo概述: 用于给普通用户配置的命令,配置了sudo权限后普通可以以root权限运行命令。

Linux 系统 root权限太大,普通用户(如开发人员查日志)不能给root权限,我们需要针对普通用户授予一些命令的权限,如 cathead/tailmore/lessgrep

本案例以ubuntu系统为例

  1. 以root登录后执行以下命令
  2. adduser staff4
  3. visudo 背后就是 vi /etc/sudoers 增加一行代码staff4 ALL=(ALL:ALL) /bin/cat, /bin/head, /bin/tail, /bin/grep

image.png

  1. 使用staff4账号登录验证

image.png

前面提过普通用户(staff4)只能查看编辑自身家目录和/tmp目录(不能查看修改root目录), 由于cat加白了,所以staff4能使用cat用户查看root目录下的文件,而more命令就不行。这就达到了权限控制

visudo 背后就是 vi /etc/sudoers

当然还有一些方案

  • 搭建一个日志平台给开发用
  • 搭建一个堡垒机

堡垒机

  • 跳板机:简单的跳板工具.
  • 堡垒机:跳板工具+审计功能.

其实他们两不用严格区分可以当成一回事

堡垒机产品

  • 开源软件 Jumpserver, Teleport
  • 物理硬件设备
  • 云服务

堡垒机的作用是 屏蔽开发直接ssh连接服务器
而是通过ssh连接堡垒机,堡垒机上安装了Teleport软件,并配置好账号,这样就可以间接操作服务器了
好处是开发者的任何才做都被记录下来(有回放功能)
这样就很大程度缓解因操作失误或黑客攻击带来的损失(就好比定位到bug原因,解决bug就快了)

关于Teleport安装和使用有机会再说

权限管理体系

  • Linux通过rwx3种权限控制系统与保护系统,组成9位权限.
  • Linux权限体系中还有3位特殊权限,组合起来就是12位权限体系.
  • Linux这简单的rwx控制整个Linux系统的安全,权限与用户共同组成Linux系统的安全防护体系.

权限计算

rwx是什么?

  • r read 是否可读
  • w write 是否可写
  • x execute 是否可执行(一般是命令,脚本)

何为9位权限?

  • 所有者      这个文件或目录属于某个用户(所有者)。你自己
  • 用户组(家庭)  这个文件或目录属于某个用户组(家庭)。家人。
  • 其他人(陌生人) 这个文件或目录不属于某个用户 也不属于这个用户组。隔壁老王。

image.png

  • 前三位 文件所有者权限
  • 中间三位 用户组权限
  • 后面三位 其他人权限
  • 第三列的两个root
    • 第一个root表示用户
    • 第二个root表示用户组

9位权限与用户关系

  • 确定当前是什么用户
  • 确认用户与文件关系.(所有者,用户组,其他人)
  • 根据关系获取对应的权限.

如何计算权限?

为了更加方便的使用权限,于是给每个权限字母设置了一个对应的数字,通过数字表示对应的权限。

image.png

sh
-rw-rr.  1 root root    0 7月  18 08:53 aa.txt 420400400 6  4  4 aa.txt的权限是644 字母 数字 -rwxr-xr-x 755   -rrr 444   -rrw-rw- 466   数字 字母(文件) 644   -rw-rr 750   -rwxr-x 700   -rwx------ 600   -rw-------

修改权限

  • chmod命令: change mode 使用数字或字母形式修改权限。
  • chown命令: change owner 修改文件所有者,用户组。
sh
#修改aa.txt的权限为755. chmod 755 aa.txt #修改aa.txt所有者和用户组为staff4(存在)。 chown staff4.staff4 staff4.txt

image.png

chmod基于字符形式的权限设置

  • u user 所有者
  • g group 用户组
  • o other 其他人
  • aallugo 同时修改

案例

  • chmod u+rw aa.txt  给aa.txt的文件所有者增加读和写权限
  • chmod u=rx aa.txt  给aa.txt的文件所有者设置读和执行权
  • chmod u-w,g+r aa.txt 给aa.txt的文件所有者删除写权限,用户组增加读权限

案例:给/etc/rc.d/rc.local(所有用户)增加执行权限。

sh
chmod u+x,g+x,o+x /etc/rc.d/rc.local chmod ugo+x /etc/rc.d/rc.local chmod a+x /etc/rc.d/rc.local chmod +x /etc/rc.d/rc.local # 以上四种方式等效

权限与文件目录

权限文件目录(教室)
r是否可以读取文件内容(r)是否可以查看目录内容,需要x权限配合(rx)
w是否可以修改文件内容,一般还需要r权限配合(rw)是否可以在目录中创建,删除,重命名文件权限,需要x权限配合 (rwx)
x是否可以执行文件,(命令,脚本),一般还需要r权限配合(rwxrx)是否可以进入目录,是否可以访问目录下文件属性(rxrwx)

这块内容建议读者亲自试试看, 你会发现一些意外。比如

  1. 对一个只写的文件进行vi操作
  2. 目录只读 ll 一下

注意:不要使用root账号测试(root是皇帝,无所不能)

目录小结论:

  • 目录的r权限需要x权限配合, 如果只有r目录下文件的属性信息无法查看提示 "?"

  • 对于目录x权限表示是否能够进入目录权限,是否能够查看与修改目录下文件的属性信息权限。

  • 目录的w权限表示在目录下面创建,删除,重命名文件,只有w还不够,需要rx配合

  • 实际应用建议:如果要对某个目录拥有“写”权限,则授予目录rwx即可。

Permission denied故障排查

image.png

分析权限拒绝的流程

  • 缕清用户与文件/目录权限关系,你要知晓你对于这个文件或目录拥有什么权限?
  • 分析缺少了什么权限导致的问题? 根据操作分析是与文件的权限有关,还是目录的权限有关?
  • 得出结论,缺少了文件xxxx权限,目录的xxxx权限导致的故障.
日常操作需要的权限
查看文件的内容文件要有r权限
编辑或修改文件内容文件要有rw权限
执行脚本/命令文件需要有rx权限
查看目录内容目录要有rx权限
创建文件,删除文件文件所在目录要有rwx权限
重命名文件所在目录要有rwx权限

系统默认权限(了解)

Linux系统通过umask命令控制文件和目录的默认权限.

linux系统默认权限的生成规则

文件默认: 666
目录默认: 777

  1. 创建一个目录,该目录的默认权限 = 777-umask
  2. 创建一个文件,该文件的默认权限 xyz= 666-umask
    • 如果xyz有奇数位,则这一位上+1

举个例子

sh
umask为022时 文件默认权限:   666 -  022 -------   644 目录默认权限:   777 -  022 -------   755 umask 012 文件默认权限:   666 -  012 -------   654 +1   664 目录默认权限:   777 -  012 ------- 765

权限控制与系统安全(了解)

  • 通过权限控制让系统安全:
    • 最小化原则:既要保证网站可以正常访问,也要保证网站安全.
  • 推荐的网站的权限配置为:
    • 文件 644 root root
    • 目录 755 root root
  • 网站在运行的时候需要用户:这个用户不推荐是root,推荐自己/自动创建虚拟用户www/nginx.

单台机器

网站运行的时候是www用户,网站程序代码/app/code/www 目录,如何设置权限

sh
#1 . /app/code/www 目录 文件和目录所有者 root root (查看权限) 文件和目录权限   644 755 #2. /app/code/www/upload 上传目录 文件和目录所有者 www www  #如果不修改,则用户无法上传文件到upload目录下面(touch upload/lidao.avi). 文件和目录权限   644 755 #3. 控制用户上传指定类型的文件 #4. 只能上传,不能执行

3个特殊权限(了解)

通过ls -l -d /bin/passwd /tmp /bin/ssh-agent /bin/ls命令发现一些特殊的权限

image.png

其实在9位权限之前还有三位特殊的权限

  1. /bin/passwd 文件在u的位置上有个sS对应的权限数字是4
  • 运行这个命令的时候相当于是这个命令的所有者的权限.
  • 这样的话普通用户就可以passwd命令,但是普通用户仍旧改不了别人的密码,因为开发者在脚本里面限制了
  • image.png
  • sS的区别 有执行权限是S,没有执行权限是s

2./tmp/目录的粘滞位 sticky 目录的o的位置上又个t 对应权限数字1

  • 这样每个用户都可以查看/tmp/目录下的内容和创建文件,但是不能修改别人的文件
  1. 文件的g位置上又个s或S,对应数字2,
    • 运行这个命令的时候相当于是这个命令的用户组的权限

除了ls -l还可以通过stat 命令查看文件或目录权限

Linux特殊属性(了解)

目的: 预防重要文件或命令被修改.

  • lsattr 查看这种特殊属性
  • chatrr 修改这种特殊属性

两个特殊属性

  • a属性 append 只能追加,无法删除,无法修改,无法移动
    • 用途 修改配置文件
  • i属性 immutable 不朽的,无法被毁灭的.

示例:

  1. chatrr +a aa.shaa.sh 增加 a属性
  2. lsattr aa.sh 查看 aa.sh 的特殊属性

比如有个病毒入侵进来了,它会想方设法不被你删除,而且被你删除了还能重生

不被删除---对该文件添加 i 属性

重生 --- 修改ls命令,背后偷偷创建文件

本文作者:郭郭同学

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!