写在开头的话:本文是本人对自我学习Linux过程中的总结笔记,纯属原创。原创不易,请勿随意转载。
java:1995 SUN公司
unix:1969 AT&T的贝尔实验室
linux:1991
linux之父:李纳斯·托尔兹(Linus Torvalds)
1.常用命令
- uname -a:详细显示内核版本
- uname -r: 简单显示内核版本
- ulimit -a:查看内核相关的限制参数
- cat /etc/issue:查看系统版本
- echo $SHELL:查看默认的shell是那种
- cat /etc/shells:查看系统里有多少种shell可以使用
- free -m:以M为单位显示内存的使用情况
- cat /proc/cpuinfo:查看cpu的信息
- cat /proc/meminfo:查看内存信息
- echo $$:查看当前shell的进程号
- ps aux:查看当前系统进程信息,aux 是选项,ax显示所有的进程
- bash:执行一个bash程序–》开启一个shell
- env:查看系统里的环境变量
- set:查看系统里的变量(环境变量和自定义变量)
- lsof -i:80 查看80端口被谁占用
- who:登录的终端号
- w:查看当前系统有多少用户登录,并且正在使用的命令
- uptime:查看系统开机了多长时间了
- top:查看进程占用率
- free:查看内存使用率
- 语言的扩展:
# LANG=en_US.UTF-8
修改语言编码为美式英语编码 US 代表美国 United States
# LANG=zh_CN.UTF-8
修改语言编码为简体中文 zh 中国 CN china
# LANG=zh_TW.UTF-8
修改语言编码为繁体中文 zh 中国 TW 台湾
修改下面的文件里的编码,可以更改语言
# vim /etc/sysconfig/i18n
# cat /etc/sysconfig/i18n
LANG="zh_CN.UTF-8"
2 主机名
hostname liupeng 更改主机名为liupeng(临时)
hostname 查看主机名
法①
- 进setup里改–网络配置–dns配置–主机名 (永久)
法②
vim /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=liupeng
3 用户
- useradd lp 新建普通用户lp
- su - root 切换root用户
- su - lp 切换用户lp登录系统
- exit 注销系统/退出当前普通用户
关于ip
- ip add 查看当前使用的IP地址
- ifconfig eth0 172.16.70.125 把eth0网卡临时设置成此IP
4 命令行编辑的几个辅助操作
- Tab键:自动补齐
- Ctrl+C:终止当前进程
- Ctrl+D: 输入结束
- Ctrl+L:清屏
- Ctrl+K:删除从光标到行末所有字符
- Ctrl+U:删除从光标处到行首的字符
5 文件系统基本命令
根下面的文件结构:
根目录下文件夹的作用:
- /boot 存放系统的引导文件—》相当于windows里的c盘
- /root 是root用户的家目录(一登录系统所在的文件夹)
- /home 是普通用户的家目录
- /etc 是存放配置文件(重要文件)
- /dev 是存放设备文本 device
- /bin 是存放可执行文件(系统里的命令)binary二进制文件
- /sbin 是有重要权限的用户可以使用的命令存放的位置(超级用户使用的命令存放的位置,这样命令比较重要)—-》御用 super user binary
- /usr 是linux下存放安装程序的目录 —》windows里的program files,unix system resource —》unix系统资源
- /tmp 是存放临时文件的目录,任何用户都可以使用 temporary
- /var 是存放可以变化的文件的目录。variable
- /lib 是存放系统的库文件 library
- /proc 是存放进程信息的(内核的信息也存放在此)
5.1 家目录和根目录
- 根目录:/ 所有的文件和文件夹都在根目录下
- 家目录:用户登录系统的时候进入的目录,不同的用户家目录的路径不一样
5.2 常规操作
- 目录操作命令
- pwd、cd、ls、mkdir、du
- 文件操作命令
- touch、file、cp、rm、mv、ln
查找命令
- which、whereis、locate、find
文件内容操作命令
- cat、more、less、head、tail
- 归档及压缩命令
- zip、gzip、bzip2、zcat、bzat、tar
5.2.1 常规目录操作
- pwd 显示当前所在路径
- cd 进入文件夹
- . 当前目录
- .. 上一级目录
- ~ 用户主目录
- - 上个工作目录
- mkdir 新建文件夹
- -p 没有父目录时,自动创建父目录,不报错
- ls
- 用途:列表(List)显示目录内容
- 格式:ls [选项]… [目录或文件名]
- -a 显示所有文件和文件夹(包括隐藏文件)
- -l 长格式(详细信息,文件名,大小,时间,权限等)
- -h 以人能看懂的方式呈现,例K、M、G human-readable
- -d 显示目录本身的属性 directory
- -t 按文件修改时间进行排序 time
- -r 将目录的内容清单以英文字母顺序的逆序显示
- -A 类似于“-a”,但不显示“.”和“..”目录的信息
- -R 递归显示内容 recursive
例子:
# ls -l
total 16
d rwxr-xr-x 4 root root 4096 Sep 23 19:23 xiaodeng
文件类型 权限 链接数 用户 组 大小 创建时间 文件名
- - :代表是普通的文件 d 代表目录
- rw-r–r– :代表权限 read write execute(执行)
- 4:文件的链接数
- 第一个root 这个文件是属于那个用户的
- 第二个root 这个文件是属于那个组的
- 文件类型:
- 常规文件 -
- 目录 d (directory)
- 符号链接 l (link) —-快捷方式
- 字符设备节点 c(character)
- 块设备节点 b(block) –磁盘设备
5.2.2 常规文件操作
- du(统计目录及文件的空间占用情况)
- 格式:du [选项]… [目录或文件名]
- -a 统计时包括所有的文件,而不仅仅只统计目录
- -h 以更易读的字节单位(K、M等)显示信息
- -s 只统计每个参数所占用空间总的大小
- touch 文件不存在时,新建空文件;文件存在时,更改文件时间
- cp 复制
- -r: 递归复制整个目录树
- -a: 复制时保留链接、文件属性,并递归地复制目录
- -i: 实现人机交互
- -p: 连同档案的属性一起复制过去,而非使用预设属性
- mv:
- 移动(Move)文件或目录。若如果目标位置与源位置相同,则相当于改名。
- file查看文件类型
- 格式: file 文件名…
- rm删除文件或目录
- 格式:rm [选项]… 文件或目录
- -f:强行删除文件或目录,不进行提醒
- -r:递归删除整个目录树
- awk 截取命令
awk '$1>4096000{print "name is "$0""}'
查看根目录下所有大于4G的文件(单位默认为K)
awk :
- 是一个截取命令,可以根据某些条件进行判断,截取自己想要的内容。
- $1 代表第一个字段,$2代表第二个字段 ……
- $0 代表整行
print 是输出命令
ln命令
- 链接文件=windows里的快捷方式
- -s 作用:创建一个类似于windows里的快捷方式
# ln -s liupeng pengpeng
源文件 目标文件
# pwd -P 显示目标文件所在的真正的路径
5.2.3 文件内容查看命令
- cat:显示出文件的全部内容
- 格式:cat -n 文件名
tac:从最后一行倒着显示出文件的全部内容
more:全屏方式分页显示文件内容
- 交互操作方法:
- 按Enter键向下逐行滚动
- 按空格键向下翻一屏、按b键向上翻一屏
- 按q键退出
- 交互操作方法:
less:全屏方式分页显示文件内容,但扩展功能更多
- 交互操作方法:
- 与more命令基本类似,但个别操作会有些出入
- 【page down】【page up】上翻下翻页
- 交互操作方法:
tail
- tail -n +3 /etc/passwd 从第三行开始显示
- tail -n -3 /etc/passwd 显示最后三行
- head
- head -n -3 /etc/passwd 不显示最后三行
- head -n +3 /etc/passwd 显示前三行
- sed:对文本文件进行处理的命令
- # cat -n messages |sed -n ‘1,3p’ 显示1到3行
- # cat -n messages |sed -n ‘1p;3p;5p’ 显示第1行、第3行、第5行,p输出相关的内容到屏幕上(print)
5.2.4 文件查找
- [ -d /LP ] :查找根目录下的LP文件夹
- which (查不到shell内部命令,比如cd命令)
- 用途:查找可执行文件并显示所在的位置,搜索范围由 PATH 环境变量指定;
- 格式:which 命令或程序名
- whereis:查找文件的路径、该文件的帮助文件路径,原理和which类似
- 格式:whereis 命令或程序名
- locate命令
- 格式:locate 文件名
- 根据每天更新的数据库(/var/lib/mlocate)查找,速度块,不能找到自己新建的文件但会找到已经删除的文件,手动更新数据库updatedb。
- find命令:用于查找文件或目录
- 格式:find [查找范围] [查找条件] [动作]
- 常用查找条件
- -name: 按文件名称查找
- -size: 按文件大小查找
- -user: 按文件属主查找
- -type: 按文件类型查找
- -perm: 按文件权限查找
- -mtime: 按文件更改时间查找
- -newer: 按比某个文件更新的查找
- 特殊查找条件
- -o :逻辑或,只要所给的条件中有一个满足,寻找条件就算满足
- -not :逻辑非,在命令中可用“!”表示。该运算符表示查找不满足所给条件的文件
- -a:逻辑与,系统默认是与,可不加,表示只有当所给的条件都满足时,寻找条件才算满足。
- -type 类型
- f:(file) 普通文件
- d:(directory) 目录(文件夹)
- c:字符设备(character)
- b:块设备 (block)
- l:(link) 链接文件
- p:管道 pipe
- find高级用法
例子:
# find /boot -size +1024k -o -name “vmlinuz*”
在/boot下查找大小大于1024K或者名为vmlinuz开头的文件或目录。
# find /home -user hello -exec ls -ld {} \;
在/home下查找属于hello用户的文件或目录,并且显示出来
常用动作
- -exec:将find查找的结果交给-exec后面的命令执行
-ok:比-exec动作多了一个确认
例:
find /home -user hello -exec ls -ld {} \;
- find /usr -mtime 4 表示4天前那一天
- find /usr -mtime -4 表示4天内
- find /usr -mtime +4 表示4天前
5.2.5 文件压缩
- zip:制作 .zip格式压缩文件
- 格式:zip 压缩文件名 文件1 文件2
unzip [-l] 文件名
gzip:制作 .gz格式压缩文件、解开.gz压缩文件
- 格式:gzip [-9] 文件名…
- 常用命令选项:
- -9:表示高压缩比,取值1-9,默认为6
- -d:用于解压缩文件,同gunzip命令
- -c:将输出重定向到标准输出
gunzip:对.gz格式压缩文件进行解压缩
- 格式:gunzip hosts.gz
zcat:不解压查看压缩文件内容
- 格式:zcat 压缩文件名
- bzip2:制作 .bz2 格式的压缩文件、解开压缩文件
- 格式:bzip2 [-9] 文件名…
- 常用命令选项:
- -9:表示高压缩比,取值1-9,默认为6
- -d:用于解压缩文件,同bunzip2命令
- -c:将输出重定向到标准输出
- 常用命令选项:
- 格式:bzip2 [-9] 文件名…
- bzcat:查看 .bz2 格式压缩文件内容
- 格式:bzcat 压缩文件名
小总结:
- zip:另外新建一个压缩文件,不在源文件上操作
- gzip:直接在源文件上操作压缩
- bzip2:直接在源文件上操作压缩
三个命令都只能对文件进行压缩,不能对文件夹进行压缩!
5.2.6 文件归档
- tar(☆☆☆☆☆)
- 用途:制作归档文件、释放归档文件
- 格式:
- tar [选项]… 归档文件名 源文件或目录
- tar [选项]… 归档文件名 [-C 目标目录]
- 常用命令选项:
- -c:创建 .tar 格式的包文件
- -x:解开.tar格式的包文件
- -v:输出详细信息
- -f:表示使用归档文件
- -t:列表查看包内的文件
- -p:保持原文件的原来属性
- -P:保持原文件的绝对路径
- -r :添加文件到已压缩的文件
- -u:添加改变了和现有的文件到已经存在的压缩文件
- -A:新建压缩文件到已存在的压缩文件–》合并多个压缩文件
- -C:建包或解包时进入指定的目标文件夹
- -z:调用gzip程序进行压缩或解压
- -j:调用bzip2程序进行压缩或解压
- 常用:
- cjvf —>.tar.bz2
- czvf —>.tar.gz
- cJvf —>.tar.xz
注意事项
- 一定要注意绝对路径和相对路径问题,推荐使用相对路径。
- 使用z或j压缩的文件,解压缩的时候不需要加上z或j,tar直接可以识别。
- tar对目录和文件都可以进行操作,gzip和bzip2只能对文件进行操作。
压缩对比例子:
# ll
总用量 336
-rw-r--r-- 1 root root 326 12月 17 08:19 hosts
-rw------- 1 root root 229215 12月 17 08:11 messages
-rw-r--r-- 1 root root 30276 12月 17 08:19 messages_passwd.tar.gz
-rw-r--r-- 1 root root 18382 12月 17 08:25 messages.tar.bz2
-rw-r--r-- 1 root root 28829 12月 17 08:24 messages.tar.gz
-rw-r--r-- 1 root root 15156 12月 17 08:25 messages.tar.xz
-rw-r--r-- 1 root root 3242 12月 17 08:11 passwd
-rw-r--r-- 1 root root 1256 12月 17 08:22 passwd.tar.gz
可以得到结论,当文件为200M左右时,压缩效果:xz 好于 bzip2 好于 gz
PS:
- xf 可以解压.tar.gz .tar.bz2 .tar.xz 的压缩包;
- 解压文件的时候,解压出来的文件默认情况下放在当前目录,如果当前目录下有相同的文件,后来解压出来的文件会替换原来的文件。
# tar xf messages.tar.bz2
解压messages.tar.bz2文件,存放在当前目录下
# tar xvf messages.tar.bz2
messages
# tar xf messages.tar.bz2 -C /liuzhuang/
将当前目录下的messages.tar.bz2解压到/liuzhuang目录下备份
b_time=`date +%F-%H_%M_%S`
#获得当时的时间
tar czf /bak/$b_time-log.tar.gz /var/log
#备份/var/log到/bak
find /bak -mtime +7 -exec rm -rf {} \;
#删除7天前的文件
5.2.7 文本编辑器的使用
5.2.7.1 Linux中最常用的文本编辑器
vi:类Unix系统中默认的文本编辑器
vim:vi编辑器的增强版本,习惯上也称为vi
设置别名,以便执行vi时自动调用增强版编辑器
# alias vi='/usr/bin/vim'
# which vi
alias vi='/usr/bin/vim'
/usr/bin/vim
5.2.7.2 五种模式及其转换
5.2.7.3 插入的方法
- i:当前位置插入内容
- a:append,光标后退一格进入插入模式
- o:在光标所在行下,新起一行并进入插入模式
5.2.7.4 退出vim编辑器的方法
- :q 如果未对文件做改动则退出
- :q! 放弃保存并退出
- :wq 保存当前文件并退出
- :x 保存当前文件并退出
- :wq! 强制保存当前文件并退出
- :x! 强制保存当前文件并退出
- :w 保存
- :w 路径 —(另存为)
- :X 加密码
- ZZ 在命令模式下使用,退出并且保存
- 退出最好使用:wq
5.2.7.5 光标跳转
- 翻页
- Page Down或Ctrl+F:向下翻动一整页
- Page Up或Ctrl+B:向上翻动一整页
- 行内快速跳转
- Home键或者”^”、数字”0”:跳转至行首
- End键或”$”:跳转到行尾
- 行间快速跳转
- 1G或者gg:跳转到文件的首行
- G:跳转到文件的末尾行
- #G:跳转到文件中的第#行
光标扩展知识:
- :syntax enable 开启语法颜色显示效果
- :syntax off 关闭语法颜色显示效果
- :set hlsearch 开启查找文字的高亮效果 (high light)
- :set nohlsearch 关闭查找文字的高亮效果
- :set cursorline 显示下划线的效果(光标所在行)
- :set cursorcolumn 显示光标所在的列
5.2.7.6 删除、复制、粘贴
- 删除
- x或Del:删除光标处的单个字符
- dd:删除当前光标所在行
- #dd:删除从光标处开始的#行内容
- d^ :删除当前光标之前到行首的所有字符
- d$ :删除当前光标处到行尾的所有字符
- 复制
- yy:复制当前行整行的内容
- #yy:复制从光标处开始的#行内容
- 粘贴
- p:将内容粘贴到光标位置处之后
- P:粘贴到光标位置之前
文件内容查找:
操作键 | 功能 |
---|---|
/word | 从上而下在文件中查找字符串”word” |
?word | 从下而上在文件中查找字符串”word” |
n | 定位下一个匹配的被查找字符串 |
N | 定位上一个匹配的被查找字符串 |
5.2.7.7 撤销编辑
u 按一次取消最近的一次操作,多次按—》恢复已进行的多步操作
U 用于取消对当前行所做的所有编辑
5.2.7.8 重复操作
- 按.键
5.2.7.9 末行模式
- 末行模式下设置一个Tab键=4个空格
- :set ts=4(默认是八个)
- 文件内容替换:
命令 | 功能 |
---|---|
:s /old/new | 将当前行中查找到的第一个字符”old”串替换为”new” |
:s /old/new/g | 将当前行中查找到的所有字符串”old”全部替换成”new” |
:#,# s/old/new/g | 在行号”#,#”范围内替换所有字符串”old”为”new” |
:% s/old/new/g | 在整个文件范围内替换所有的字符串”old”为”new” |
:s /old/new/c | 在替换命令末尾加入c命令,将对每个替换动作提示用户进行确认 |
- 打开新文件或读入其他文件内容:
命令 | 功能 |
---|---|
:e ~/install.log | 打开新的文件进行编辑 |
:r /etc/filesystems | 在当前文件中读入其他文件内容 |
- 撤销和另存为:
命令 | 功能 |
---|---|
:e! | 撤销对文件的所有操作,重新开始 |
:w /tmp/hello.txt | 把当前文件另存为/tmp目录下的hello.txt文件 |
- 多文件操作:
- 格式:vi 文件1 文件2 文件3
命令 | 功能 |
---|---|
:n | 编辑下一个文件 |
:N | 编辑上一个文件 |
:files | 列出vim打开的文件名 |
- 行号显示:
命令 | 功能 |
---|---|
:set nu | 显示行号 |
:set nonu | 取消显示行号 |
5.2.7.10 可视模式
- 可视模式中的复制、删除:
命令 | 功能 |
---|---|
x | 剪切选中文本 |
y | 复制选中文本 |
r | 选中文本字符替换可一起替换其他字符 |
uU~ | 分别是选中字符变小写、变大写、反转大小写 |
5.3 文件目录高级操作
5.3.1 标准输入和标准输出
- 标准输入 0 键盘
- 标准输出 1 显示器
- 标准错误输出 2 显示器
5.3.2 重定向
# find / -user linghu -type f -size +1k 2>/dev/null
- > 正确的输出重定向。将在屏幕上的输出,重新转到别的地方。乾坤大挪移 ,如果后面接的文件不存在,会自动新建。如果存在,会覆盖原文件里的内容。
- >> 追加输出重定向。不覆盖原来的内容,只是在末尾追加进去。如果后面接的文件不存在,会自动新建。
- 2> 错误的输出重定向。前面命令执行不成功或者出错的信息,重新定向到别的地方。
- 2>> 追加错误的输出重定向。前面命令执行不成功或者出错的信息,重新定向到别的地方。不会覆盖原来文件里的内容。
- << 输入重定向
# cat >LP.txt <<EOF
(新建一个LP.txt文档,并且往里面写入内容,且以EOF结束)
> wangnan
> dezhou
> EOF
- /dev/null:过滤标准错误信息–》垃圾桶,任何信息重定向到这里都会没有,不保存—》黑洞
- /dev/zero:用来创建指定长度文件 –》创造大文件,里面啥也没有,全是0
- &> /dev/null 无论正确还是错误全部重定向到/dev/null(脚本里一般用此命令来清理多余的显示)
5.3.3 echo 输出命令
echo $u_name
输出u_name变量的值
两种语法效果相同
# echo -e "\e[31mi am cali\e[0m"
# echo -e "\033[31mi am cali\033[0m"
i am cali (带颜色的)
5.3.4 管道
连接左右两个命令,将左侧的命令的标准输出,作为右侧命令的标准输入。
格式:cmd1 | cmd2 [… | cmdn]
- 管道和标准错误:
find /etc –name “p*” | grep passwd
find /etc –name “p*” | grep passwd > /tmp/aa
find /etc –name “p*” | grep passwd 2> /tmp/aa
find /etc –name “p*” | grep passwd &> /tmp/aa
find /etc –name “p*” 2>/dev/null | grep passwd
5.3.5 xargs
- 用途:将参数列表转换成小块分段传递给其他命令。
5.3.6 seq
- 用途:打印出一串有序的数字
- 格式:seq [选项] 数字范围
- -s:指定分隔符
- -w:指定同等宽带输出
5.3.7 tr (☆☆☆☆☆)
字符转换工具。只能对stdin操作,不能直接对文件操作。
5.3.7.1 转换字符
- tr set1 set2
- 用set2中的字符替换掉set1中同一位置的字符。
- 例子:
- echo 123456 | tr 345 abc
- tr 123 abc < aa
- tr ‘[a-z]’ ‘[A-Z]’ < /etc/hosts
- tr ‘:’ ‘\n’
5.3.7.2 删除字符
- tr -d SET
- 将stdin中数据流删除与SET相同的字符
- echo 123456 | tr -d 345
- tr -d ‘[0-9]’ < /etc/hosts
- echo “Hello World” | tr -d ‘[a-z]’
5.3.7.3 压缩字符
- tr -s SET
- 将连续相同的字符压缩成一个字符
- echo 112233444555666 | tr -s 345
- tr -s SET1 SET2
- 先替换为SET2再压缩
- echo 112233444555666 | tr -s 345 abc
- echo 112233444555666 | tr 345 abc | tr -s abc
- tr -s ’ ’ ‘\t’
5.3.8 sort
- 默认按每行的第一个字符排序
- -n:按整数进行排序
- -r:递减排序
- 指定排序键:
- 指定按哪一列数据进行排序
- -k:指定哪一列为排序键
- cat tt | sort -n -k4
- 指定字段分隔符
- -t:指定字段分隔符,默认是空格
- sort -t: -n -k3 /etc/passwd
5.3.9 uniq(去重)
- sort -n tt | uniq
- 数据的实例统计:
- -c:统计特定记录出现的次数
- cat tt | uniq -c
- -u:只显示唯一的行
- cat tt | uniq -u
- -d:只显示重复的行
- cat tt | uniq -d
5.3.10 cut 数据提取
- cut命令
- 从文本文件或者文本流中提取文本列
- cut -选项 提取范围 文本文件
- 常见选项:
- -c:从指定提取范围中提取字段
- -f:从指定提取范围中提取字段
提取范围:
- n:第n项
- n-:第n项到行尾
- -m:行首到第m项
- n,m:第n项和第m项
- n-m:第n项到第m项
cut -c 命令例子:
- ls -l | cut -c10
- who | cut -c 20-40
- cut -c -10 /etc/passwd
- cut -f 命令例子:
- -d:指定分隔符默认是Tab
- cut -d “:” -f 1,7 /etc/passwd
- who | cut -d ’ ’ -f1,6
5.3.11 wc 统计
- wc(字数统计)命令
- 格式:wc [选项]… 目标文件…
- -l:统计行数
- -w:统计字数(前后都是空白的一组字符)
- -c:统计字符数(可见和不可见的字符)
[root@localhost~]# wc /etc/hosts
4 23 185 /etc/hosts
4行,23个单词,185个字节
5.3.12 diff 文本差异对比
diff命令
- 比较两个文件之间的差异
- 输出结果为两个文件的不同之处
- 比较两个文件之间的差异
diff命令的输出格式
- 标准diff
- -u:会将不同的地方放在一起,紧凑易读
- -r:递归比较目录下的所有文件
利用diff命令生成补丁
- diff -u test1 test2 > test.patch
diff—-》-uNr
- -u 统一的格式显示差异
- -N 2个目录进行对比的时候,如果有不存在的文件,diff就会使用一个空文件和对方存在的文件进行一行一行的对比,生成补丁
- -r 递归对比,因为文件夹下面还有文件,一级一级的对比,将所有的文件都对比一次。
5.3.13 patch打补丁
- patch命令:用来打补丁修补文件。
- 格式:patch [选项] 原始文件 < 补丁文件
- -pN:N表示忽略N层路径
- -R:还原到老版本
注意事项:
- 如果打多个补丁,要注意先后顺序;
- 打补丁前不要修改源文件。
patch命令对文件打补丁:
patch命令对目录打补丁:
5.3.14 grep 数据过滤
grep:通用正则表达式分析程序
- 用途:在文件中查找并显示包含指定字符串的行。
- 格式:grep [选项]… 模式 目标文件
- -i:查找时忽略大小写;
- -v:反转查找,输出与模式不相符的行;
- -l:仅显示符合模式要求的文件名;
- -n:显示符合模式要求的行号;
- -r:递归搜索所有文件。
模式:
- ^… 以什么开头
- …$ 以什么结尾
正则表达式:按照某种正常的规则组合起来的一个表达式,此表达式包含特殊字符+字符+数字等,用来表示一个特定的含义。
- 基本正则:特殊字符比较少
- 扩展正则:元字符比较多,新加入了一些进来
例:
# cat /etc/fstab |grep -E -v "^#|^$"
不显示以#开头的行或者空行
- -E :支持扩展正则表达式。egrep==grep -E ,效果一样;
- -o 将符合条件的一行一行的显示
5.4 硬链接和软连接
stat命令查看i-节点信息:
5.4.1 创建硬链接
- ln abc.txt 123.txt
- rm abc.txt
5.4.2 创建软连接
软链接:
- 符号链接,表面上和硬连接相似;
- 文件类型和权限肯定是lrwxrwxrwx;
- 命令格式:ln -s 源文件… 链接文件
硬链接和软链接比较
- 软链接:指向原始文件所在的路径;
- 硬链接:指向原始文件对应的数据存储位置;
- 不能为目录建立硬链接文件;
- 硬链接与原始文件必须位于同一分区(文件系统)中。
ln -s abc.txt 123.txt
- rm abc.txt
5.4.3 相对路径和绝对路径
- 相对路径:不从/开始的路径
- 绝对路径:从/开始的路径
5.5 用户和组
- 到底是用户先存在还是组先存在?
答:先有组再有用户!
每个账户有一个唯一的UID (user identifier)–>身份证;
- 每个组也有一个唯一的GID (group identifier) –》组织代码;
- 多个账户可以属于同一个组。
5.5.1 用户类型
- 判断用户是否存在的两种方法:
- ① id liupeng
- ② cat /etc/passwd | grep liupeng
- 远程和su两种方式切换用户的区别:
- 远程ssh方式登录系统,需要输入用户的密码
# ssh xiaoniu@127.0.0.1
---》使用xiaoniu这个用户登录本机127.0.0.1代表本地回环接口ip
xiaoniu@127.0.0.1's password:
$exit ---》退出登录
没有设置密码的用户也是不能登录系统的
# su - xiaoniu ---》本地直接切换用户登录系统,不需要密码,因为你是从管理员切换到xiaoniu的
$ exit
- 用户类型
- 超级用户:root(uid是0)
- 程序用户:
- 实现特定的功能(开启ftp服务、http服务、关机、mysql服务等),但是一般不能登录系统(uid在1-499之间);
- 价值所在:启动服务和访问服务
- 普通用户:
- 使用useradd命令新建的用户,一般uid从500开始,每新建一个用户,uid会自动加1。
5.5.2 几个重要文件
- /etc/passwd 用来存放用户帐号信息 passwd-
- /etc/shadow 用来存放密码信息 shadow-
- /etc/group 存放组信息的 group-
- /etc/login.defs 存放新建用户的时候的一些默认规则、属性(配置文件,相当于一个政策文件)default 默认、缺省。
- /etc/skel 存放新建用户的时候的一些样板文件
5.5.2.1 /etc/passwd(☆☆☆☆☆)
- 字段1:用户帐号的名称
- 字段2:用户密码字串或者密码占位符“x”
- 字段3:用户帐号—》UID号
- 字段4:用户所属基本组帐号—》GID号
- 字段5:用户注释说明
- 字段6:宿主目录(家目录)
- 字段7:登录Shell信息
# echo $SHELL
查看系统里默认的shell
# cat /etc/shells
查看系统里有多少种shell
/sbin/nologin
如果哪个用户的shell是此shell,那个用户是不能登录系统的
# sh 使用sh 这个shell
exit
退出shell
5.5.2.2 /etc/shadow 用来存放密码信息的(☆☆☆☆☆)
- 字段1:用户帐号的名称 *
- 字段2:加密的密码字串信息 *
- 字段3:上次修改密码的时间 以1970-1-1基准日期
- 字段4:密码的最短有效天数,默认值为0
- 字段6:提前多少天警告用户口令将过期,默认值为7
- 字段7:在密码过期之后多少天禁用此用户
- 字段8:帐号失效时间,默认值为空
- 字段9:保留字段(未使用)
- 每一行对应一个用户的密码记录!!
- !! 说明zhangwuji和xuzhu没有设置密码
- * 也是说明没有设置密码
- 如果密码字段前加入!! 就是禁用此用户。
- 禁用的用户是不能登录系统的。但是可以使用root用户su 方式切换过去
5.5.2.3 /etc/group
组账号:密码占位符:主要组:次要组:组成员
- 组帐号:
- 主要组(私有组) —》 与用户相关的默认组,在/etc/passwd文件的第四个字段定义;
- 次要组(附属组)—》用户可以同时属于其他的组,在/etc/group文件的第四个字段定义。
- 用户的主要组的名称和GID相关
5.5.2.4 /etc/skel/* (样板文件和目录)
- .bash_profile :用户每次登录时执行(全局变量);存放函数,别名,环境变量。
- .bashrc:存放系统函数、别名(负责别名):
- 用户登录系统以后,每次打开终端都会执行这个文件里的命令(run command)(全局变量);
- .bash_logout 每次系统注销的时候,会执行这个文件里的命令;
- .gnome2 是用来存放与图像界面相关程序文件信息的;
5.5.2.5 /etc/gshadow(保存组账号的密码信息)
(此文件的应用极少)
5.5.2.6 /etc/login.defs (配置文件/对账号的属性设置/设置普通用户的UID和GID范围等)
# cat /etc/login.defs |grep -v ^#|grep -v ^$
MAIL_DIR /var/spool/mail 用户的邮箱目录,邮箱名字与用户名同名
PASS_MAX_DAYS 99999 /etc/shadow文件里的内容已经在这里定义了
PASS_MIN_DAYS 0
PASS_WARN_AGE 7
UID_MIN 500 /etc/passwd文件UID已经安排了范围
UID_MAX 60000
GID_MIN 500
GID_MAX 60000
CREATE_HOME yes 默认情况下给用户新建家目录---》/home
UMASK 077
USERGROUPS_ENAB yes 删除组的时候,要求组里没有用户存在
ENCRYPT_METHOD SHA512 采用SHA512这种加密算法进行密码的加密
5.5.3 几个重要用户命令
5.5.3.1 useradd 创建用户
- 格式:useradd [选项]. .. 用户名
- 常用命令选项:
- -u:指定 UID 标记号
- -d:指定宿主目录,缺省为 /home/用户名
- -e:指定帐号失效时间
- -g:指定用户的基本组名(或UID号)(初始组) –》 主要组
- -G:指定用户的附加组名(或GID号) —》次要组
- -M:不为用户建立并初始化宿主目录(家目录)
- -s:指定用户的登录Shell
- -m, –create-home 创建家目录
- -c, –comment COMMENT 用户注释信息
- -r 新建一个系统用户 (uid 1-499)—》程序用户—》不建家目录,在系统里真正识别用户的是看用户的UID和GID。
- 新建的系统用户和-M选项建立的用户都没有家目录
- /var/spool/mail/ 邮箱的位置
useradd 在后台做了什么:
- 如何手动新建用户(得对passwd和shadow和group字段熟悉才行!)
- 答:修改/etc/passwd–》修改/etc/shadow–》修改/etc/group–》新建家目录–》从/etc/skel目录下复制配置文件(/etc/skel/.bash*)–》验证(# su - 用户名、pwd、id)
5.5.3.2 userdel 删除用户
- 添加 -r 选项时,连用户的宿主目录(家目录)一并删除
5.5.3.3 usermod 修改用户参数
- -l 更改登录名称
- -L 锁定用户账户
- -U 解锁账户(仅去掉一个叹号!)
- -u:修改 UID -d:修改宿主目录
- -e:修改帐号失效时间
- -g:修改用户的基本组名(或UID号)–》 主要组
- -G:修改用户的附加组名(或GID号)–》次要组
- -s:修改用户的登录Shell
eg:usermod -d /lianxi -u uid -s bash
5.5.3.4 passwd 管理密码
- 常用命令选项:
- -d:清空用户的密码,使之无需密码即可登录delete
- -l:锁定用户帐号 lock
- -S:查看用户帐号的状态(是否被锁定) status
- -u:解锁用户帐号unlock
- –stdin:接收标准输入作为密码
# echo 123 |passwd xiaoshimei --stdin
为xiaoshimei设置密码为123
- root用户可以修改所有用户密码,不要求密码复杂性;
- 普通用户只能改自己的密码,要求密码复杂性;
- 不接用户名,是给自己设置密码。
5.5.3.5 groupadd 添加组账号
# groupadd -g 1000 market
添加组账号market,GID为1000
# groupdel market
删除组账号market
5.5.3.6 groupmod 设置组名
- -n 修改组名
- -g 修改组id
# chmod +x hello.sh 授予可执行权限
# chmod -x hello.sh 取消可执行权限
- r 4 读
- w 2 写
- x 1 执行
0 没有权限
rw-r–r–
- 属主 属组 其他人
#chmod 777 bohu.txt
设置权限为777,任何人都有读写执行的权限
5.5.3.7 newgrp 改变有效组(主要组)
用户必须是要改变组的成员。类似,一个人有多重身份。
5.5.3.8 gpasswd
- -a 给用户添加一个附属组
- -d 给用户移除附属组
- -M 批量给用户添加到附属组
5.5.3.9 id和w
用户和组账户查询
- id 用户名
- w:查询已登录到主机的用户信息
5.5.3.10 history
查看最近1000条使用过的命令,只是查看当前用户的历史操作命令。
.bash_history
用来存放历史命令的,上一次注销前在系统里使用的命令,可以通过这个文件查看别的用户登录系统时,使用过的命令。只要别的用户一注销linux,系统就会把用户使用过的命令自动存到它的家目录下的 .bash_history为什么是只能存1000条?
- 答:/etc/profile —>HISTSIZE=1000 —>定义了系统里很多的环境变量。
打扫行踪,不让人家知道你使用过那些命令:
- history -c –》清除历史命令
- rm -rf /root/.bash_history
- 在/root/.bash_logout 文件里添加 history -c
- #!echo —》执行最近一条以echo开头的命令
5.5.3.11 TTY(终端)
TTY相当于正式工,而pts/0等相当于临时工。
6 PATH 环境变量
变量的类型:
- 环境变量
- 局部变量
- 全局变量
定义变量:为什么要使用变量?
答:方面使用,方便修改值。
- 全局变量和局部变量的区别:
eg:meinv=wucairen
自定义变量meinv为wucairen(自定义变量一般为局部变量)
export meinv
用export,输出meinv为全局变量
echo $meinv
则会输出 wucairen
- PATH 是linux系统里的一个环境变量,系统已经定义好了,我们不需要再定义。
- 作用:是linux里使用的命令都存在在PATH变量后面指定的目录下,我们使用命令的时候,bash会主动的到PATH变量的值对应的目录下查找,如果第1个目录里没有找到,就到第2个目录里找,如果都没有找到就报错,提醒用户没有这个命令,如果找到了,就执行这个命令。
# echo $PATH
/usr/lib64/qt3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
6.1 环境变量(一般都是全局变量)
- 如何理解环境变量?
- 将linux系统比喻成一个社会,里面的一些公共资源,例如空气、水、公交车、地铁、美食等都是变量,大家都使用。
环境变量也是全局变量,所有的程序都可以调用。系统里已经定义了,我们不需要自定义。
env 查看系统里的环境变量
- set 查看系统里的变量(环境变量和自定义变量)
- 自己定义的变量一般都是局部变量,其他shell里的程序不能调用,有范围的限制。
7 文件权限
重大失误操作:
- chmod -R +x / –》更改根目录下的所有文件的权限为可执行权限
- chmod -R 777 / –》没安全性可言了
- rm -rf / –》删除根下面的全部文件
怎么设置用户不能登录系统:
- ①可以在/etc/shadow文件里的密码字段前面添加!!可以禁用用户;
- ②或者修改/etc/passwd文件里用户的shell为/sbin/nologin
7.1 查看文件/目录权限及归属(ls -l)
- 访问权限:
- -r 可读(read):允许查看文件内容、显示目录列表
- -w 可写(write):允许修改文件内容,允许在目录中新建、移动、删除文件或子目录
- 目录归属(所有权)
- -u 文件拥有者(owner):拥有该文件或目录的用户帐号
- -g 属组(group):拥有该文件或目录的组帐号
- -o 其它人(others):除了属主和属组的其他人
7.2 设置权限
7.2.1 chmod
7.2.1.1 chmod 是用来修改权限
- u:user
- g:group
- o:others
- a:all
- + 是增加权限
- - 是去掉权限
- = 直接等于某些权限
- -R:递归修改指定目录下所有文件、子目录的权限
7.2.1.2 推荐 chmod 用数字改权限
chmod 777 1.txt --》给1.txt设置权限为读写可执行。
- root用户下默认新建文件的权限为644,新建目录的权限755
PS:但是在工作中,授权一般用 sudo 命令!
# vim /etc/sudoers
zhaomin ALL=/usr/sbin/useradd,/usr/sbin/userdel(授权zhaomin 能使用useradd 和userdel 命令)
su - zhaomin
$ sudo useradd zhangwuji123 使用授权去做事情,需要接sudo命令开头
7.2.2 默认权限
- 用户新建文件和目录的时候默认的权限。
- umask:修改默认权限
# umask 查看用户的权限掩码(用户新建文件和目录的时候默认的权限)
0022(组和其他人去掉写的权限)--》前面的0是特殊权限位
# umask -S 查看当前用户的权限设置
u=rwx,g=rx,o=rx
- ☆☆:文件的初始权限是666,文件夹的初始权限是777
- ①umask修改仅仅是临时的,重启失效;
- ②在 .bashrc里添加umask 022(永久有效,相当于设置权限为755)
7.3 chown 修改归属
- 格式:chown 属主:属组 文件/目录名(属主和属组已经存在)
- chown root:haha xixi —>将xixi设置为属主是root,属组是haha
- (chgrp基本用不到,其功能完全可以用chown代替)
7.4 文件或目录的隐藏属性
7.4.1 chattr命令:设置文件的隐藏属性
- 格式:chattr [+-=] [ai] 文件或目录
- 常用命令选项:
- -R:递归修改
- -a:可以增加文件内容,但不能修改和删除
- -i: 锁定保护文件
- lsattr命令: 查看文件的隐藏属性。
- 格式:lsattr [Rda] 文件或目录
- 常用命令选项:
- -R:递归修改
- -d: 查看目录
7.5 文件的特别权限
7.5.1 SET位权限
- 主要用途: 为可执行(有 x 权限的)文件设置,权限字符为“s”;
- 其他用户执行该文件时,将拥有属主或属组用户的权限;
- SET位权限类型:
- SUID:表示对属主用户增加SET位权限;
- SGID:表示对属组内的用户增加SET位权限。
7.5.2 粘滞位权限(Sticky)
- 主要用途:为公共目录(例如,权限为777的)设置,权限字符为“t”;
- 用户不能删除该目录中其他用户的文件。
7.5.3 设置SET位、粘滞位权限
- 使用权限字符
- chmod ug±s 可执行文件…
- chmod o±t 目录名…
- 使用权限数字:
- chmod mnnn 可执行文件…
- m为4时,对应SUID,2对应SGID,1对应粘滞位,可叠加
7.5.4 ACL的使用
ACL (Access Control List):
- 一个文件/目录的访问控制列表,可以针对任意指定的用户/组使用权限字符分配rwx权限。
- 设置ACL
- 格式: setfacl 选项 规则 文件
- 常用选项:
- -m:新增或修改ACL中的规则
- -b: 删除所有ACL规则
- -x: 删除指定的ACL规则
- 常用规则
- 格式:类型:特定的用户或组:权限
- user:(uid/name):(perms) 指定某位使用者的权限
- group:(gid/name):(perms) 指定某一群组的权限
- other::(perms) 指定其它使用者的权限
- mask::(perms) 设定有效的最大权限
- 简写为:u , g , o , m; perms使用rwx
- 例:
# setfacl -m u:liupeng:rwx taohuadao
对liupeng用户增加rwx权限
# setfacl -m u:qingshu:--- /guangmingding/
只对qingshu移除进入guangmingding的权限
注意:拒绝权限高于一切!!
针对特殊用户:
针对特定组:
针对mask设置有效权限:
查看ACL
- 格式:getfacl 文件
ACL类型:
- 存取型ACL(Access ACL):文件或目录
- 预设型ACL(Default ACL):只能对目录(可理解为世袭制!即在已设置预设ACL的文件夹下,新生成的文件夹默认属于上级的文件夹的所有者)
预设型ACL:
- 格式:setfacl –m d:类型:特定的用户或组:权限
设置了预设型ACL的目录,其下的所有文件或者子目录就都具有了主目录的ACL权限,并且子目录也同样有预设的ACl权限。
设置预设ACL: