Linux| 02系统操作| 常用命令
1. Linx系统下的文件管理(一切皆文件)
万能的帮助命令
- man 帮助
- man 是manual 的缩写
- man 帮助用法演示:# man ls (q建 退出)
- man 也是一条命令,分为9章,可以使用man命令获得man的帮助: #man 7 man
- (设置9章的目的是有的命令会重名比如 passwd,这时可用 man 1 paddwd ,man 5 paddwd,man -a passwd )
- help帮助
- shell(命令解释器)自带的命令称为内部命令,其他的是外部命令
- 内部命令(命令解释器内的命令)使用help帮助: #help cd
- 外部命令(命令解释器外的命令)使用help帮助:#ls --help
- info 帮助
- info帮助比help更详细,作为help的补充: #info ls
- 使用网络资源(搜索引擎和官方文档)
[root@Linux100 ~]# type cd
cd 是 shell 内嵌
[root@Linux100 ~]# type ls
ls 是 `ls --color=auto' 的别名
man
man -f <==> whatis 查看命令拥有哪个级别的帮助、
man -f <==> apropos 查看和命令相关的所有帮助
info help --help 如 ls --help
目录操作
更改当前的操作目录 cd shell内置命令
pwd 查询所在目录,所在路径/bin/pwd
- cd /path/to/... 绝对路径 - 从根目录进入
- cd ./path/to... 相对路径 - 从当前目录进入
- cd ../path/to/... 相对路径 - ../当前目录的上级目录
- cd - 上次所在目录
- cd ~ 家目录
- cd . 当前目录
- cd .. 上级目录
绝对路径:以根目录为参照物,从根目录开始,一级一级进入目录
相对路径:以当前目录作为参照物,进行目录查找
文件查看
- ls 查看当前目录下的文件
- [选项,选项...] 参数...
- 常用参数 # ls -lart
- -l 长格式显示文件(第五列为按字节为单位显示)
- -h 按习惯单位显示文件大小;du -b xxx 以字节显示文件大小; du -h xxx 以习惯单位显示文件大小;对一个目录执行du,du会递归列出目录中的所有文件,并显示其大小,同时也会显示目录中所有文件的大小。一个目录下所有文件占用空间的总大小,执行:du -sh *
- -a 显示隐藏文件
- -r 逆序显示 (文件名逆序显示)
- -t 按照时间顺序显示
- -R 递归显示
- -d 显示目录信息,而不是目录下的文件
- -i 显示文件的i 节点号
- --color=when when的默认值是always, 也可以是never、auto
-
wc
wc -c result.csv #以字符形式查询,一个字符一个字节
stat
stat result.csv
目录文件的创建与删除
创建目录
- mkdir 建立目录;
- 常用参数
- -p 建立多级目录
删除目录
- rmdir 删除空目录(递归删除目录)
- rm -r 删除非空目录
[root@Linux100 ~]# rm -r -f a/b/
[root@Linux100 ~]# rm -rf a/b/
文件操作
创建空文件或修改文件时间 touch, 所在路径/bin/touch
如touch 1.txt
复制文件cp
- cp 复制文件和目录
- cp[选项] 文件路径
- cp[选项] 文件... 路径
- 常用参数
- -v 带详细信息
- -r 递归复制
- -p 复制后目标文件保留源文件的属性(包括所有者、所属组、权限和时间)
- -a 等同于 -dpR (保留权限、属组、修改时间)
- -d 若源文件为软链接则复制后也是软链接
- -i 询问,如果目录文件存在是否覆盖
删除文件 rm
- 常用参数
- -r 递归删除(包括目录下的所有文件)
- -f 删除文件不进行提示(强制删除)
- -i 交互删除,删除之前会询问用户
- 注意:rm命令可以删除多个目录,需谨慎使用
移动文件 mv
- mv [选项] 源文件 目标文件
- mv [选项] 源文件 目录
- -f 强制覆盖
- -i 交互
- -v 显示详细信息
④ 通配符
定义:shell 内建的符号
用途:操作多个相似(有简单规律)的文件
常用通配符
- * 匹配任何字符串
- ? 匹配1个字符串
- [xsy] 匹配任意一个字符
- [a-z] 匹配一个范围
- [!xyz] 或 [^xyz] 不匹配
⑤文件内容查看
- cat 文本内容显示到终端
- head 查看文件开头(默认查看前10行,可加 -5 去限制行数)
- tail 查看文件结尾(默认查看前10行,可加 -5 去限制行数)
- 常用参数 -f 文件内容更新后,显示信息同步更新
- wc 统计文件内容信息
- -l 查看文件有多少行
- less 分行显示
- more 分行显示
stat 查看文件详细信息,且可以看到文件的三个时间。
stat test.txt
文件:"test.sh"
大小:1453 块:8 IO 块:4096 普通文件
设备:803h/2051dInode:33574991 硬链接:1
权限:(0600/-rw-------) Uid:( 0/ root) Gid:( 0/ root)
环境:system_u:object_r:admin_home_t:s0
最近访问:2018-11-06 23:22:23.409038121 +0800
最近更改:2018-10-24 00:53:08.760018638 +0800 #数据修改时间
最近改动:2018-10-24 00:53:08.760018638 +0800 #状态修改时间
创建时间:-
cat 查看文件内容,所在路径/bin/cat
cat -A test.sh 列出所有隐藏符号、
cat -E test.sh 列出每行结尾的回车符$、
cat -n test.sh 列出行号、
cat -T tst.sh 把Tab键用^I显示出来、
cat -v tst.sh 列出特殊字符
more 分屏显示文件,所在路径/bin/more
(空格键 向下翻页、b向上翻页、回车键向下滚动一行、/字符串 搜索指定字符串、 q:退出)
less 分行显示,所在路径/usr/bin/less, 跟more类似
head 显示文件开始,所在路径/usr/bin/head
head -10 test.txt -n行数 指从文件开始,显示指定行数;
head -v tst.txt 显示文件名;
tail 显示文件结尾,所在路径/usr/bin/tail
tail -5 test.txt -n 行数 指文件结尾开始,显示指定行数
tail -f test.txt 监听文件新增内容
ln 在文件之间建立连接 (ln [选项] 源文件 目标文件)
-s 建立软连接文件,不加则建立硬连接文件
-f强制 如果目标文件存在,则删除目标文件后建立链接文件
ln /root/cangls /tmp/ #建立硬链接文件,目标文件没有写文件名,会和原名一致
ln -s /root/bols /tmp/ #建立软链接文件
diff
diff 命令用于比较多个文本文件的差异,格式为:diff [参数] 文件。
常用参数如下:
使用-c参数来详细比较出多个文件的差异之处
使用--brief参数来确认两个文件是否不同
$ diff -c test1 test2
$ diff --brief test1 test2
文件 test1 和 test2 不同
软连接和硬链接的特征
硬链接特征:
- 源文件和硬链接文件拥有相同的Inode和Block
- 修改任意一个文件,另一个都改变
- 删除任意一个文件,另一位都能使用
- 硬链接标记不清,很难确认硬链接文件位置,不建议使用
- 硬链接不能链接目录
- 硬链接不能跨区
软链接特征:
- 软链接和源文件拥有不同的Inode和Block
- 两个文件修改任意一个,另一个都改变
- 删除软链接,源文件不受影响:删除源文件,软链接不能使用
- 软链接没有实际数据,只保存源文件的Inode,不论源文件多大,软链接大小不变
- 软链接的权限是最大权限 lrwxrwxrwx., 但是由于没有实际数据,最终访问时需要参考源文件权限
- 软链接可以链接目录
- 软链接可以跨分区
- 软链接特征明显,建议使用软链接。
2. 压缩和解压缩命令
打包与 压缩与解压缩
Linux的备份压缩
- 最早的Linux备份介质是磁带,使用的命令是tar
- 可以打包后的磁带文件进行压缩存储,压缩的命令是gzip 和bzip2 (bzip2压缩的比率更高但是速度会慢点)
- 经常使用的扩展名是 .tar.gz 、 .tar.bz2 、 .tgz
① zip和unzip, .zip 是windows常用的压缩格式,linux也可以正确识别。
zip -r test.zip /home/kris/module/test/ #将test目录及其下的文件(目录和文件都会压缩进去) 压缩为test.zip,
-r为递归,./*当前目录下所有文件
unzip -o -d test/ test.zip #把压缩包解压到指定位置
-d是指定压缩位置,
-o是不提示的情况下覆盖
② tar 命令
tar
常用选项 -z 打包同时压缩 -c 产生.tar打包文件 (打包) -v 显示详细信息(打包文件过程), 显示解打包文件过程 -f 指定操作类型为文件, 指定压缩包的文件名。压缩包的扩展名是用来给管理员识别格式的,所以一定要正确指定扩展名 -x 解包.tar文件,解打包 -C 目录,指定解打包位置 -t 测试,不解打包,只是查看包中有哪些文件 #打包 tar [选项] [-f 压缩包名] 源文件或目录 tar cf tmp-bakup.tar /root/tmp/ /root/tmp/ tar -cvf anaconda.cfg.tar anaconda.cfg #解包 tar [选项] 压缩包 tar -xvf anaconda.cfg.tar #解打包到当前目录 压缩 tar命令已经把gzip和bzip2命令集成进去 #打包并压缩为 tar.gz格式 tar czf tmp-bakup.tar.gz /root/tmp/ /root/tmp/ ls -lh [root@kris ~]# tar -zcvf 12.tar.gz 1.txt 2.txt 1.txt 2.txt #打包压缩为 tar.bz2格式 tar cjf tmp-bakup.tar.bz2 /root/tmp/ /root/tmp/ #解包并解压 [root@kris ~]# tar -zxvf 12.tar.gz -C xi (解压,-C是可以指定解压的路径,默认是本目录) 1.txt 2.txt 解压缩也是tar命令只是把参数c 换成x tar xf tmp-bakup.tar -C ./ tar zxf tmp-bakup.tar.gz -C ./ tar jxf tmp-bakup.tar.bz2 -C ./ 网上还经常可以看到 .tar.bz2 缩写为 .tbz2 或 .tgz为了在网络上传播扩展名做了缩写
③ gzip和 gunzip 命令,.gz 格式是linux中最常用的压缩格式
gzip [选项] 源文件
选项: -c 将压缩数据输出到标准输出中,可以用于保留源文件 -d 解压缩 -r 压缩目录 如 gzip -c anaconda.cfg > anaconda.cfg.gz
解压缩命令 gzip -d 压缩包 gunzip 压缩包
④ bzip2和bunzip2命令 .bz2格式 算法更先进、压缩比更好,而.gz格式相对来讲压缩的时间更快。
压缩
bzip2 [选项] 源文件 选项: -d 解压缩 -k 压缩时,保留源文件 -v 显示压缩的详细信息 解压缩 bzip2 -d 压缩包 bunzip2 压缩包
.tar.gz 和.tar.bz2 格式
tar [选项] 压缩包 源文件或目录 选项: -z 压缩和解压缩 .tar.gz格式 -j 压缩和解压缩 .tar.gz2格式
3. VI/VIM编辑器
VI是Unix操作系统和类Unix操作系统中最通用的文本编辑器。
VIM编辑器是从VI发展出来的一个性能更强大的文本编辑器。可以主动的以字体颜色辨别语法的正确性,方便程序设计。VIM与VI编辑器完全兼容。
强大的文本编辑 vi
四种模式
- 正常模式(Normal-mode)
- 插入模式(Insert-mode)
- i 在当前光标下插入,I 是在光标当前行的开头插入;
- a是光标之前的下一位插入,A是光标当前行的末尾插入;
- o是光标当前行的往下插入新的一行的开头,O是光标当前行往上插入新的一行的开头;
- h是光标左移,l是光标右移;j键向下, k键向上;(hjkl)
- yy是复制整行,y3是复制当前光标往下的3行(会显示复制了4行--包括当前行), y$2是复制当前光标之后的2个字符,y$是复制当前光标到最后一个字符;
- p是粘贴
- dd是剪切整行,d$是剪切当前光标到最后的字符
- u是撤销;ctrl+r重做 即是对撤销多的命令重新执行返回上一步;
- x 光标移动到哪个字符按 x 就删除这个字符;r +新值,光标所在字符按r + 插入的新值 是替换当前的字符;
- : set nu显示行号;按行号+shift+g,光标到哪一行;gg是移动光标到第一行,GG是移动光标到最后一行;shift+$是移动光标到当前行的最后一个字符,shift+^是光标到当前行的首个字符;
- 命令模式(Command-mode)
- : 进入命令模式,退出按ESC进入正常模式;
- 如果直接vim 打开进行编辑,按 : + 空格 + 路径,保存到当前路径下;vim+文件名打开,按:w 回车是直接保存;按:q是退出;按:wq 是保存并退出;按:q!是强制退出;
- :!+命令是查看linux执行的命令,比如 :!pwd
- /+要查找的字符回车,如果有多个按n下一个;
- :s/old/new,字符的查找替换,默认是只针对当前行的第一个字符进行查找替换;:%s/old/new ,查找整个文件匹配的进行替换,也是只替换所有行的第一个字符;:%s/old/new /g 全局查到的字符全部替换;:5,6s/x/X,5-6行将第一个字符替换为大写的X;
- :set nu 显示行号,:set nonu 不显示行号;
- 可视模式(Visual-mode)
- v 字符可视模式
- V 行可视模式
- ctrl+v 块可视模式
- 配合d和 I(大写i)命令可以进行块的便利操作
如果想每个打开的文件中显示行号,就需要修改配置文件,如果
[root@Linux100 tmp]# vim /etc/vimrc
set nu
4. 基本权限管理
用户与权限管理
用户管理常用命令
- useradd 新建用户
- userdel 删除用户
- passwd 修改用户密码
- usermod 修改用户属性
- chage 修改用户属性
组管理命令
- groupadd 新建用户组
- groupdel 删除用户组
[root@Linux100 ~]# useradd kris
[root@Linux100 ~]# id root
uid=0(root) gid=0(root) 组=0(root)
[root@Linux100 ~]# id kris
uid=1001(kris) gid=1001(kris) 组=1001(kris)
[root@Linux100 ~]# id abc
id: abc: no such user
[root@Linux100 ~]# ls /home/
blake kris
[root@Linux100 ~]# ls -a /home/kris
. .. .bash_logout .bash_profile .bashrc .mozilla
[root@Linux100 ~]#
[root@Linux100 ~]# ls /etc/passwd
/etc/passwd
[root@Linux100 ~]# tail -10 /etc/passwd
qemu:x:107:107:qemu user:/:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
gnome-initial-setup:x:989:983::/run/gnome-initial-setup/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
blake:x:1000:1000:blake:/home/blake:/bin/bash
kris:x:1001:1001::/home/kris:/bin/bash
[root@Linux100 ~]# tail -10 /etc/shadow
qemu:!!:19254::::::
ntp:!!:19254::::::
gdm:!!:19254::::::
gnome-initial-setup:!!:19254::::::
sshd:!!:19254::::::
avahi:!!:19254::::::
postfix:!!:19254::::::
tcpdump:!!:19254::::::
blake:$6$BzrR2eCfZ$nS4EbsgheXdVFpcuFnwMSx2sonL8QL1YGC28X/7yEpD9ojcbsdRtWWPChQHGn/g2S/0aPvDX8Lz5AR0xUJsBb/:19254:0:99999:7:::
kris:!!:19270:0:99999:7:::
[root@Linux100 ~]# id kris
uid=1001(kris) gid=1001(kris) 组=1001(kris)
[root@Linux100 ~]# id root
uid=0(root) gid=0(root) 组=0(root)
#更改用户密码
[root@Linux100 ~]# passwd kris
更改用户 kris 的密码
#更改root用户密码
[root@Linux100 ~]# passwd
更改用户 root 的密码 。
[root@Linux100 ~]# userdel -r kris
[root@Linux100 ~]# ls -a /home/
. .. blake
[root@Linux100 ~]# useradd w
[root@Linux100 ~]# usermod -d /home/w1 w
[root@Linux100 ~]#
[root@Linux100 ~]# groupadd group1
[root@Linux100 ~]# useradd user1
[root@Linux100 ~]# usermod -g group1 user1
[root@Linux100 ~]# id user1
uid=1002(user1) gid=1002(group1) 组=1002(group1)
[root@Linux100 ~]# useradd -g group1 user2
[root@Linux100 ~]# id user2
uid=1003(user2) gid=1002(group1) 组=1002(group1)
[root@Linux100 ~]#
[root@Linux100 ~]#
[root@Linux100 ~]# su - user1
/etc/profile
/etc/bashrc
[user1@Linux100 ~]$ cd /root/
-bash: cd: /root/: 权限不够
[user1@Linux100 ~]$ exit
登出
[root@Linux100 ~]# su user2
/etc/bashrc
[user2@Linux100 root]$ id
uid=1003(user2) gid=1002(group1) 组=1002(group1) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[user2@Linux100 root]$ pwd
/root
[user2@Linux100 root]$ ls
ls: 无法打开目录.: 权限不够
[user2@Linux100 root]$ su - root
密码:
上一次登录:三 10月 5 08:57:43 CST 2022pts/0 上
/etc/profile
.bash_profile
.bashrc
/etc/bashrc
su和sudo的区别
用户切换
- su 切换用户
- su - USERNAME 使用login shell方式切换用户
- sudo 以其他用户身份执行命令
- visudo 设置需要使用sudo的用户(组)
[root@Linux100 ~]# shutdown -h 30
Shutdown scheduled for 三 2022-10-05 09:58:01 CST, use 'shutdown -c' to cancel.
[root@Linux100 ~]# visudo
blake ALL=/sbin/shutdown -c
[root@Linux100 ~]#
Broadcast message from root@Linux100 (Wed 2022-10-05 09:35:00 CST):
The system shutdown has been cancelled at Wed 2022-10-05 09:36:00 CST!
[blake@Linux100 ~]$ shutdown -c
Failed to talk to shutdownd, shutdown hasn't been cancelled: 权限不够
[blake@Linux100 ~]$
[blake@Linux100 ~]$ sudo /sbin/shutdown -c
[sudo] blake 的密码:
对不起,请重试。
[sudo] blake 的密码:
Broadcast message from root@Linux100 (Wed 2022-10-05 09:35:00 CST):
The system shutdown has been cancelled at Wed 2022-10-05 09:36:00 CST!
用户和用户组的配置文件
[root@Linux100 ~]# vim /etc/passwd
45 user1:x:1002:1002::/home/user1:/bin/bash
46 user2:x:1003:1002::/home/user2:/bin/bash
47 user3:x:1004:1004::/home/user3:/bin/bash
#其中x表示是否需要密码登陆,x是需要,去掉即不需密码即可登陆;
#user1的用户id为1002,这个是专属的uid,root的uid为0,把这个用户的uid修改为0表示它就是root用户的权限了,后面的1002是用户组id,再后面是家目录的位置,再后面是登陆的用户用bash去解释,如果修改为/sbin/nologin则不能用bash登陆;
#也可以按照这个格式手动添加用户;
#用户后面的$开头的是加密后的密码
[root@Linux100 ~]# vim /etc/shadow
user3:$6$VJaeeGvi$PUkwYzJnNatjwoRqn378vzodrVyyvy4CzKaonAd2CRpWdoiObE/IFCms8zBXC.t.eFu427HoKeJLui/S.RNvc0:19270:0:99999 :7:::
#用户:需要密码:用户组:用户所属其他组
[root@Linux100 ~]# vim /etc/group
mail:x:12:postfix
[root@Linux100 ~]# id postfix
uid=89(postfix) gid=89(postfix) 组=89(postfix),12(mail)
[root@Linux100 ~]# id mail
uid=8(mail) gid=12(mail) 组=12(mail)
文件与目录权限的表示方法
查看文件权限的方法
[kris@hadoop101 bin]$ ls -l kf.sh
-rwxr-xr-x 1 root root 523 2月 7 2020 kf.sh
第1位代表文件类型, 详细分类可查看 info ls 命令查看
- 普通文件;
b 块设备文件。如分区文件/dev/sda1
c 字符设备文件, 输入设备如鼠标、键盘等
d 目录文件 目录
l 软链接文件
p 管道符文件
s 套接字文件 支持Socket访问
第2-4位代表文件所有者的权限。 r 表read 读权限; w 表write 写权限; x 表execute 执行权限; 如果是-代表没有对应的权限
第5-7位代表文件所属组的权限,同样拥有"rwx"权限;
第8-10位代表其他人的权限, 同样拥有"rwx"权限。
文件类型
- - 普通文件
- d 目录文件
- b 块特殊文件
- c 字符特殊文件
- l 符号链接
- f 命名管道
- s 套接字文件
文件权限的表示方法
- 字符权限表示方法
- r 读
- w 写
- x 执行
- 数字权限的表示方法
- r = 4
- w = 2
- x = 1
- -rw-r-xr--. 1 username groupname mtime filename
- rw- 文件属主的权限
- r-x 文件属组的权限
- r--其他用户的权限
- chmod u(修改红色部分,包括u+、 u-、u=rwx直接去设置权限 )g(修改蓝色部分) o(修改粉色部分)a(修改所有的部分)
- 创建新文件有默认权限,根据umask值计算,属主和属组根据当前进程的用户来设定
目录权限的表示方法
- x 进入目录
- rx 显示目录内的文件名
- wx 修改目录内的文件名
修改权限命令
- chmod 修改文件、目录权限
- chmod u+x /tmp/testfile
- chmod 755 /tmp/testfile
- chown 更改数主、属组
- chgrp 可以单独更改数组,不常用
chmod [选项] 权限模式 文件名
选项: -R 是递归设置权限,即给子目录中的所有文件设定权限。
权限模式:
[ugoa][[+-=][perms]] 即[用户身份][[赋予方式][权限]]
用户身份:
u 所有者(user)、
g所属组(group)、
o其他人(other) 、
a 全部身份(all)
赋予方式:
+ 加入权限、
- 减去权限、
= 设置权限
权限:
r 读取权限(read) 、
w 写权限(write)、
x 执行权限(execute)
数字权限:
4 表"r", 2 表 "w"权限, 1 表 "x"权限
常用权限:
644 表文件的基本权限,代表所有者拥有读、写权限,而所属组和其他人拥有只读权限。
755 这是文件的执行权限和目录的基本权限,代表所有者拥有读、写和执行权限,而所属组和其他人拥有读和执行权限。
777 这是最大权限,尽力避免给文件或目录赋予这样的权限,会造成一定的安全隐患。
目录的可用权限:
0 任何权限都不赋予;
5 基本目录浏览和进入权限;
7 完全权限。
所有者和所属组命令
① chown 命令是修改文件和目录的所有者和所属组的命令,其基本信息如下。
所在路径:/bin/chown。
执行权限:所有用户。
[root@localhost ~]# chown [选项] 所有者:所属组 文件或目录
选项:
-R: 递归设置权限,也就是给子目录中的所有文件设置权限
普通用户不能修改文件的所有者,哪怕自己是这个文件的所有者也不行。
普通用户可以修改所有者是自己的文件的权限。
② chgrp 命令是修改文件和目录的所属组的命令,其基本信息如下。
所在路径:/bin/chgrp。
执行权限:所有用户。
umask 默认权限
[root@localhost ~]# umask
0022 #用八进制数值显示 umask 权限
[root@localhost ~]# umask -S
u=rwx,g=rx,o=rx #用字母表示文件和目录的初始权限
[root@Linux100 ~]# mkdir test
[root@Linux100 ~]# ls -ld test/
drwxr-xr-x. 2 root root 6 10月 5 10:39 test/
[root@Linux100 ~]# id blake
uid=1000(blake) gid=1000(blake) 组=1000(blake),10(wheel)
[root@Linux100 ~]# chown blake test/
[root@Linux100 ~]# ls -ld test/
drwxr-xr-x. 2 blake root 6 10月 5 10:39 test/
[root@Linux100 ~]# id
uid=0(root) gid=0(root) 组=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[root@Linux100 ~]# chown :group1 test/
[root@Linux100 ~]# ls -ld test/
drwxr-xr-x. 2 blake group1 6 10月 5 10:39 test/
[root@Linux100 ~]#
[root@Linux100 ~]# cd test/
[root@Linux100 test]# touch afile
[root@Linux100 test]# ls -l afile
-rw-r--r--. 1 root root 0 10月 5 11:02 afile
[root@Linux100 test]# chmod u+x afile
[root@Linux100 test]# ls -l afile
-rwxr--r--. 1 root root 0 10月 5 11:02 afile
[root@Linux100 test]# chmod g-r afile
[root@Linux100 test]# ls -l afile
-rwx---r--. 1 root root 0 10月 5 11:02 afile
[root@Linux100 test]# chmod o=w afile
[root@Linux100 test]# ls -l afile
-rwx----w-. 1 root root 0 10月 5 11:02 afile
[root@Linux100 test]# chmod a+r afile
[root@Linux100 test]# ls -l afile
-rwxr--rw-. 1 root root 0 10月 5 11:02 afile
[root@Linux100 test]# chmod 446 afile
[root@Linux100 test]# ls -l afile
-r--r--rw-. 1 root root 0 10月 5 11:02 afile
[root@Linux100 test]# touch bfile
[root@Linux100 test]# ls -l bfile
-rw-r--r--. 1 root root 0 10月 5 11:09 bfile
[root@Linux100 test]# chmod 644 afile
[root@Linux100 test]# ls -l afile
-rw-r--r--. 1 root root 0 10月 5 11:02 afile
[root@Linux100 test]#
[root@Linux100 test]# ls -l
总用量 0
-rw-r--r--. 1 root root 0 10月 5 11:02 afile
-rw-r--r--. 1 root root 0 10月 5 11:09 bfile
[root@Linux100 test]# umask
0022
[root@Linux100 test]# 666-022=644
权限管理以及文件的特殊权限
特殊权限
- SUID 用于二进制可执行文件,执行命令时取得文件属主权限
- 如/usr/bin/passwd
- SGID 用于目录,在该目录下创建新的文件和目录,权限自动更改为该目录的属组
- SGIT 用于目录,该目录下新建的文件和目录,仅root和自己可以删除
- 如/tmp
搜索命令
①whereis 只能搜索系统命令,不能搜索普通文件
②which 也是搜索系统命令 与whereis 的区别:
- whereis 可以查找到二进制命令的同时,查找到帮助文档的位置;
- which 在查找二进制命令的同时,如果有别名则还可以找到别名。
③locate 按照文件名搜索普通文件
优点:按照数据库(位置/var/lib/mlocate/mlocate.db)搜索,速度快、消耗资源少。可以使用updatedb强制更新数据库。
缺点:只能按文件名来搜索文件,不能执行更复杂的搜索,比如按权限、大小、修改时间等。
[kris@hadoop101 bin]$ vim /etc/updatedb.conf PRUNE_BIND_MOUNTS = "yes" #开启搜索限制,即让这个配置文件生效 PRUNEFS = "9p afs anon_inodefs auto autofs bdev binfmt_misc cgroup cifs coda configfs cpuset debugfs devpts ecryptfs exofs fuse fusectl gfs gfs2 gpfs hugetlbfs inotifyfs iso9660 jffs2 lustre mqueue ncpfs nfs nfs4 nfsd pipefs proc ramfs rootfs r pc_pipefs securityfs selinuxfs sfs sockfs sysfs tmpfs ubifs udf usbfs vmhgfs" #在locate执行搜索时,禁止搜索这些文件系统类型 PRUNENAMES = ".git .hg .svn" #在locate执行搜索时,禁止搜索带有这些扩展名的文件 PRUNEPATHS = "/afs /media /net /sfs /tmp /udev /var/cache/ccache /var/spool/cups /var/spool/squid /var/tmp" #在locate执行搜索时,禁止搜索这些系统目录 ~
find 在目录中搜索文件
find 搜索路径 [选项] 搜索内容
按照文件名搜索
选项:
-name 按文件名搜索 (比如 find . -name text.txt 在. 当前目录查找text.txt的文件。)
-iname 按文件名搜索,不区分文件名大小写
-inum 按inode号搜索 (ls -i text.txt 查看inode号; find . -inum 3019582)
按照文件大小搜索、按照修改时间搜索、按照权限搜索、按照所有者和所属组搜索、按照文件类型搜索、逻辑运算符、其他选项 (-exec, -ok)
find 查找文件或者目录
(1)按文件名:根据名称查找/目录下的filename.txt文件。
[root@hadoop101 ~]# find xiyou/ -name “*.txt”
(2)按拥有者:查找/opt目录下,用户名称为-user的文件
[root@hadoop101 ~]# find xiyou/ -user kris
(3)按文件大小:在/home目录下查找大于200m的文件(+n 大于 -n小于 n等于)
[root@hadoop101 ~]find /home -size +204800
使用find命令时,使用-exec参数时,其中\+和\;参数的区别
$ find . -exec ls '{}' \+ ## -exec后面接其他命令来操作find查找到的结果, ls {} 代表把find找到的结果用ls 打印出来
$ find . -exec ls '{}' \; ##在bash环境中 ;是有特殊意义的,所以用转移字符 \; 转换成普通字符
\;为find找到的每个文件执行单独的命令,而\+附加文件,并在所有文件上执行单个命令。\是一个转义字符.
查找指定路径下---指定文件类型下---文件中的指定内容
find ./include/linux/ -name "*.h" -exec grep "FMC_PR" '{}' \; -print;
管道符
1) 行提取命令 grep
[kris@hadoop101 ~]$ grep "/bin/bash" /etc/passwd #查找用户信息文件/etc/passwd 中,有多少可以登录的用户
[kris@hadoop101 ~]$ grep -A 3 "root" /etc/passwd #查找包含root的行,并列出后序的3行
[kris@hadoop101 ~]$ grep -n "/bin/bash" /etc/passwd #查找可以登录的用户,并显示行号
[kris@hadoop101 ~]$ grep -v "/bin/bash" /etc/passwd #查找不含有/bin/bash 的行,其实就是列出所有的伪用户
grep的作用是在文件中提取和匹配符合条件的字符串行。
格式: grep [选项] "搜索内容" 文件名
选项:
-A 数字 #列出符合条件的行,并列出后序的n行
-B 数字 #列出符合条件的行,并列出前面的n行
-c #统计找到符合条件的字符串的次数
-i #忽略大小写
-n #输出行号
-v #反向查找
--colors=auto #搜索出的关键字用颜色显示
2) find和grep命令的区别
find命令用于在系统中搜索符合条件的文件名,如果需要模糊查询,则使用通配符进行匹配,搜索时文件名是完全匹配。
grep命令用于在文件中搜索符合条件的字符串,如果需要模糊查询,则使用正则表达式进行匹配,正则表达式是包含匹配。
find . -name "abc" #在当前目录.下搜索文件名是abc的文件,只会找到abc文件,find是完全匹配,abcd文件虽包含但也不匹配
grep "abc" test.txt #只要数据行中包含abc, 就会都列出
3) 管道符
ll -a /etc/ more
netstat -an | grep "ESTABLISHED" #查询下本地所有网络连接,提取包含ESTABLISHED的行;
命令格式: 命令1 | 命令2 表示命令1的正确输出作为命令2的操作对象
例如:
ll -a /etc/ > /kris/testFile #用输出重定向,把ll命令的输出保存到/kris/testFile文件中
more /kris/testFile #分屏显示
ll -a /etc/ | more #利用管道符
ll -a /etc/ | grep yum #在/etc/的结果中搜索yum的文件名
netstat -an | grep "ESTABLISHED" #查询下本地所有网络连接,提取包含ESTABLISHED(已建立连接的行),就可以知道服务器上有多少已经成功连接的网络连接
netstat -an | grep "ESTABLISHED" | wc -l #想知道具体的网络连接数量,使用wc命令来统计行数
通配符和正则表达式
通配符:用于匹配符合条件的文件名,完全匹配;
正则表达式:用于在文件中匹配符合条件的字符串,包含匹配。
他们的区别只在shell中适用,因为用来在文件当中搜索字符串的命令,如grep、 awk、 sed等命令可以支持正则,而在系统当中搜索文件的命令如ls、 find、 cp这些不支持正则,
所以只能使用shell自己的通配符来进行匹配。
通配符
通配符 |
含义 |
* |
匹配 0 个或任意多个任意字符,即匹配任何内容。 |
. |
匹配除了换行符外任意一个字符。 |
^ |
匹配行首。例如 ^hello会匹配以hello开头的行 |
$ |
匹配行尾。例如 hello$ 会匹配以hello结尾的行。 |
? |
匹配一个任意字符 |
[] |
匹配中括号中指定的任意一个字符,只匹配一个字符。 例如[abc] 代表一定匹配一个字符,或者是a,或者是b,或者是c |
[-] |
匹配中括号中任意一个字符,-代表一个范围。例如 [a-z] 代表匹配一个小写字母。 |
[^] |
逻辑非,表示匹配除不是中括号内的一个字符。例如 [^0-9] 代表匹配一个不是数字的字符。 |
ls * # "*"代表所有文件;
012 0abc abc abcd
ls ?abc # "?"匹配任意一个字符,所以会匹配0abc, 但是不能匹配abc文件,因为"?"不能匹配空
0abc
ls [0-9]* # 匹配任何以数字开头的文件
012 0abc
ls [^0-9]* # 匹配不以数字开头的文件
abc abcd
正则符
正则符 | 作用 |
? |
匹配前一个字符重复0次,或1次(?是扩展正则,需要使用egrep命令) |
* | 匹配前一个字符重复0次,或任意多次 |
[] |
匹配中括号中任意一个字符,例如[abc] 代表一定匹配一个字符,或者是a,或者是b,或者是c |
[-] |
匹配中括号中任意一个字符,-代表一个范围。例如 [a-z] 代表匹配一个小写字母。 |
[^] |
逻辑非,表示匹配不是中括号内的一个字符。例如 [^0-9] 代表匹配一个不是数字的字符。 |
^ |
匹配行首 |
$ |
匹配行尾 |
. |
任意单个字符 |
[] |
字符范围。如[a-z] |
Bash中的其他特殊符号
符号 | 作用 |
' ' | 单引号。在单引号中所有的特殊符号,如"$" 和"`" (反引号)都没有特殊含义。 |
" " | 双引号。在双引号中特殊符号都没有特殊含义,但是"$"、"`"和"\"是例外,拥有"调用变量的值"、"引用命令"和"转义符"的特殊含义。 |
`` | 反引号。反引号括起来的内容是系统命令,在Bash中会先执行它。和$()作用一样,不过推荐使用$(),因为反引号非常容易看错。 |
$() | 和反引号作用一样,用来引用系统命令。 |
() | 用于一串命令执行时,()中的命令会在子shell中运行。 |
{} | 用于一串命令执行时,()中的命令会在当前shell中执行。也可以用于变量变形与替换。 |
[] | 用于变量的测试。 |
# | 在shell脚本中,#开头的行代表注释。 |
$ | 用于调用变量的值,如需要调用变量name的值时,需要用$name的方式得到变量的值。 |
\ | 转义符,跟在\之后的特殊符号将失去特殊含义,变为普通字符。如\$将输出"$"符号,而不是当做是变量的引用。 |
1)单引号和双引号
[kris@hadoop101 test]$ name=sc #定义变量name的值是sc
[kris@hadoop101 test]$ echo '$name' #如果输出时用单引号,则$name原封不动的输出
$name
[kris@hadoop101 test]$ echo "$name" #如果输出时用双引号,则会输出变量name的值
sc
[kris@hadoop101 test]$ echo `date` #反引号括起来的命令会正常执行
2021年 03月 28日 星期日 09:36:16 CST
[kris@hadoop101 test]$ echo '`date`' #如果反引号命令被单引号括起来,那么这个命令不会执行,`date`会被当做普通字符输出
`date`
[kris@hadoop101 test]$ echo "`date`" #如果是双引号括起来,那么这个命令又会正常执行。
2021年 03月 28日 星期日 09:36:43 CST
2)反引号
[kris@hadoop101 test]$ echo ls
ls
[kris@hadoop101 test]$ echo `ls`
012 0abc abc abcd
[kris@hadoop101 test]$ echo $(date)
2021年 03月 28日 星期日 09:38:02 CST
3)小括号、中括号和大括号
父子Shell,在Bash中, 可以调用新的Bash如:
bash
通过pstree命令查看进程数:
├─sshd───sshd───sshd───bash───pstree
[kris@hadoop101 test]$ bash
[kris@hadoop101 test]$ pstree
init─┬─ManagementAgent───2*[{ManagementAgen}]
...
├─sshd───sshd───sshd───bash───bash───pstree
小括号和大括号的区别:
如果是用于一串命令的执行,那么小括号和大括号的主要区别在于:
()执行一串命令时,需要重新开一个子shell进行执行;
{}执行一串命令时,是在当前shell执行;
()和{}都是把一串的命令放在括号里面,并且命令之间用;号隔开;
()最后一个命令可以不用分号, {}最后一个命令要用分号;
{}的第一个命令和左括号执行必须要有一个空格; ()里的各命令不必和括号有空格;
()和{}中括号里面的某个命令的重定向只影响该命令,但括号外的重定向则影响到括号里的所有命令。
例子:
[kris@hadoop101 test]$ echo $name #父shell中定义变量name的值是sc
sc
[kris@hadoop101 test]$ (name=kris;echo $name) #如果用()括起来一串命令,这些命令都可以执行; 给name变量重新赋值,但是这个值只在子shell中生效
kris
[kris@hadoop101 test]$ echo $name #父shell中的name值还是sc,而不是kris
sc
[kris@hadoop101 test]$ { name=kris;echo $name; } #注意{}里面的格式,用大括号来进行一串命令执行时,name变量的修改是直接在父shell当中
kris
[kris@hadoop101 test]$ echo $name #name变量的值已经被修改
kris
命令的别名
命令的别名,就是命令的小名
alias #查询命令别名
alias 别名='原命令' #设定命令别名
例如: alias ser='service network restart'
用命令定义的别名,是临时生效的,要想永久生效,需要写入环境变量配置文件 ~/.bashrc (vim /root/.bashrc)
别名的优先级比命令高,命令的执行顺序是:
① 第一顺位执行用绝对路径或相对路径执行的命令;② 第二顺位执行别名;
③ 第三顺位执行Bash的内部命令; ④ 第四顺位执行$PATH环境变量定义的目录查找顺序找到的第一个命令。
常用快捷键
Tab键 | 命令或文件补全 |
ctrl+A | 把光标移动到命令行开头。如果我们输入的命令过长,想要把光标移动到命令行开头时使用。 |
ctrl+E | 把命令移动到命令行结尾。 |
ctrl+C | 强制终止当前命令 |
ctrl+L | 清屏,相当于clear命令 |
ctrl+U | 删除或剪切光标之前的命令。 |
ctrl+K | 删除或剪切光标之后的内容 |
ctrl+Y | 粘贴ctrl+U剪切的内容。 |
ctrl+R | 在历史命令中搜索,按下ctrl+R之后,就会出现搜索界面,只要输入搜索内容,就会从历史命令中搜索。 |
ctrl+D | 退出当前终端。 |
ctrl+Z | 暂停,并放入后台。 |
ctrl+S | 暂停屏幕输出。 |
ctrl+Q | 恢复屏幕输出。 |
输入输出重定向
1)输入重定向
wc [选项] [文件名]
选项:-c 统计字节数;
-w 统计单词树;
-l 统计行数;
2)输出重定向
类型 | 符号 | 作用 |
标准输出重定向 | 命令 > 文件 | 以覆盖的方式,把命令的正确输出输出到指定文件中 |
命令 >> 文件 | 以追加的方式,把命令的正确输出输出到指定文件中 | |
标准错误输出重定向 | 错误命令 2> 文件 | 以覆盖的方式,把命令的错误输出输出到指定文件中 |
错误命令 2>> 文件 | 以追加的方式,把命令的错误输出输出到指定文件中 | |
正确输出和错误输出都保存到文件 | 命令 > 文件 2>&1 | 以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中 |
命令 >> 文件 2>&1 | 以追加的方式,把正确输出和错误输出都保存到同一个文件当中 |
3)Bash的标准输入输出
设备 | 设备文件名 | 文件描述符 | 类型 |
键盘 | /dev/stdin | 0 | 标准输入 |
显示器 | /dev/stdout | 1 | 标准输出 |
显示器 | /dev/stderr | 2 | 标准错误输出 |
多命令顺序执行
多命令执行符 | 格式 | 作用 |
; | 命令1;命令2 | 多个命令顺序执行 |
&& | 命令1 && 命令2 |
当命令1正确执行($?=0),则命令2才会执行 当命令1执行不正确($?!=0),则命令2不会执行 |
|| | 命令1 || 命令2 |
当命令1执行不正确($?!=0),则命令2才会执行 当命令1正确执行($?=0),则命令2不会执行 |
关机和重启命令
sync数据同步,刷新文件系统缓冲区
shutdown # -h 关机 、-r重启
reboot #重启 是安全的
下面这两个命令不会完整关闭和保存系统的服务
halt #关机
poweroff #关机
init是修改linux运行级别的命令,也可以用于关机和重启。这个命令并不安全。
init 0 #关机,调用系统的0级别
init 6 #重启,调用系统的6级别
把压缩包添加到linux系统的小工具
[kris@hadoop101 hadoop-2.7.2]$ sudo yum install -y lrzsz
sz 是下载到本地; rz -E是从本地上传文件
netstat 显示网络统计信息和端口占用情况
netstat -anp |grep 进程号 (功能描述:查看该进程网络信息) netstat -nlp | grep 端口号 (功能描述:查看网络端口号占用情况)
netstat -tunlp | grep 端口号 (t是tcp;u是udp )
[kris@hadoop datas]$ ls | awk '{sum+=1} END{print sum}' 21 [kris@hadoop datas]$ find ./ -name "*.sh" | awk '{sum+=1} END{print sum}' 12 [kris@hadoop datas]$ find ./ -name "*.txt" | awk '{sum+=1} END{print sum}' 6
将hadoop101上的文件wc.txt发送到hadoop102上可采用nc;
[kris@hadoop101 ~]$nc -l 9999 > wc.txt [kris@hadoop102 ~]$nc hadoop104 9999 < wc.txt
eval的用法
eval可读取一连串的参数,然后再依参数本身的特性来执行。
eval [参数]
eval命令将会首先扫描命令行进行所有的置换,然后再执行该命令。该命令适用于那些一次扫描无法实现其功能的变量。该命令对变量进行两次扫描。这些需要进行两次扫描的变量有时被称为复杂变量。不过这些变量本身并不复杂。eval命令也可以用于回显简单
变量,不一定是复杂变量。
1. eval命令也可以用于回显简单变量,不一定是复杂变量
$ name = valuebank $ echo $name valuebank $ eval echo $name valuebank
2 . 执行含有字符串的命令
$ vim test Hello World $ myfile="cat test" #将cat test赋给变量myfile $ echo $myfile #echo该变量,将无法列出test文件中的内容。 cat test $ eval $myfile #eval命令将会对该变量进行两次扫瞄。 Hello World 使用eval命令不但可以置换该变量,还能够执行相应的命令。第一次扫描进行了变量置换,第二次扫描执行了该字符串中所包含的命令cat test。
3. 命令还可以用来显示出传递给脚本的最后一个参数
$ vim test #!/bin/bash echo "Total of the arguments passed $#" echo "The process Id is $$" echo "Last argument os "$(eval echo \$$#)"" $ ./test value bank test last Total of the arguments passed 4 The process Id is 4523 Last argument os last 在上面的脚本中, eval命令首先把$$#解析为当前shell的参数个数,然后在第二次扫描时得出最后一个参数。
4. 给每个值一个变量名
$ cat test2 COMMANY TQ LANGUE ENGLISH LIKE YES $ cat test3 #!/bin/bash while read NAME VALUE do eval "${NAME}=${VALUE}" done <test2 echo "$COMMANY $LANGUE $LIKE" $ ./test3 TQ ENGLISH YES
通过sed查找、替换文件中的文字
$ sed -i 's/SEARCH_REGEX/REPLACEMENT/g' INPUTFILE
-
-i - 默认情况下,sed输出到标准输出。此选项告诉sed编辑指定的文件。如提供了扩展名(例如-i.bak),将创建原始文件的备份。
-
s - 替代命令,应为sed最常用的命令。
-
/ / / - 分隔符,可以是任何字符,通常使用斜杠(/)字符。
-
SEARCH_REGEX - 要搜索的字符串或正则表达式。
-
REPLACEMENT - 要替换成的字符串。
-
g - 全局替换标志。默认情况下,sed一行一行地读取文件,且仅更改行中第一次出现的SEARCH_REGEX。提供此替换标志后,所有找到的待替换字串都会被替换。
-
INPUTFILE - 运行sed命令的文件名。
$ cat tool.txt
123 Foo foo foo linux
foo Foo /bin/bash Ubuntu foobak
foo linux
right now
are you ok
sed -i.bak 's/foo/linux/g' tool.txt ##使用sed编辑文件之前先进行备份是一个好习惯。
$ sed -i 's/foo/linux/' tool.txt ##查找foo并替换为linux,只查找替换文件中的第一个;
$ sed -i 's/foo/linux/gI' tool.txt ##查找foo并替换为linux, 加上 g是全文本查找替换, 加I 是不区分大小写的替换;
$ sed -i 's/\bfoo\b/linux/g' tool.txt ##在搜索字符串的两端使用单词边界表达式(\b),这样将只进行全字匹配,确保部分单词不会被匹配上。
$ sed -i 's/\/bin\/bash/\/usr\/bin/g' tool.txt #如需查找、替换包含定界符(/)的字符串,就要使用反斜杠(\)来转义斜杠,例如替换 /bin/bash 替换为 /usr/bin
$ sed -i 's|/bin/bash|/usr/bin|g' tool.txt #更简易的作法是换用另一个定界符。大多数人使用竖线(|)或冒号(:),但是也可以使用任何其它字符:
也可以使用正则表达式。比如,搜索所有的3位数字,并替换为其它字符串(比如number):
$ sed -i 's/\b[0-9]\{3\}\b/number/g' tool.txt
另一个sed挺有用的功能是,可以使用代表匹配内容的&字符。此字符可以多次使用。
例如,如果要在每个3位数字两边添加花括号{},请输入下面的命令:
$ sed -i 's/\b[0-9]\{3\}\b/{&}/g' tool.txt
递归查找、替换
有时想递归地在目录中搜索包含字符串的文件,并替换所有文件中的字符串,可以使用find或grep命令来递归地在目录中查找文件,并将文件名传递给sed来进行。
以下命令将在当前工作目录中递归搜索文件,并将文件名传递给sed。
$ find . -type f -exec sed -i 's/foo/bar/g' {} +
为避免名称中包含空格的文件出现,请使用-print0选项,该选项告诉find打印文件名并跟随一个空格,然后使用xargs -0通过输出管道传递给sed:
$ find . -type f -print0 | xargs -0 sed -i 's/foo/bar/g'
要排除目录,可使用-not -path选项。例如,如果要替换本地git存储库中的字符串,但排除所有以点(.)开头的文件,命令为:
$ find . -type f -not -path '*/\.*' -print0 | xargs -0 sed -i 's/foo/bar/g'
如仅搜索、替换具有特定扩展名的文件里的文本,可以使用:
$ find . -type f -name "*.md" -print0 | xargs -0 sed -i 's/foo/bar/g'
另一个选择是使用grep命令以递归方式查找包含搜索模式的所有文件,然后将文件名传递给sed:
$ grep -rlZ 'foo' . | xargs -0 sed -i.bak 's/foo/bar/g'