Linux:常用指令

全部:Linux常用命令 - SegmentFault 思否

wget 与 curl 命令详解 - SegmentFault 思否

十万字Linux命令大全cat详细教程(一)_川川菜鸟的博客-CSDN博客

规则与技巧

  • ctrl+k //剪切(删除)光标处到行尾的所有字符
  • ctrl+u //剪切光标处到行首的所有字符
  • ctrl+y //粘贴
  • ctrl+r 指令:自动匹配历史指令(不停按ctrl+r可以不停往上找历史指令)
  • 删除整行 HOME + CTRL K
  • 如果指令太长一行写不完,可以用\+ENTER实现换行继续输入
  • 指令+pageup:上一次输入的这个指令
  • 交互式系统退出:q
  • 上下翻页:SHIFT + pageup
  • 如果需要用root权限来执行,需要在执行的命令前加sudo
  • 指令内容输出到文件,ls -a > test(追加)
  • 桌面端截图快捷键:CTRL+ALT+A
  • which 指令A:指令A的路径
  • whereis 指令A:所有跟A沾边的指令的路径
  • 字符串拼接:$str1"str2"
  • Linux下,文件中的换行符为/nWindows中,文件中的换行符为/r/n。所以某些文件从Windows中变到Linux中后,要用sed -i将/r消除:
sed -i 's/\r$//g' 具体文件

  

常用

变量

var=1234
echo $var

 

查看版本

  1. uname -a
  2. cat /etc/issue
  3. cat /etc/os-release

容量

  1. 几核CPU:cat /proc/cpuinfo
  2. 内存:free、cat /proc/meminfo

系统自身

  1. hostname:主机名
  2. hostname -i:主机IP

文件系统

  1. mount:文件挂载情况,挂载路径的文件系统属性
  2. df:显示磁盘使用情况,同时也能显示挂载情况

用户、权限

  • 查看当前用户:whoami

  • 切换为root:su -

  • 从root切换为其他用户:su - 用户名

  • 退出当前用户:exit

  • 添加用户:useradd 用户名 -p 密码

  • 删除用户:userdel 用户名

  • 查看全部用户:cat /etc/passwd 或 compgen -u

  • 修改当前用户对于某个目录/文件的权限:chmod 777 目录/文件

  • 创建目录并修改权限:mkdir -m 711 目录

  • 递归创建目录:mkdir -p 目录

  • 一次修改多个文件、目录的权限:
    find /usr/local/lib/python3.7 -type f|xargs -I {} chmod 644 '{}'
    find /usr/local/lib/python3.7 -type d|xargs -I {} chmod 755 '{}'
  • 用户属性修改:usermod

  • 修改文件、目录的所属用户、组:chown

    chown [-R] 所有者:组名 文件或目录
  • 修改目录、文件的权限-读写可执行:chmod

    chmod [-R] 数字权限 文件或目录
    chmod [-ugoa] [+-=][rwx] 文件或目录
    
    #将.bashrc的所有权限都设定为启用
    chmod 777 .bashrc

     

文件/目录

  • 一次移动多个文件:mv 源1 源2 目的目录(最后一个一定是目录)

  • 一次创建多个文件名顺序排列的文件:mkdir dir{1..10},创建文件名为dir1-dir10的文件

  • 以树形结构显示某个目录下的所有文件组织结构:tree 路径
  • 以树形结构显示某个目录下的所有目录结构:tree -d 目录
  • 创建文件:
    • touch 文件名
    • echo 内容 >> 文件
    • vim或vi
  • 远程文件传输:scp

文件内容显示

  • 前/后十行:head/tail -n 10

  • grep前/后十行:grep -C 10
    grep 关键字 选项
    
    选项:
        -A n    列出匹配行及其后n行
        -B n    列出匹配行及其前n行
        -C n    列出匹配行及其前后n行

     

  • 输出文件行数:wc -l a.txt | awk '{print $1}'

屏幕、界面、系统本身

  • 清屏:clear或ctrl +L

  • 关机poweroff 重启reboot

  • 上下翻页:SHIFT + PAGEUP/PAGEDOWN

  • 安装:yum -y install 命令 (yum -y install vim*)

  • ctrl+k //剪切(删除)光标处到行尾的所有字符

  • ctrl+u //剪切光标处到行首的所有字符

  • ctrl+y //粘贴

  • 删除整行 HOME + CTRL K

路径

  • cd、pwd
  • ls
  • ln -s A B:建立链接,之后访问B等同于访问A
  • which 指令A:指令A的路径
  • whereis 指令A:所有跟A沾边的指令的路径

网络

  • 测试网络连接:ping www.baidu.com 测试

  • 查看所有网络连接信息:netstat -a

  • 网络连通性:curl -v url

  • 显示所有网卡信息:ifconfig -v、ip a

  • 查看网卡是千兆还是万兆:ethtool 网卡名(网卡名通过ifconfig获得)

  • 域名解析:dig URL、nslookup URL

压缩

  • 解压缩:tar -zxvf xxx.tar.gz -C 指定路径

0、汇总

0)特殊符号

符号

说明

用法

; 多条命令顺序执行,命令间不互相干扰 命令1 ; 命令2
|

①正则表达式中表示

②用于命令间,表示用前边命令的输出作为后边命令的输入

①ab(c|d)

②命令1 | 命令2

 &

①把命令放在后台执行

②标准输出和标准错误输出,具体见输入输出重定向一节

①java -jar xxx.jar &

 &&  前边指令执行成功才执行后边指令  
||   前边指令执行失败才执行后边指令  

①注释

② $#命令行参数个数

③${#变量}变量(字符串)长度

④${#数组[@]}数组长度

 
$

变量

①$a:变量的值

命令行

$0:当前脚本程序名称

$1-$n:第n个命令行参数

$*:所有命令行参数,整体输出

$@:所有命令行参数,分别输出

$#:命令行所有参数的个数

进程

$?:最后一次执行状态

$$:当前进程的进程号pid

$!:后台运行的最后一个进程的进程号

awk

$0:某一行的全部字段数据

$1-$n:某一行的第n个字段数据

 
~

字符串是否包含某个子串

awk '$2 ~ /Sc/'

第二字段中是否包含"Sc"字符

{}

正则:表示范围

循环:指定循环范围

匿名函数

命令:{}中的命令,是在当前shell执行

 

 

1)指令

指令

说明

屏幕

clear 清屏
echo

输出内容到屏幕(详见Shell基础 - ShineLe - 博客园

 exit

注销 

文件、文件夹本身

绝对路径:以"/"开头

相对路径:以.或..开头

mkdir、rmdir、rm 创建目录、删除空目录 、删除目录(可以不空)
touch/rm 创建/删除文件 
cd 跳转到目录
ls

罗列

Linux:ls指令 
grep 文本搜索(类似于CTRL+F)并输出,可使用正则表达式 
vim 编辑文件(vim指令见vim:用法
cat 查看文件(与vim的区别在于cat无法编辑) 
pwd 显示当前目录 
cp 复制 
mv 移动、重命名
basename 获取路径中的最后文件名
dirname 获取路径中的最后目录名
创建文件 touch、echo 内容 >> 文件

查找、搜寻

which 查找某个指令(可执行文件)的详细路径
whereis  从特定目录中查找 
locate/updatedb 从数据库中查找、更新数据库 
 find 查找(从文件类型、所有者、时间、权限……查找) 

文件属性

file 观察文件类型

文件内容

cat 从首行开始显示内容
tac 从尾行开始显示
nl 显示时输出行号
more 一页一页显示,只能往后翻页
less 与more类似,可以往前翻页
head 显示前几行
tail 显示尾几行
od 以二进制方式显示

权限

chmod 改变权限 
 chgrp 改变群组 
chown  改变所有者 
 umask 默认权限 

  用户

whoami

当前用户

su 

su 用户名:切换为某个用户

su -:切换为root 

sudo 指令

给当前用户root权限执行该命令

exit   退出切换的用户
useradd/userdel 用户名 添加/删除用户
compgen -u 查看全部用户

useradd

userdel

添加/删除用户

usermod

修改用户属性

 PATH

 echo $PATH 显示所有PATH
PATH="${PATH}:路径"  加入新PATH 

文件系统  

df 列出文件系统的整体磁盘使用量 
du 评估文件系统的磁盘使用量(用于推估目录所占容量)

进程管理  

 systemctl

进程管理

进程管理,较老

Linux:systemctl指令 - ShineLe - 博客园 

service
ps

进程状态,相当于windows任务管理器

Linux:ps指令 审核中

网络

 ip

IP与网关

 Linux:IP指令 - ShineLe - 博客园

route

路由与网关

Linux:网络指令(route)

dig

nslookup

域名解析

 Linux:IP与域名解析——nslookup与dig的功能和区别

安装下载

wget 

从web下载文件

Linux:wget指令 

压缩  解压缩

 tar 压缩 解压缩
   

 2)路径

路径

说明

相对路径 进入某个相对路径
绝对路径 进入绝对路径下的某个文件夹
. 当前目录
.. 返回上一级
~或空 回到home目录
- 在上一个目录和本目录来回切换
~user 回到user这个用户的home目录(非根目录,根目录是/
/ 回到根目录

家目录是~,根目录是/

3)重定向

①标准输入输出

设备设备名文件描述符类型
键盘 /dev/stdin 0 标准输入
显示器 /dev/stdout 1 标准输出
显示器 /dev/stderr 2 标准错误输出

②输入重定向

  • 输入重定向:不使用标准输入端口(也就是①中所说的键盘)输入文件,而是使用指定的文件作为标准输入设备
  • 修改:使用"<"符来修改标准输入设备
类型符号(语法)功能
标准输入 命令<文件1 命令把文件1的内容作为标准输入设备
标识符限定输入 命令<<标识符 命令把标准输入中读入内容,直到遇到“标识符”分解符为止
输入输出重定向(同时使用) 命令< 文件1 >文件2 命令把文件1的内容作为标准输入,把文件2作为标准输出。

③输出重定向

  • 输出重定向:把输出信息写入到文件中,而非控制台(显示屏)如果没有重定向,那么默认的输出设备是控制台

类型

指令

效果

标准输出重定向 命令 > 文件 覆盖,把命令的正确输出内容输出到指定的文件
命令 >> 文件 追加,把命令的正确输出内容输出到指定的文件
标准错误输出重定向 命令 2> 文件 覆盖,把命令的错误输出内容输出到指定的文件
命令 2>> 文件 追加,把命令的错误输出内容输出到指定的文件
正确输出和错误输出同时保存 命令 > 文件 2>&1 覆盖,把正确输出和错误输出都保存到同一个文件
命令 >> 文件 2>&1 追加,把正确输出和错误输出都保存到同一个文件
命令 &> 文件 覆盖,把正确输出和错误输出都保存到同一个文件
命令 &>> 文件 追加,把正确输出和错误输出都保存到同一个文件
命令 >> 文件1 2>>文件2 追加,正确输出追加到文件1中,错误输出追加到文件2
  • /dev/null:如果要执行某个命令,但不要在屏幕上显示结果,可以将输出重定向到/dev/null

用法

复制代码
command > file  将输出重定向到 file。
command < file  将输入重定向到 file。
command >> file 将输出以追加的方式重定向到 file。
n > file    将文件描述符为 n 的文件重定向到 file。
n >> file   将文件描述符为 n 的文件以追加的方式重定向到 file。
n >& m  将输出文件 m 和 n 合并。
n <& m  将输入文件 m 和 n 合并。
<< tag  将开始标记 tag 和结束标记 tag 之间的内容作为输入。
复制代码

例子

echo "hello world" > test7.sh

4)通配符

*:0或多个字符;

例子 说明
ls *.txt 查找所有txt文件
ls 1*.txt 以1开头的txt文件

?:1个字符

其实和正则表达式通配符完全相同,所以就不再多说了

1、终端

--help:帮助手册

如果要查看某个指令的参数选择,比如rm,有了两种方式

rm --help

man rm #更全 退出时按Q

tab:自动补全指令(有多个匹配项时,可以按两次tab显示全部匹配项,Windows也适用)

HOME或ctrl+a //光标迅速回到行首 == HOME

END或ctrl+e //光标迅速回到行尾

ctrl+insert //复制命令行内容(mac系统不能使用)

shift+insert //粘贴命令行内容(mac系统不能使用)

ctrl+k //剪切(删除)光标处到行尾的所有字符

ctrl+u //剪切(删除)光标处到行首的所有字符

ctrl+w //剪切(删除)光标前的一个字符

ctrl+y //粘贴

ctrl+c //中断终端正在执行的任务并开启一个新的一行

ctrl+d //退出当前shell命令行,如果是切换过来的用户,则执行这个命令回退到原用户

ctrl+r //搜索命令行使用过的历史命令记录

ctrl+g //从ctrl+r的搜索历史命令模式中退出

ctrl+l //清楚屏幕所有的内容,并开启一个新的一行

ctrl+s //锁定终端,使之任何人无法输入

ctrl+q //解锁ctrl+s的锁定状态

ctrl+z //暂停在终端运行的任务,使用"fg"命令可以使暂停恢复

!! //执行上一条命令

!pw //这是一个例子,是执行以pw开头的命令,这里的pw可以换成任何已经执行过的字符

!pw:p //这是一个例子,是仅打印以pw开头的命令,但不执行,最后的那个“p”是命令固定字符

!num //执行历史命令列表的第num条命令,num代指任何数字(前提是历史命令里必须存在)

!$ //代指上一条命令的最后一个参数,该命令常用于shell脚本中

esc+. //注意那个".“ 意思是获取上一条命令的(以空格为分隔符)最后的部分

esc+b //移动到当前单词的开头

esc+f //移动到当前单词的结尾

2、目录与文件

1)pwd(Print Working Directory):当前目录的路径

用法:pwd [-P]

参数

只有一个-P,如果当前目录是连接档,那么加-P后,会显示正确的完整路径

2)Linux:ls指令 

3)cd:访问目录

用法:cd [绝对路径/相对路径]

参数

参数

说明

相对路径 进入某个相对路径
绝对路径 进入绝对路径下的某个文件夹
.. 返回上一级
~ 回到根目录
- 在上一个目录和本目录来回切换
~user 回到user这个用户的根目录

注意

连接符是/而不是\,这点和Windows刚好相反

4)mkdir:构建新目录

用法:mkdir [-mp] 目录名

参数

  • -m:指定该目录的权限(不然会用默认权限);
  • -p:递归建立该目录(包括它所在的上层目录)。

例子

  • -m指定目录权限
    mkdir -m 711 test1

5)rmdir:删除(空)目录

用法:rmdir [-p] 目录名

参数

  • -p:递归删除这个目录(会删除所有上层空的目录)

6)cp:复制

用法:

  • cp [-adfilprsu] [--preserver=all] 源文件路径 目标文件路径

  • cp [options] 源1 源2 ... 目标文档路径

选项

选项

说明

a 相当于-dr --preserve=all,所有特性(包括所有者)完全复制
d 若源文件为链接文件,那么复制的是链接文件属性而非用文件本身的属性
f 强制,若目标文件已存在,则移除后再尝试一次
i 若目标文件已存在,则会在覆盖时先询问
l 建立硬式连结,而非复制文件本身(此时会采用执行者的特性)
p 连同文件属性一起复制,而不使用新属性
r 递归复制,用于目录的复制
s 复制成符号链接文件,即快捷方式
u 目标文件不存在或比源文件旧时才复制
--preserve=all 除了-p的权限相关参数外,还加入SELinux的属性

说明

  1. 如果有多个源文件,那么目标一定是目录;
  2. 不同身份的人执行这个指令会有不同的结果产生;
  3. cp别人的文件要先有r权限;
  4. 默认情况下,cp后的文件所有者指令操作者本身;
  5. 复制目录必须加选项-r(使用新特性,可能改变权限)或-a(保持原特性);
  6. 可以通过修改目标文件名的方式实现复制+改名;
  7. 如果执行人本身没有修改文件拥有者与群组的权限,那么即使加上-a,他也无法为复制后的文件修改拥有者群组(第三和第四部分)

 例子

①简单复制和覆盖复制

[root@study ~]# cp ~/.bashrc /tmp/bashrc
[root@study ~]# cp -i ~/.bashrc /tmp/bashrc
cp: overwrite `/tmp/bashrc'? n <==n 不覆盖,y 为覆盖

复制并改名(直接修改目标文件名即可)

cp -a wtmp dmtsai_wtmp

②复制前后的属性、特性变化

[root@study ~]# cd /tmp
[root@study tmp]# cp /var/log/wtmp . <==想要复制到当前目录,最后的 . 不要忘
[root@study tmp]# ls -l /var/log/wtmp wtmp
-rw-rw-r--. 1 root utmp 28416 Jun 11 18:56 /var/log/wtmp
-rw-r--r--. 1 root root 28416 Jun 11 19:01 wtmp

如果要保证文件特性不变,应该在复制时加入选项-a或-p,此时看起来像是源文件的镜像

[root@study tmp]# cp -a /var/log/wtmp wtmp_2
[root@study tmp]# ls -l /var/log/wtmp wtmp_2
-rw-rw-r--. 1 root utmp 28416 Jun 11 18:56 /var/log/wtmp
-rw-rw-r--. 1 root utmp 28416 Jun 11 18:56 wtmp_2

③目录复制

需要加选项-r(会改变特性)、-a或-p(保证特性不变)

[root@study tmp]# cp /etc/ /tmp
cp: omitting directory `/etc' <== 如果是目录则不能直接复制,要加上 -r 的选项
[root@study tmp]# cp -r /etc/ /tmp
[root@study tmp]# cp -a /etc/ /tmp

④连结档

硬链接、实体链接:-l,会使文件属性第二项[连接数]增加

符号链接、快捷方式:-s

[root@study tmp]# cp -s bashrc bashrc_slink
[root@study tmp]# cp -l bashrc bashrc_hlink
[root@study tmp]# ls -l bashrc*
-rw-r--r--. 2 root root 176 Jun 11 19:01 bashrc <==与源文件不太一样了!
-rw-r--r--. 2 root root 176 Jun 11 19:01 bashrc_hlink
lrwxrwxrwx. 1 root root 6 Jun 11 19:06 bashrc_slink -> bashrc

7)rm:删除文件或目录

用法:rm [-fir] 路径/正则路径

选项

选项

说明

f force,忽略不存在的文件,不出现警告讯息
i 互动模式,删除前询问
r 递归删除,用于目录删除(危险选项)

说明

  1. 使用正则路径,会删除所有匹配的路径

例子

①正则删除

[root@study tmp]# rm -i bashrc*
# 注意那个星号,代表的是 0 到无穷多个任意字符喔!很好用的东西!

②删除目录,与rmdir的区别

[root@study tmp]# rmdir /tmp/etc
rmdir: failed to remove '/tmp/etc': Directory not empty <== 删不掉啊!因为这不是空的目录!
[root@study tmp]# rm -r /tmp/etc

8)mv:移动(重命名)文件

用法

  • mv [-fiu] 源路径 目标路径

  • mv [options] 源1 源2 源3 ... 目标路径

选项

选项

说明

f force,如果目标文件存在,则直接覆盖
i 若目标文件存在,会询问是否覆盖
u 若目标文件存在,且源文件较新,才会覆盖

说明

  1. 如果有多个来源文件或目录,则最后一个目标文件一定是目录

例子

①常规复制、移动

例一:复制一文件,建立一目录,将文件移动到目录中
[root@study ~]# cd /tmp
[root@study tmp]# cp ~/.bashrc bashrc
[root@study tmp]# mkdir mvtest
[root@study tmp]# mv bashrc mvtest

②更名

范例二:将刚刚的目录名称更名为 mvtest2
[root@study tmp]# mv mvtest mvtest2

还有个rename指令,可以同时对多个文档更名

③一次移动多个文件

[root@study tmp]# mv bashrc1 bashrc2 mvtest2

9)touch:①创建文件;②修改文件时间

用法:touch [-acdmt] 文件

选项

选项

说明

a 修改atime
c 修改ctime
d

修改a、m时间

后接指定的时间而不用当前时间,也可以用--date="日期/时间"

m 修改mtime
t

修改a、m时间

后接指定时间而不用当前时间,格式[YYYYMMDDhhmm]

例子

①常规,新建一个空文件并观察时间

[dmtsai@study tmp]# touch testtouch
[dmtsai@study tmp]# ls -l testtouch
-rw-rw-r--. 1 dmtsai dmtsai 0 Jun 16 00:45 testtouch

②复制,并观察前后文件的时间

[dmtsai@study tmp]# touch -d "2 days ago" bashrc
[dmtsai@study tmp]# date; ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc
Tue Jun 16 00:51:52 CST 2015
-rw-r--r--. 1 dmtsai dmtsai 231 Jun 14 00:51 bashrc
-rw-r--r--. 1 dmtsai dmtsai 231 Jun 14 00:51 bashrc
-rw-r--r--. 1 dmtsai dmtsai 231 Jun 16 00:51 bashrc

变化的是atime和mtime,而ctime没变

 

3、文件内容

1)cat(concatenate):查看文件内容

用法:cat [-AbEnTv] 路径

选项

选项

说明

A 相当于-vET,可以列出一些特输出字符,而非空白
b 显示行号,仅针对非空白行,跳过空白行
E 将结尾的断行符$显示出来
n 显示行号,包括空白行
T 将[TAB]以^I的方式显示出来
v 列出一些看不出来的特殊字符

2)tac:反向显示

用法:同cat

和cat相反,从末行到首行显示

3)nl:添加行号显示

用法:nl [-bnw] 路径

选项

选项

说明

b

指定行号显示的方式:

  • -b a:空行也列出行号,等于cat -n
  • -b t:空行不列出行号(默认)
n

行号显示的位置:

  • -n ln:行号在屏幕左侧显示;
  • -n rn:行号在字段右侧显示,不加0
  • -n rz:行号在字段右侧显示,加0
w 设置行号字段共有多少位(默认6位,不足补0,即-n rz)

例子

①常规显示(不显示空白行行号)

[root@study ~]# nl /etc/issue
1 \S
2 Kernel \r on an \m

显示空白行行号

[root@study ~]# nl -b a /etc/issue
1 \S
2 Kernel \r on an \m
3

②行号补0

[root@study ~]# nl -b a -n rz /etc/issue
000001 \S
000002 Kernel \r on an \m
000003

③设置行号有几位

[root@study ~]# nl -b a -n rz -w 3 /etc/issue
001 \S
002 Kernel \r on an \m
003

4)more:一页一页翻页显示

cat、tac、nl是全部显示,如果文件较大则显示不了前边的数据。

用法:more 路径

按键

按键

说明

空格、b 向下翻页、向上翻页
Enter 向下翻一行
/word 查找word
:f 显示出文件名及当前行数
q 退出

5)less:一页一页翻页显示

比more更灵活,可以往回翻页

用法:less 路径

按键

这里的按键就是vim命令模式下的按键

按键

说明

空格  向下翻页
pagedown/pageup 向下/上翻页 
/word 向下查找word 
?word 向上查找word 
n  重复上一次查找结果,并向下移动至下一个查找到的word字符首
N  重复上一次查找结果,并向上移动至下一个查找到的word字符首
使用/word + n/N可以实现不停地向上/向下定位到某个想要字符处
g 移动至文档首行
G  移动至文档尾行
q 退出less 

6)head/tail:取首/尾若干行(默认10行)

用法:

  • head/tail [-n number] 路径:取首/尾若干行(默认10行)

  • tail -f 路径:持续输出(如果某个文件有持续写入时)

例子

①常规使用

# 默认显示前面十行
[root@study ~]# head /etc/man_db.conf

#显示前 20 行
[root@study ~]# head -n 20 /etc/man_db.conf

②head -n 负号:不显示后n行

tail -n 正号:不显示前n行

#不显示后100行
[root@study ~]# head -n -100 /etc/man_db.conf
#不显示前100行
[root@study ~]# tail -n +100 /etc/man_db.conf

③tail -f:持续打印

④显示中间若干行 head -n 数字 | tail -n 数字

#取11~20行
head -n 20 /etc/man_db.conf | tail -n 10

7)od:非文本文件(数据文件data file或者二进制文件binary file)

用法:od [-t TYPE] 路径

选项

TYPE(n代表每个数字占用的字符)

输出为哪种类型

a 默认字符
c ASCII字符
d[n] 十进制
f[n] 浮点数
o[n] 八进制
x[n] 十六进制

例子

①常规使用

#将/usr/bin/passwd 的内容使用ASCII 方式来展现
[root@study ~]# od -t c /usr/bin/passwd

②多选项,对照显示

#将/etc/issue 这个文件的内容以8 进位列出储存值与ASCII 的对照表
[root@study ~]# od -t oCc /etc/issue
0000000 134 123 012 113 145 162 156 145 154 040 134 162 040 157 156 040
      \  S   \n  K   e   r   n   e   l   \   r   o   n
0000020 141 156 040 134 155 012 012
a n \ m \n \n
0000027

4、权限

  • r-4
  • w-2
  • x-1

新文件的默认权限为(默认无执行权限):(-rw-rw-rw-) - umask 

新目录的默认权限为:(drwxrwxrwx) - umask

文件权限

  • r:读取
  • w:编辑、改变其中内容(而非文件本身属性)
  • x:被系统执行

Linux系统下,文件可否执行不由扩展名.exe、.bat等决定,而由是否具有权限X决定

一般来说,文件权限有w或x一般要有前置权限r。

目录权限

  • r:读取目录结构列表(该目录下的文件名数据)的权限,可以通过ls将该目录的内容列表显示
  • w:异动目录结构列表的权限(以下操作均是对该目录下的文件和目录开展的):
    • 建立新文件及目录;
    • 删除文件及目录;
    • 更名;
    • 移动。
  • x:并非可执行该目录的意思,而是是否可以通过cd进入该目录,使其成为工作目录

目录的三个权限互相独立,就算没r权限也可以有wx,只是没r就无法用tab进行文件名补全了

  • 在架设网站给人浏览目录时,应至少给予r、x权限,因为不给x就无法到该目录下读取文件
  • 某个文件时,就要具备这个文件所在目录的x权限;
  • 创建文件时,应至少具有它所在目录的wx权限

权限与指令

指令

目录权限

(至少拥有的权限)

文件权限

(至少拥有的权限)

cd 目录

x  

cp

源目录:x

目标目录:x、w

r
ls 目录   r  

 读取文件

cat、more、less

 r

 修改

nano、vim

 x  r、w
建立文件  w(必须)、x(有时不用)   
cd目录并执行某个指令  x  x

 

说明

文件目录是按层次排列的,例如:/home/student/www/index.html,权限也是一层层识别的,如果没有进入上层结构的权限(目录x权限),那么对下层的各种操作就都没有权限了。

 

1)chgrp:修改群组

用法:chgrp [-R] dirname/filename ...

选项

  • -R 递归变更,持续变更目录下的所有文件

说明

  • 组名必须在/etc/group中存在(不存在会报错invalid group

2)chown:修改所有者

用法

  • chown [-R] 所有者 文件或目录

  • chown [-R] 所有者:组名 文件或目录

选项

  • -R 递归变更,持续变更目录下的所有文件

说明

  • 用户必须在/etc/passwd中存在

例子

容器创建时,需要修改/applog所属用户:用户组dcos:docker

chown dcos:docker /applog

 

3)chmod:修改权限

用法:

  • chmod [-R] 数字权限 文件或目录
  • chmod [-ugoa] [+-=][rwx] 文件或目录

选项

  • -R 递归变更同次目录下的所有文件
  • xyz 权限代表的数字,每个角色都有一个数字,rwx=7,---=0
  • u:user/owner
  • g:group
  • o:other
  • a:all

例子

将.bashrc的所有权限都设定为启用

chmod 777 .bashrc

②将.bashrc的user权限设置为rwx,group和other权限设置为rx,即文件权限为rwxr-xr-x

chmod u=rwx,go=rx .bashrc

③将.bashrc的权限设置为-rwxr-xr--

chmod u=rwx,g=rx,o=r .bashrc

④如果只是去除权限而不修改其它权限

chmod a-x .bashrc

4)umask:建立文件或目录时的默认权限

用法

①查看

  • umask:数字形式

  • umask -S:符号形式

②修改

  • umask 3位数字权限

例子

①正常用法

[root@study ~]# umask
0022 <==与一般权限有关的是后面三个数字!
[root@study ~]# umask -S
u=rwx,g=rx,o=rx

数字权限中的第一个数字是特殊权限,后三个才是一般权限

5、PATH

查询:echo $PATH

修改:PATH="${PATH}:绝对路径"

说明

  • 只有位于PATH下的指令可以直接通过指令访问,位于其他路径下的指令只能通过路径/指令的方式执行;
  • 如果要让别的路径下的指令(也是可执行文件名)也能直接通过指令的方式访问,则要把该路径加入PATH;
  • 为了安全起见,不建议把当前目录.加入PATH。

6、查找、搜寻

1)which:(在PATH下)查找命令的绝对路径

用法:which [-a] 命令

选项

  • a:将所有从PATH中找到的命令全部列出,而不止第一个;

例子

①查找ifconfig

[root@study ~]# which ifconfig
/sbin/ifconfig

②which which

[root@study ~]# which which
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
/bin/alias
/usr/bin/which
# 竟然会有两个 which ,其中一个是 alias 这玩意儿呢!那是啥?
# 那就是所谓的『命令别名』,意思是输入 which 会等于后面接的那串指令啦!

③能调用某个命令,但却查找不到,例如history

[root@study ~]# which history
/usr/bin/which: no history in (/usr/local/sbin:/usr/local/bin:/sbin:/bin:
/usr/sbin:/usr/bin:/root/bin)

这是因为history是bash内建的指令,而which找的是PATH下的所有目录。对于这类指令就要用type指令

2)whereis:从一些特定目录中查找文件

用法:whereis [-lbmsu] 路径

选项

选项

说明

l 列出查找路径
b 只找binary文件
m 只找在man路径下的文件
s 只找source源文件
u 搜寻不在上述选项中的文件

3)locate/updatedb:利用数据库来搜寻文件名

locate:依据/var/lib/mlocate 内的数据库记载,找出用户输入的关键词文件名;

updatedb:根据/etc/updatedb.conf 的设定去搜寻系统硬盘内的文件名,并更新/var/lib/mlocate 内的数据库文件。

用法:locate [-iclSr] 指令

选项

选项

说明

i 忽略大小写
c 仅计算数量,不详细输出
l 输出几行,5行就是-l 5
S locate所用数据库的信息
r 后接正规表达式

例子

①找出系统中与passwd相关的文档,只列出5个

[root@study ~]# locate -l 5 passwd
/etc/passwd
/etc/passwd-
/etc/pam.d/passwd
/etc/security/opasswd
/usr/bin/gpasswd

②查询所使用的数据库信息

[root@study ~]# locate -S
Database /var/lib/mlocate/mlocate.db:
8,086 directories # 总纪录目录数
109,605 files # 总纪录文件数
5,190,295 bytes in file names
2,349,150 bytes used to store database

说明

  • 支持模糊查询,指令名可以不打全
  • 数据库有更新频率,所以存在查询旧版本的问题;
  • 输入指令updatedb更新数据库

4)find:查找

从各个方向(类型、时间、所有人……)查找

用法:find 路径 选项 动作

选项与例子:

  • 时间:atime、ctime、mtime

    以 -mtime 说明,注意 +-号
    -mtime n :n 为数字,意义为在 n 天之前的『一天之内』被更动过内容的文件;<=1
    -mtime +n :列出在 n 天之前(不含 n 天本身)被更动过内容的文件档名;>n
    -mtime -n :列出在 n 天之内(含 n 天本身)被更动过内容的文件档名。<=n
    -newer filefile 为一个存在的文件,列出比 file 还要新的文件档名

    例子

    #将过去系统上面 24 小时内有更动过内容 (mtime) 的文件列出
    [root@study ~]# find / -mtime 0
    # 那个 0 是重点!0 代表目前的时间,所以,从现在开始到 24 小时前,
    # 有变动过内容的文件都会被列出来!那如果是三天前的 24 小时内?
    # find / -mtime 3 有变动过的文件都被列出的意思!
    
    #寻找 /etc 底下的文件,如果文件日期比 /etc/passwd 新就列出
    [root@study ~]# find /etc -newer /etc/passwd
    # -newer 用在分辨两个文件之间的新旧关系是很有用的!

  • 使用者或组名

    选项

    说明

    -uid n UID
    -gid n  GID
    -user name  用户名
    -group name 组名
    -nouser  寻找不属于该系统中任何人的文件
    -nogroup  寻找不属于该系统中任何群组的文件

    当你自行安装软件时,很可能该软件的属性当中并没有文件拥有者, 这是可能的!在这个时候,就可以使用 -nouser 与 -nogroup 搜寻。

    例子

    #搜寻 /home 底下属于 dmtsai 的文件
    [root@study ~]# find /home -user dmtsai
    # 这个东西也很有用的~当我们要找出任何一个用户在系统当中的所有文件时,
    # 就可以利用这个指令将属于某个使用者的所有文件都找出来喔!
    #搜寻系统中不属于任何人的文件
    [root@study ~]# find / -nouser
    # 透过这个指令,可以轻易的就找出那些不太正常的文件。如果有找到不属于系统任何人的文件时,
    # 不要太紧张,那有时候是正常的~尤其是你曾经以原始码自行编译软件时。
  • 文件权限

    选项

    说明

    -name filename 文件名为filename(可用通配符)
    -size [+-]SIZE 比SIZE大(+)或小(-),比50KB大--size +50K
    -type TYPE 文件类型:f b c d l s p
    -perm mode 权限刚好等于mode,mode为4位的权限数字
    -perm -mode 权限涵盖mode
    -perm /mode 包含任一mode的权限

    例子

    范例五:找出档名为 passwd 这个文件
    [root@study ~]# find / -name passwd
    范例五-1:找出文件名包含了 passwd 这个关键词的文件
    [root@study ~]# find / -name "*passwd*"
    # 利用这个 -name 可以搜寻档名啊!默认是完整文件名,如果想要找关键词,
    # 可以使用类似 * 的任意字符来处理
    范例六:找出 /run 目录下,文件类型为 Socket 的檔名有哪些?
    [root@study ~]# find /run -type s
    # 这个 -type 的属性也很有帮助喔!尤其是要找出那些怪异的文件,
    # 例如 socket 与 FIFO 文件,可以用 find /run -type p 或 -type s 来找!
    范例七:搜寻文件当中含有 SGID 或 SUID 或 SBIT 的属性
    [root@study ~]# find / -perm /7000
    # 所谓的 7000 就是 ---s--s--t ,那么只要含有 s 或 t 的就列出,所以当然要使用 /7000,
    # 使用 -7000 表示要同时含有 ---s--s--t 的所有三个权限。而只需要任意一个,就是 /7000

动作

  • -exec 指令:使用别的指令处理搜寻到的结果
  • -print:默认,将结果打印
    例子
    #将上个范例找到的文件使用 ls -l 列出来
    [root@study ~]# find /usr/bin /usr/sbin -perm /7000 -exec ls -l {} \;
    # 注意到,那个 -exec 后面的 ls -l 就是额外的指令,指令不支持命令别名,
    # 所以仅能使用 ls -l 不可以使用 ll


    对例子的说明

    • { }代表find找到的内容,上例中,find的结果会被放在{ }中;

    •  

      由于;在bash环境下有特殊意义,因此要用/转义。 

多条件并列查询

#多条件查询
#-a表示and -o表示or
find /home -name '1*' -a -type f 

说明

  • 与locate和whereis相比,find要查找硬盘,因此速度不如这二者;

7、文件系统

1)df:整体磁盘使用量

用法:df [-ahikHTm] [路径]

选项

选项

说明

以KB为单位列出系统内所有的文件系统(不包括特殊内存内的文件系统和swap)
a 列出所有文件系统,包括系统持有的/proc等文件系统
k 以KB为单位显示
m 以MB为单位显示
h 以较易阅读的GB、MB、KB等格式自行显示
H 以M=1000K取代1024K的进位方式
T 连同该partition的文件系统类型(如xfs)也显示出来
i 不用磁盘容量,而用inode的数量来显示

例子

①列出系统中的全部文件系统

每列含义:

  • Filesystem:该文件系统在哪个partition
  • 1K-blocks:下边的数字单位
  • Used:用掉的空间
  • Available:剩下的空间
  • Use%:磁盘使用率
  • Mounted on:磁盘挂载目录

②将容量以易读的容量格式显示出来

③将系统内所有特殊文件格式及名称都列出来

[root@study ~]# df -aT
Filesystem Type 1K-blocks Used Available Use% Mounted on
rootfs rootfs 10475520 3409368 7066152 33% /
proc proc 0 0 0 - /proc
sysfs sysfs 0 0 0 - /sys
devtmpfs devtmpfs 627700 0 627700 0% /dev
securityfs securityfs 0 0 0 - /sys/kernel/security
tmpfs tmpfs 637568 80 637488 1% /dev/shm
devpts devpts 0 0 0 - /dev/pts
tmpfs tmpfs 637568 24684 612884 4% /run
tmpfs tmpfs 637568 0 637568 0% /sys/fs/cgroup
.....(中间省略).....
/dev/mapper/centos-root xfs 10475520 3409368 7066152 33% /
selinuxfs selinuxfs 0 0 0 - /sys/fs/selinux
.....(中间省略).....
/dev/mapper/centos-home xfs 5232640 67720 5164920 2% /home
/dev/vda2 xfs 1038336 133704 904632 13% /boot
binfmt_misc binfmt_misc 0 0 0 - /proc/sys/fs/binfmt_misc
# 系统里面其实还有很多特殊的文件系统存在的。那些比较特殊的文件系统几乎
# 都是在内存当中,例如 /proc 这个挂载点。因此,这些特殊的文件系统
# 都不会占据磁盘空间喔!

④将/etc下的可用磁盘容量以易读的容量格式显示

[root@study ~]# df -h /etc
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 10G 3.3G 6.8G 33% /
#在 df 后面加上目录或者是文件时, 
# df会自动的分析该目录或文件所在的 partition ,并将该 partition 的容量显示出来,
# 所以,您就可以知道某个目录底下还有多少容量可以使用了!

⑤将各个partition中可用的inode数量列出

#将目前各个 partition 当中可用的 inode 数量列出
[root@study ~]# df -ih
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/centos-root 10M 108K 9.9M 2% /
devtmpfs 154K 397 153K 1% /dev
tmpfs 156K 5 156K 1% /dev/shm
tmpfs 156K 497 156K 1% /run
tmpfs 156K 13 156K 1% /sys/fs/cgroup
# 这个范例则主要列出可用的 inode 剩余量与总容量。通常 inode 的数量剩余都比 block 还要多呢

2)du:评估文件系统的磁盘使用量

用法:du [-ahskm] 路径

选项

选项

说明

统计当前目录下的各目录容量
a 列出当前目录下的所有的文件和目录容量
h 以人们较易读的容量格式显示
s 列出总量,而不列出个别目录占用容量
S 不包括子目录下的总计
k 以KB作为容量单位
m 以MB作为容量单位

说明

  • 如果要知道该目录占了多少容量的话,使用-s就可以了
  • 至于-S 这个选项部分,由于du 默认会将所有文件的大小均列出,假设在/etc使用du 时, 所有的文件大小,包括/etc下的次目录容量也会被计算一次。然后最终的容量(/etc) 也会加总一次, 因此很多人会误会du分析的结果不太对劲。所以啰,如果想要列出某目录下的全部数据, 也可以加上 -S 的选项,减少次目录的加总。

例子

①列出当前目录下的所有目录容量

[root@study ~]# du
4 ./.cache/dconf <==每个目录都会列出来
4 ./.cache/abrt
8 ./.cache
....(中间省略)....
0 ./test4
4 ./.ssh <==包括隐藏文件的目录
76 . <==这个目录(.)所占用的总量
# 直接输入 du 没有加任何选项时,则 du 会分析『目前所在目录』
# 的文件与目录所占用的磁盘空间。但是,实际显示时,仅会显示目录容量(不含文件),
# 因此 . 目录有很多文件没有被列出来,所以全部的目录相加不会等于 . 的容量喔!

②列出当前目录下的所有目录和文件容量

[root@study ~]# du -a
4 ./.bash_logout <==有文件的列表了
4 ./.bash_profile
4 ./.bashrc
....(中间省略)....
4 ./.ssh/known_hosts
4 ./.ssh
76 .

③检查根目录下每个目录占用的容量

[root@study ~]# du -sm /*
0 /bin
99 /boot
....(中间省略)....
du: cannot access ‘/proc/17772/task/17772/fd/4’: No such file or directory
du: cannot access ‘/proc/17772/fdinfo/4’: No such file or directory
0 /proc <==不会占用硬盘空间!
1 /root
25 /run
....(中间省略)....
3126 /usr <==系统初期最大就是他了啦!
117 /var
# 这是个很常被使用的功能~利用通配符 * 来代表每个目录,如果想要检查某个目录下,
# 哪个次目录占用最大的容量,可以用这个方法找出来。值得注意的是,如果刚刚安装好 Linux 时,
# 那么整个系统容量最大的应该是 /usr 。而 /proc 虽然有列出容量,但是那个容量是在内存中,
# 不占磁盘空间。至于 /proc 里头会列出一堆『No such file or directory』 的错误,
# 别担心!因为是内存内的程序,程序执行结束就会消失,因此会有些目录找不到,是正确的!

 

 3)ln:建立链接

原理:实体链接与符号链接

用法:ln [-sf] 路径1 路径2(只能文件,不能是目录)

构建链接后,访问路径2,实际上是访问路径1

选项

  • s:不加s,硬链接;加s,符号链接;

  • f:如果目标文件存在,就将目标文件移除后再建立;

说明:

  • 把路径2链接到路径1,两个文件除了名字不同外,别的信息都相同;

  • 链接后,两个文件的第二个字段(表示链接数)都会+1;
  • 实体链接前后,磁盘空间与inode的数目都不变,只是在某个目录下的block多写入一个关联数据;符号链接会改变容量与inode;
  • 不能链接目录

限制

  • 不能跨文件系统
  • 不能链接目录

例子:

①实体链接

[root@study ~]# ll -i /etc/crontab
34474855 -rw-r--r--. 1 root root 451 Jun 10 2014 /etc/crontab
[root@study ~]# ln /etc/crontab . <==建立实体链接的指令
[root@study ~]# ll -i /etc/crontab crontab
34474855 -rw-r--r--. 2 root root 451 Jun 10 2014 crontab
34474855 -rw-r--r--. 2 root root 451 Jun 10 2014 /etc/crontab

②符号链接/快捷方式

[root@study ~]# ln -s /etc/crontab crontab2
[root@study ~]# ll -i /etc/crontab /root/crontab2
34474855 -rw-r--r--. 2 root root 451 Jun 10 2014 /etc/crontab
53745909 lrwxrwxrwx. 1 root root 12 Jun 23 22:31 /root/crontab2 -> /etc/crontab
  • 两个文件指向不同的inode,说明两个文件独立存在。
  • 连结档的大小为12bytes,因为->右边的档名[/tec/crontab]共有12个英文,每个英文占用1B,因此文件大小就是12B

4)lsblk:list block device列出系统上的所有磁盘列表

用法:lsblk [-dfimpt] [device]

选项:

选项

说明

d 仅列出磁盘本身,不会列出该磁盘的分区数据
f 同时列出该磁盘内的文件系统名称(UUID)
i 使用ASCII的线段输出,不使用复杂编码
m 同时输出该装置在/dev下的权限数据
p 列出该装置的完整文件名
t 列出该磁盘的详细数据

例子

①默认

[root@study ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 1024M 0 rom
vda 252:0 0 40G 0 disk # 一整颗磁盘
|-vda1 252:1 0 2M 0 part
|-vda2 252:2 0 1G 0 part /boot
`-vda3 252:3 0 30G 0 part
|-centos-root 253:0 0 10G 0 lvm / # 在 vda3 内的其他文件系统
|-centos-swap 253:1 0 1G 0 lvm [SWAP]
`-centos-home 253:2 0 5G 0 lvm /home

该系统有个sr0以及一个vda,vda之下又有三个分区,vda3之下还有因为LVM产生的文件系统。

默认输出:

  • NAME:装置的文件名,会省略/dev 等前导目录!
  • MAJ:MIN:主要:次要装置代码
  • RM:是否为可卸除装置(removable device),如光盘、USB 磁盘等等
  • SIZE:容量
  • RO:是否为只读装置
  • TYPE:类别,如磁盘(disk)、分区槽(partition) 、只读存储器(rom) 等
  • MOUTPOINT:挂载点

范例二:仅列出 /dev/vda 装置内的所有数据的完整文件名
[root@study ~]# lsblk -ip /dev/vda
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
/dev/vda 252:0 0 40G 0 disk
|-/dev/vda1 252:1 0 2M 0 part
|-/dev/vda2 252:2 0 1G 0 part /boot
`-/dev/vda3 252:3 0 30G 0 part
|-/dev/mapper/centos-root 253:0 0 10G 0 lvm /
|-/dev/mapper/centos-swap 253:1 0 1G 0 lvm [SWAP]
`-/dev/mapper/centos-home 253:2 0 5G 0 lvm /home # 完整的檔名,由 / 开始写

5)blkid:列出装置的UUID等参数

用法:blkid

说明:列出装置的UUID(Universally Unique Identifier),它叫全局单一标识符,等同于lsblk -f。Linux会为系统中的所有装置给予一个独一无二的标识符,这个标识符可以用来作为挂载或者使用这个装置。

 例子

[root@study ~]# blkid
/dev/vda2: UUID="94ac5f77-cb8a-495e-a65b-2ef7442b837c" TYPE="xfs"
/dev/vda3: UUID="WStYq1-P93d-oShM-JNe3-KeDl-bBf6-RSmfae" TYPE="LVM2_member"
/dev/sda1: UUID="35BC-6D6B" TYPE="vfat"
/dev/mapper/centos-root: UUID="299bdc5b-de6d-486a-a0d2-375402aaab27" TYPE="xfs"
/dev/mapper/centos-swap: UUID="905dc471-6c10-4108-b376-a802edbd862d" TYPE="swap"
/dev/mapper/centos-home: UUID="29979bf1-4a28-48e0-be4a-66329bf727d9" TYPE="xfs"

每一行都代表一个文件系统,主要列出装置名称、UUID名称、文件系统类型(TYPE)

6)parted:列出磁盘的分区表类型和分区信息

用法:parted 装置名 print

例子

[root@study ~]# parted /dev/vda print
Model: Virtio Block Device (virtblk) # 磁盘的模块名称(厂商)
Disk /dev/vda: 42.9GB # 磁盘的总容量
Sector size (logical/physical): 512B/512B # 磁盘的每个逻辑/物理扇区容量
Partition Table: gpt # 分区表的格式 (MBR/GPT)
Disk Flags: pmbr_boot
Number Start End Size File system Name Flags # 底下才是分区数据
1 1049kB 3146kB 2097kB bios_grub
2 3146kB 1077MB 1074MB xfs
3 1077MB 33.3GB 32.2GB lvm

7)磁盘分区:gdisk/fdisk

说明

  • fdisk:MBR分区

  • gdisk:GPT分区

 

 

posted @ 2021-04-01 21:52  ShineLe  阅读(15)  评论(0编辑  收藏  举报