Fork me on GitHub

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执行搜索时,禁止搜索这些系统目录
~ 
View Code

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搜索、替换文本的一般形式为:
$ sed -i 's/SEARCH_REGEX/REPLACEMENT/g' INPUTFILE
  • -i - 默认情况下,sed输出到标准输出。此选项告诉sed编辑指定的文件。如提供了扩展名(例如-i.bak),将创建原始文件的备份。
  • s - 替代命令,应为sed最常用的命令。
  • / / / - 分隔符,可以是任何字符,通常使用斜杠(/)字符。
  • SEARCH_REGEX - 要搜索的字符串或正则表达式。
  • REPLACEMENT - 要替换成的字符串。
  • g - 全局替换标志。默认情况下,sed一行一行地读取文件,且仅更改行中第一次出现的SEARCH_REGEX。提供此替换标志后,所有找到的待替换字串都会被替换。
  • INPUTFILE - 运行sed命令的文件名。
在搜索替换参数上加引号,这样Shell的元字符不会按保留字符进行解析。
 
$ 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'

 

 

 

 
 
 
 
 
 
 
 
posted @ 2019-01-17 18:05  kris12  阅读(725)  评论(1编辑  收藏  举报
levels of contents