Linxu的读书笔记
一些比较特殊的目录:
. 代表此层目录
.. 代表上层目录
- 代表前一个工作目录
~ 代表目前用户所在的主文件夹
~account 代表account这个用的主文件夹夹
目录的相关操作
cd(切换目录)
pwd(显示目前所在的目录)
$ pwd [-P]
#参数 -P:显示当前的路径,而非使用连接(link)路径
mkdir(新建新目录)
$ mkdir [-mp] 目录名称
#参数 -m: 配置文件的权限,直接设置,不需要看默认权限
#参数 -p: 直接将所需要的目录(包含上层目录)递归创建起来。
#例如创建权限为rwx--x--x的目录
$ mkdir -m 711 test2
#要创建多层目录
$ mkdir -p test1/test2/test3/test4
rmdir(删除空的目录)
$ rmdir [-p] 目录名称
#参数 -p: 连同上层空的目录也一起删除
#例如要删掉上面创建的多层目录
$ rmdir -p test1/test2/test3/test4
注意,这个rmdir仅能删除空的目录。如果是要将目录下的东西都删掉,使用:rm -r test
关于执行文件路径的变量:$PATH
当我们执行一个命令时,例如 ls,系统会依照PATH的设置去每个PATH定义的目录下查询文件名为ls的可执行文件,如果在PATH定义的目录下含有多个文件名为ls的可执行文件,那么先查询到的同名命令先被执行。
# 可以使用echo $PATH看哪些目录被定义
$ echo $PATH
输出:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/lib/jvm/java-8-oracle/bin:/usr/lib/jvm/java-8-oracle/db/bin:/usr/lib/jvm/java-8-oracle/jre/bin
每个目录之间用冒号: 隔开,每个目录都有顺序之分
对于要执行不在PATH变量设置的目录的命令,
可以使用绝对路径来执行该命令。
或者去到命令的执行文件目录下,用“./command”(例如“./ls”)来执行
如果想要在任何目录下均可执行命令,则需要将命令的可执行文件路径加入到PATH当中。
$ PATH="$PATH":/目录
文件与目录管理
ls(查看文件与目录)
$ ls [-aAdfFhilnrRSt] 目录名称
$ ls [--color={never,auto,always}] 目录名称
$ ls [--full-time] 目录名称
#参数-a: 全部文件,连同隐藏文件(.开头的文件)一起列出来
# -A: 列出全部的文件,连同隐藏文件,但不包含. 和 ..这两个目录
# -d: 仅列出目录本身,而不是列出目录内的文件数据
# -f: 直接列出结果而不进行排序(ls默认会以文件名排序)
# -F: 根据文件、目录等信息给予附加数据结构,如*代表可执行文件,/代表目录,=代表socket文件,|代表FIFO文件
# -h: 将文件容量以人类较易读的方式(如GB、KB等)列出来
# -i: 列出inode号码
# -l: 列出长数据串,包含文件的属性与权限等数据
# -n: 列出UID与GID,而非用户与用户组的名称
# -r: 将排序结果反向输出,例如原本文件名由小到大,反向则为由大到小
# -R: 连同子目录内容一起列出来,等于该目录下的所有文件都会显示出来
# -S: 以文件容量大小排序
# -t: 以时间排序
# --color=never: 不要依据文件特性给予颜色显示
# --color=always: 显示颜色
# --color=auto: 让系统自行依据设置来判断是否给予颜色
# --full-time: 以完整时间模式(包含年、月、日、时、分)输出
# --time=[atime,ctime]: 输出访问时间或更改权限属性时间(ctime),而非内容更改时间
复制、删除与移动:cp、rm、mv
cp(复制文件)
cp命令除了复制文件,还可以创建链接文件(快捷方式),对比两个文件的新旧而予以更新,以及复制整个目录等功能。
$ cp [-adfilprsu] 源文件 目标文件
$ cp [options] source1 source2 source3 .... directory
# 参数 -a: 复制文件的所有特性,包括所属用户、权限、时间等(如果操作的用户没有修改文件的所有者和用户组权限,无法复制所属用户,只能复制权限时间等属性)
# -d: 若源文件为连接文件的属性,则复制连接文件属性而非文件本身
# -f: 强制复制,若目标文件已经存在且无法开启,则删除后再尝试一次
# -i:若目标文件已经存在,在覆盖时会先询问操作的进行
# -l: 进行硬连接的连接文件创建,而非复制文件本身
# -p: 连同文件的属性一起复制过去,而非使用默认属性
# -r: 递归持续复制,用于目录的复制行为
# -s: 复制成为符号连接文件,即快捷方式文件
# -u: 若目标文件比源文件旧才更新目标文件
# 如果源文件有两个以上,则最后一个目的文件一定要是目录才行
rm(移除文件或目录)
$ rm [-fir] 文件或目录
# 参数 -f: 强制删除,忽略不存在的文件,不会出现警告信息
# -i: 互动模式,在删除前会询问用户是否操作
# -r: 递归删除,最常用在目录的删除,这是比较危险的参数
# 如果要删除的文件文件名开头带着-,例如“-”,需要把删除的文件路径写出来,避免被系统误判为参数,例如“rm ./-aaa-”或者“rm -- -aaa-”
mv(移动文件与目录,或更名)
$ mv [-fiu] 源文件 目标文件
$ mv [option] source1 source2 source3 ... directory
# 参数 -f: 强制移动,如果目标文件已经存在,不会询问直接覆盖
# 参数 -i: 若目标文件已经存现,就会询问是否覆盖
# -u: 若目标文件已经存在,且source比较新,才会更新
# 如果有多个源文件或目录,则最后一个目标文件一定是“目录”,意思是将所有的数据移动到该目录
取得路径的文件名和目录名称
#取得文件名
$ basename /etc/sysconfig/network
# 结果:network
#取得目录名
$ dirname /etc/sysconfig/network
# 结果:/etc/sysconfig
文件内容查阅
直接查看文件内容
cat(由第一行开始显示文件内容)
$ cat [-AbEnTv]
# 参数 -A: 相当于-vET的整合参数,可列出一些特殊的字符,而不是空白而已
# -b: 列出行号,仅针对非空白行做行号显示,空白行不标行号
# -E: 将结尾的断行字符$显示出来
# -n:打印出行号,连同空白行也会有行号,与-b的参数不同
# -T: 将[Tab]按键以^I显示出来
# -v: 列出一些看不出来的特殊字符
#例如,
$ cat /etc/issue
tac(反向列示)
由最后一行到第一行反向在屏幕上显示出来
$ tac /etc/issue
nl(添加行号打印)
$ nl [-bnw] 文件
# 参数 -b:-b a 表示无论是否为空行,也同样列出行号
# -b t 表示如果有空行,空的那一行不要列出行号
# -n: -n ln 表示行号在屏幕的最左方显示
# -n rn 表示行号在自己字段的最右方显示,且不加0
# -n rz 表示行号在自己字段的最右方显示,且加0
# -w: 行号字段占用的位数,例如 nl -w 3 /etc/issue 表示行号占用3位
可翻页查看
more(一页一页翻动)
$ more /etc/man.config
如果more后面接的文件内容大于屏幕输出的行数,可以用以下按键进行一些操作:
空格键:代表向下翻一页
Enter: 代表向下滚动一行
/字符串: 代表在显示的内容当中,向下查询“字符串”这个关键字,如果要重复查询同个字符串,可以按下n
:f 立刻显示出文件名以及目前显示的行数
q 代表立刻离开more,不再显示该文件内容
b或者[ctrl]-b 代表往回翻页,不过这操作只对文件有用,对管道无用
less(一页一页翻动)
$ less /etc/man.config
查询命令包括:
空格键:向下翻动一页
[PageDown]: 向下翻动一页
[PageUp]: 向上翻动一页
/字符串:向下查询字符串
?字符串:向上查询字符串
n: 重复查询同个字符串(与/或?有关)
N: 反向重复查询同个字符串
q: 离开less这个程序
数据选取
head(取出前面几行)
$ head [-n number] 文件
# 参数 -n: 后面接数字,代表显示几行,默认情况下,显示10行
# 例如
$ head -n 20 /etc/man.config
# 如果是后面100行都不打印,只打印前面几行
$ head -n -100 /etc/man.config
tail(取出后面几行)
$ tail [-n number] 文件
# 参数 -n: 后面接数字,代表显示几行的意思,默认显示最后的10行
# -f: 表示持续检查后面所接的文件名,要等到按[ctrl]-c才会结束tail的检测
# 例如
$ tail -n 20 /etc/man.config
# 如果只想列出100行以后的数据
$ tail -n +100 /etc/man.config
# 如果想显示/etc/man.config的第11到20行
$ head -n 20 /etc/man.config | tail -n 10
# 这个涉及到管道命令
非纯文本文件:od
如果我们想查的文件不是文本文件,可以使用od命令行来查
$ od [-t TYPE] 文件
TYPE包括以下几种:
a: 利用默认的字符来输出
c: 利用ASCII字符来输出
d[size]: 利用十进制来输出,每个整数占用size bytes
f[size]: 利用浮点数来输出,每个整数占用size bytes
o[size]: 利用八进制来输出,每个整数占用size bytes
x[size]: 利用十六进制来输出,每个整数占用size bytes
修改文件时间或者创建新文件:touch
文件有3种类型的时间
- modification time(mtime)
当文件内容数据更改时,就会更改这个时间
- status time(ctime)
当文件的状态改变时,就会更改这个时间,例如权限与属性被更改
- access time(atime)
当文件的内容被取用,就会更改这个读取时间,例如用cat去读取文件
默认情况下,ls显示出来是该文件的mtime
$ touch [-acdmt] 文件
# 参数 -a: 仅修改访问时间
# -c: 仅修改文件的时间,当文件不存在则不创建新文件
# -d: 后面可以接欲修改的日期而不用目前的日期,也可以使用-date="日期和时间"
# -m: 仅修改mtime
# -t: 后面可以接欲修改的时间而不用目前的时间,格式为[YYMMDDhhmm]
文件与目录的默认权限与隐藏权限
umask(文件默认权限)
umask就是指定目前用户在新建文件或者目录时候的权限默认值
# 显示默认的新建文件或者目录权限
$ umask
# 0002 权限与后3位数有关,分数代表的是该默认值需要减掉的权限,即user是0,它没有被拿掉权限,所以需要拿掉的权限---,group也是0,代表需要拿掉的权限---,other是2,代表被拿掉了执行的权限,那么它需要拿掉的权限-w-
# 加上参数 -S,可以以符号类型类显示默认权限
$ umask -S
# u=rwx,g=rwx,o=rx
新建文件时:(-rw-rw-rw-)-(--------w-) = -rw-rw-r--
新建目录时:(drwxrwxrwx)-(d-------w-) = drwxrwxr-x
# 如果要改umask默认值,直接在后面加上值
$ umask 002
这个在假设文件服务器时,例如FTP server,很重要,牵涉到你的用户是否能够将文件进一步利用的问题。
chattr(设置文件的隐藏属性)
文件还有一些隐藏属性,可以用chattr来设置,不过这个命令只能在Ext2/Ext3的文件系统上面生效
$ chattr [+-=][ASacdistu] 文件或目录名称
参数:
+: 增加某一特殊参数,其他原本存在参数则不动
-: 删除某一特殊参数,其他原本存在参数则不动
=: 仅有后面的参数
A: 设置了A这个属性时,若你有访问此文件时,它的访问时间atime将不会被修改,可避免I/O较慢的机器过渡访问磁盘,这对速度较慢的计算机有帮助。
S: 一般文件是异步写入磁盘的,如果加上这个S属性,当你进行任何文件的修改,该改动会同步写入磁盘中。
a: 这个文件只能增加数据,不能删除或者修改数据,只有root才能设置这个属性。
c: 自动将文件压缩,在读取的时候将会自动解压缩,在存储时会先进行压缩后再存储。
d: 当dump程序被执行时,设置d属性将可使该文件不会被dump备份。
i: 让一个文件不能被删除、改名、设置连接也无法写入或添加数据,只有root能设置此属性。
s: 如果文件被删除,它将被完全从这个硬盘空间中删除。
u: 与s相反,如果文件被删除,则数据内容其实还存在磁盘中,可以使用来找回该文件。
属性设置常见的是a 和 i,只有root才能设置
#例如
$ touch test
$ chatter +i test
这时文件无法删除
$ chatter -i test
lsattr(显示文件隐藏属性)
$ lsattr [-adR] 文件或目录
参数:
-a: 将隐藏文件的属性也显示出来
-d: 如果接的是目录,仅列出目录本身的属性而非目录内的文件名
-R: 连同子目录的数据也一并列出
Set UID
我们可以看到/usr/bin/passwd的目录出现了s的权限,这个是SUID的特殊权限
root@5195bf486175:/tmp# ls -ld /tmp; ls -l /usr/bin/passwd
drwxrwxrwt 4 root root 4096 Dec 13 00:20 /tmp
-rwsr-xr-x 1 root root 59640 Mar 23 2019 /usr/bin/passwd
SUID只对二进制程序有效。
执行者对于该程序需要有x的可执行权限
本权限仅对该程序的过程中有效
执行者将具有该程序所有者的权限
举例说明,/usr/bin/passwd是只有root可读并且有强制写入的权限,但是我们的个人用户如nancy是可以更改自己的密码的,所以它在执行passwd的过程中,会暂时获取root的权限
Set GID
当s标志在文件的所有者的x项目为SUID,那么s在用户组的x时则称为Set GID, SGID。
Sticky Bit
这个SBIT目前只针对目录有效,就是当用户对某个文件夹有w的操作时,它可以对该目录内任何人新建的文件进行修改,而如果对该目录增加SBIT的权限时,那么该用户只能修改自己创建的文件,而其他人创建的则无法删除。
这几个的权限代表的数字:
4 为SUID
2 为SGID
1 为SBIT
如果要修改文件权限为-rwsr-xr-x,原来的权限为755,需要再加上s的权限,则需要将权限改为 4755
注意 s、t都是替代x权限的,例如rwsr-sr-t
还可以用符号来加上这些权限,例如u+s,g+s,o+t
file(查看文件类型)
可以用file来查询文件是属于ASCII或者data文件,或者binary,且其有没有使用到动态函数库
vagrant@vagrant-ubuntu-trusty-64:/tmp$ file ~/.bashrc
/home/vagrant/.bashrc: ASCII text
命令与文件的查询
which(寻找执行文件)
要知道命令的完整文件名放在哪里,可以用which命令来查找
$ which [-a] command
参数:-a 将所有由PATH目录中可以找到的命令均列出,而不止第一个被找到。
vagrant@vagrant-ubuntu-trusty-64:/tmp$ which ifconfig
/sbin/ifconfig
文件名的查找
通常先用whereis或者locate来检查,如果找不到,采用find(find速度慢),find是直接查找硬盘,whereis和locate是查找记录文件的数据库文件(可能会找到已经被删掉的文件或者最新的文件找不到,数据库的创建是每天更新一次,可以用updatedb去更新数据库)
$ whereis [-bmsu] 文件或目录
参数:
-b: 只找二进制格式的文件
-m: 只找在说明文件manual路径下的文件
-s: 只找source源文件
-u: 查找不在上述三个选项当中的其他特殊文件
root@5195bf486175:/tmp# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
$ locate [-ir] keyword
参数:
-i: 忽略大小写的差异
-r: 后面接正则表达式的显示方式
vagrant@vagrant-ubuntu-trusty-64:/tmp$ locate passwd
/etc/passwd
/etc/passwd-
/etc/cron.daily/passwd
/etc/init/passwd.conf
/etc/pam.d/chpasswd
/etc/pam.d/passwd
/etc/security/opasswd
/usr/bin/gpasswd
...后面省略...
$ find [PATH] [option] [action]
选项与参数
与时间相关的选项有:-atime、-ctime、-mtime,以-mtime为例
-mtime n: 在n天之前的一天之内被改动过内容的文件;
-mtime +n: 在n天之前(不含n天本身)被改动过内容的文件
-mtime -n: 在n天之后(含那天本身)被改动过内容的文件
-newer file: file为一个存在的文件,列出比file还要新的文件的文件名
# 将过去系统上面24小时内有更改过内容的文件列出
$ find / -mtime 0
$ find / -mtime 3
# 寻找/etc下面的文件,如果文件日期比/etc/passwd新就列出
$ find /etc -newer /etc/passwd
+4 代表大于等于5天前的文件
-4 代表小于等于4天内的文件
4 代表4-5这一天的文件
与使用者或群组名称相关的参数
-uid n: n是使用者的账号ID(UID),这个ID记录在/etc/passwd里面
-gid n:n是群组名称ID(GID),GID记录在/etc/group里面
-user name: name为使用者账号名称
-group name: name为群组名称
-nouser: 寻找文件的拥有者不存在/etc/group的人
-nogroup: 寻找文件的拥有群组不存在于/etc/group的文件
# 搜寻/home下面属于nancy的文件
$ find /home -user nancy
# 搜寻不属于任何用户的文件
$ find / -nouser
可以通过这些与用户相关的参数找出某个用户在系统中创建的文件
与文件权限及名称相关的参数
-name filename:搜寻文件名称为filname的文件
-size [+-]SIZE: 搜寻比SIZE还要大(+)或者小(-)的文件,这个size的规格有:c代表Byte,k代表1024Bytes,所以要找比50KB还要大的文件“size +50KB”
-type TYPE: 搜寻文件的类型为TYPE的,类型主要有:一般正规文件f、设备文件b、c,目录d,链接文件l,socket文件s,以及FIFO文件p
-perm mode:搜寻文件权限刚好等于mode的文件,例如-rwsr-xr-x的属性为4755
-perm -mode: 搜寻文件权限必须全部囊括mode的权限的文件,例如我们要搜寻-rwxr--r--(即0744),那么-rwsr-xr-x也会被列出来,因为它也包含着rwxr--r--的属性
-perm /mode: 搜寻文件权限包含任一mode的权限文件,例如我们搜寻-rwxr-xr-x,即-perm /755,如果属性有-rw-------也会被搜索得到
# 找出文件名为passwd这个文件
$ find / -name passwd
# 找出文件名包含了passwd这个关键字的文件
$ find / -name *passwd*
# 找出/run目录下,文件类型为socket的文件名有哪些
$ find /run -type s
# 搜寻文件当中含有SGID或SUID或SBIT的属性
$ find / -perm /7000
# 7000为--s--s--t,那么只要含有s或t就列出来
额外可进行的动作:
-exec command: command为其他指令,-exec后面可再接额外的指令来处理搜寻到的结果
-print:将结果打印到屏幕上,这个动作是默认动作
# 将找到的文件使用ls -l列出来
$ find /usr/bin /usr/sbin -perm /7000 -exec ls -l {} \;
# {}代表由find找到的内容
# \; 代表指令结束位置
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。