目录
一、ln二、chmod三、chown、chgrp四、umask五、find5.1 根据文件名称搜索5.2 根据文件大小搜索5.3 根据所有者/所属组搜索5.4 根据时间属性搜索5.5 连接选项5.6 根据文件类型查找5.7 根据i结点查找六、locate七、which、whereis八、grep九、man十、useradd、passwd一、ln
ln
是link 的简写,该命令用于生成链接文件,使用格式如下:
ln -s [源文件] [目标文件] # 生成软链接ln [源文件] [目标文件] # 生成硬链接
例如,我们可以分别为/etc/issue
创建软硬链接:
root@sky:/tmp# ln -s /etc/issue /tmp/issue.softroot@sky:/tmp# ln /etc/issue /tmp/issue.hardroot@sky:/tmp# ls -ltotal 4-rw-r--r-- 2 root root 26 Feb 17 08:44 issue.hardlrwxrwxrwx 1 raelum raelum 10 May 20 10:41 issue.soft -> /etc/issue
从中可以看出:
文件类型为l
代表软链接文件,因为硬链接文件并不具有这种文件类型。查看软链接文件的详细信息能够看到->
,我们可用它来判断一个文件是否是软链接。
软链接类似于 Windows 中的快捷方式,无论是所有者还是所属组还是其他用户对软链接都拥有读、写和执行的权限(Linux 系统中所有软链接文件的标识均为lrwxrwxrwx
)。需要注意的是,虽然任何人对软链接文件都拥有所有权限,但对软链接文件进行操作时,权限依然由软链接所指向的源文件的权限决定。
硬链接文件好比使用cp -p
对源文件进行拷贝的文件,但与cp -p
不同的是,硬链接文件可以与源文件进行同步更新。硬链接不能针对目录使用,也不能跨分区。
如果删除源文件,则无法访问软链接,但依然可以访问硬链接。
那么如何判断一个文件是硬链接呢?
root@sky:~# cp -p /etc/issue issue.bakroot@sky:~# ln issue.bak issue.bak.hardroot@sky:~# ls -i151 issue.bak 151 issue.bak.hard
可以看出硬链接与源文件的结点信息相同,这也便是为什么硬链接能够与源文件同步更新。
二、chmod
chmod
用来修改文件或目录的权限。使用格式如下:
chmod [{ugoa}{+-=}{rwx}] [文件或目录]
其中u, g, o
分别代表所有者,所属组和其他人,a
代表所有人。+/-
表示为指定的对象添加或删除权限,而=
则不论先前是什么权限,直接赋值成新的权限。
我们以新创建的a.txt
为例:
root@sky:~# touch a.txtroot@sky:~# ls -ltotal 0-rw-rw-r-- 1 raelum raelum 0 May 20 11:56 a.txt
为所有者添加可执行权限:
root@sky:~# chmod u+x a.txtroot@sky:~# ls -ltotal 0-rwxrw-r-- 1 raelum raelum 0 May 20 11:56 a.txt
为所属组删除可写权限,并为其他人增加可执行权限
root@sky:~# chmod g-w,o+x a.txtroot@sky:~# ls -ltotal 0-rwxr--r-x 1 raelum raelum 0 May 20 11:56 a.txt
将所属组的权限更改为rwx
root@sky:~# chmod g=rwx a.txtroot@sky:~# ls -ltotal 0-rwxrwxr-x 1 raelum raelum 0 May 20 11:56 a.txt
有些时候,我们也会以数字的形式来修改文件或目录的权限:
chmod [mode] [文件或目录]
其中r
为 4,w
为 2,x
为 1。
例如,rwxrw-r--
对应的 mode 是 764。反过来,532 对应的是r-x-wx-w-
。
root@sky:~# chmod 532 a.txtroot@sky:~# ls -ltotal 0-r-x-wx-w- 1 raelum raelum 0 May 21 09:39 a.txt
我们还可以递归地修改权限,格式如下:
chmod -R [mode] [文件或目录]
例如
root@sky:~# mkdir -p a/broot@sky:~# ls -ld a a/bdrwxrwxr-x 3 raelum raelum 4096 May 20 12:24 adrwxrwxr-x 2 raelum raelum 4096 May 20 12:24 a/broot@sky:~# chmod -R 555 aroot@sky:~# ls -ld a a/bdr-xr-xr-x 3 raelum raelum 4096 May 20 12:26 adr-xr-xr-x 2 raelum raelum 4096 May 20 12:26 a/b
三、chown、chgrp
chown
是changeownership 的缩写,用于改变文件或目录的所有者。格式如下:
chown [目标用户] [文件或目录]
chgrp
用于改变文件或目录的所属组,使用格式与chown
相同。
无论是
chown
还是chgrp
,都只有root
用户才能执行。所以作为普通用户,我们需要在前面加上sudo
。
root@sky:~# touch abcroot@sky:~# ls -ltotal 0-rw-r--r-- 1 raelum raelum 0 May 20 15:11 abcroot@sky:~# sudo chown root abcroot@sky:~# ls -ltotal 0-rw-r--r-- 1 root raelum 0 May 20 15:11 abcroot@sky:~# sudo chgrp root abcroot@sky:~# ls -ltotal 0-rw-r--r-- 1 root root 0 May 20 15:11 abc
四、umask
我们先直接创建一个文件,然后查看它的权限:
root@sky:~# touch abcroot@sky:~# ls -ltotal 0-rw-r--r-- 1 raelum raelum 0 May 20 15:40 abc
事实上,使用touch
创建出来的文件的权限均为rw-r--r--
,可能你会好奇,究竟是谁规定了一个文件的默认权限?
umask
是 theuser-file creationmask的简写,它用来显示或设置文件/目录的缺省权限。
我们先来看如何显示一个文件的缺省权限。
root@sky:~# umask -Su=rwx,g=rx,o=rxroot@sky:~# ls -ltotal 4drwxr-xr-x 2 raelum raelum 4096 May 20 15:48 ab-rw-r--r-- 1 raelum raelum 0 May 20 15:40 abc
能够看出缺省权限为rwxr-xr-x
。我们创建的目录的权限就是缺省的,而文件却不是。文件的缺省权限相比目录少了x
,即可执行的权限。这是因为 Linux 规定,缺省创建的文件是不能具有可执行权限的,这一规定自然是为了安全起见。
那如何设置缺省权限呢?先直接执行umask
来看一下
root@sky:~# umask0022
第一个0
代表一种特殊的权限,这里不作过多介绍。后三个022
则分别代表所有者,所属组和其他人。
我们将022
展开可得到----w--w-
,将这串字符与rwxrwxrwx
做按位异或运算(其中-
视为0
),可得rwxr-xr-x
,而这串字符就是我们的缺省权限。
注意到rwxrwxrwx
实际上就是777
,总结一下,我们只需要将umask的后三位与777
做按位异或即可得到缺省权限。
给定缺省权限,我们将其与777
做按位异或运算即可得到umask的后三位。例如要设置文件的缺省权限为rwx------
,则它与777
进行按位异或的结果为---rwxrwx
,对应077
。
设置缺省权限的时候,只需umask+后三位数字:
root@sky:~# umask 077root@sky:~# touch abcroot@sky:~# ls -ltotal 0-rw------- 1 raelum raelum 0 May 20 16:32 abc
五、find
find
用于文件搜索,这里仅介绍常用的几种搜索格式。
5.1 根据文件名称搜索
区分大小写的搜索:
find [搜索范围] -name [文件名称]
不区分大小写的搜索:
find [搜索范围] -iname [文件名称]
需要注意的是,Linux 的搜索是精确搜索(Windows 是模糊搜索),例如当要搜索的文件名称为issue
时,Windows 会搜索到所有文件名称包含issue
字段的文件,而 Linux 只会搜索文件名称就是issue
的文件。
root@sky:~# find /etc -name init/etc/apparmor/init/etc/init
如果要想实现类似于 Windows 的模糊搜索,我们可以使用*
通配符,它代表任意多个字符:
root@sky:~# find /etc -name *init*/etc/systemd/system/sysinit.target.wants/etc/systemd/system/sshd-keygen@.service.d/disable-sshd-keygen-if-cloud-init-active.conf/etc/systemd/system/cloud-init.target.wants/etc/systemd/system/cloud-init.target.wants/cloud-init-hotplugd.socket/etc/systemd/system/cloud-init.target.wants/cloud-init.service/etc/systemd/system/cloud-init.target.wants/cloud-init-local.service/etc/initramfs-tools/etc/initramfs-tools/update-initramfs.conf/etc/initramfs-tools/initramfs.conf/etc/initramfs-tools/scripts/init-top/etc/initramfs-tools/scripts/init-bottom/etc/initramfs-tools/scripts/init-premount/etc/apparmor/init/etc/iscsi/initiatorname.iscsi/etc/X11/xinit/etc/X11/xinit/xinitrc/etc/rsyslog.d/21-cloudinit.conf/etc/init.d/etc/gdb/gdbinit/etc/xdg/autostart/gnome-initial-setup-copy-worker.desktop/etc/xdg/autostart/gnome-initial-setup-first-login.desktop/etc/security/namespace.init/etc/ufw/before.init/etc/ufw/after.init/etc/cryptsetup-initramfs/etc/init/etc/kernel/postrm.d/initramfs-tools/etc/kernel/postinst.d/initramfs-tools/etc/kernel/postinst.d/xx-update-initrd-links/etc/profile.d/Z99-cloudinit-warnings.sh
当然我们也可以不那么模糊,?
与*
不同,它只代表一个任意字符:
root@sky:~# find /etc -name init??/etc/init.d
5.2 根据文件大小搜索
格式:
find [搜索范围] -size [{+-}{文件大小}]
文件大小
的单位是数据块,1K=2数据块
。+
代表大于该文件大小的文件,-
代表小于该文件大小的文件。当不指定+/-
时,则搜索等于该文件大小的文件(很少这样做)。
在/var
下查找大于10MB的文件:
root@sky:~# find /var -size +20480/var/lib/apt/lists/_ubuntu_dists_focal_universe_i18n_Translation-en/var/lib/apt/lists/_ubuntu_dists_focal_universe_binary-amd64_Packages/var/lib/snapd/snaps/lxd_21029.snap/var/lib/snapd/snaps/core18_2128.snap/var/lib/snapd/snaps/snapd_12704.snap/var/lib/snapd/seed/snaps/lxd_21029.snap/var/lib/snapd/seed/snaps/core18_2128.snap/var/lib/snapd/seed/snaps/snapd_12704.snap/var/cache/apt/srcpkgcache.bin/var/cache/apt/archives/ubuntu-wallpapers-focal_20.04.2-0ubuntu1_all.deb/var/cache/apt/archives/libreoffice-core_1%3a6.4.7-0ubuntu0.20.04.4_amd64.deb/var/cache/apt/archives/libwebkit2gtk-4.0-37_2.34.6-0ubuntu0.20.04.1_amd64.deb/var/cache/apt/archives/libllvm9_1%3a9.0.1-12_amd64.deb/var/cache/apt/archives/fonts-noto-cjk_1%3a0410+repack1-2_all.deb/var/cache/apt/archives/libc6-dbg_2.31-0ubuntu9.7_amd64.deb/var/cache/apt/archives/thunderbird_1%3a91.5.0+build1-0ubuntu0.20.04.1_amd64.deb/var/cache/apt/archives/yaru-theme-icon_20.04.11.1_all.deb/var/cache/apt/archives/libreoffice-common_1%3a6.4.7-0ubuntu0.20.04.4_all.deb/var/cache/apt/archives/firefox_98.0.1+build2-0ubuntu0.20.04.1_amd64.deb/var/cache/apt/pkgcache.bin
5.3 根据所有者/所属组搜索
根据所有者进行搜索:
find [搜索范围] -user [用户名]
根据所属组进行搜索:
find [搜索范围] -group [组名]
5.4 根据时间属性搜索
在/etc
下查找5分钟内被访问过的文件或目录:
find /etc -amin -5
在/etc
下查找5分钟内被修改过属性的文件或目录:
find /etc -cmin -5
其中属性指的是使用ls -l
看到的所有内容。
在/etc
下查找5分钟内被修改过内容的文件或目录:
find /etc -mmin -5
5.5 连接选项
-a
类似于Python中的and
,-o
类似于Python中的or
。
例如,在/etc
下查找大于10MB小于100MB的文件:
root@sky:~# find /etc -size +20480 -a -size -204800
-exec 命令 {} \;
用于对搜索到的结果执行相应的操作。
例如我们想搜索/var
下大于50MB的文件并显示详细信息,则可以这样做
root@sky:~# find /var -size +102400 -exec ls -l {} \;-rw------- 2 root root 73728000 Aug 20 /var/lib/snapd/snaps/lxd_21029.snap-rw------- 2 root root 58130432 Aug 20 /var/lib/snapd/snaps/core18_2128.snap-rw------- 2 root root 73728000 Aug 20 /var/lib/snapd/seed/snaps/lxd_21029.snap-rw------- 2 root root 58130432 Aug 20 /var/lib/snapd/seed/snaps/core18_2128.snap-rw-r--r-- 1 root root 55662088 Nov 7 /var/cache/apt/archives/fonts-noto-cjk_1%3a0410+repack1-2_all.deb-rw-r--r-- 1 root root 55697732 Jan 21 16:28 /var/cache/apt/archives/thunderbird_1%3a91.5.0+build1-0ubuntu0.20.04.1_amd64.deb-rw-r--r-- 1 root root 57674408 Mar 17 20:45 /var/cache/apt/archives/firefox_98.0.1+build2-0ubuntu0.20.04.1_amd64.deb
5.6 根据文件类型查找
find [搜索范围] -type [f/d/l]
f
代表文件,d
代表目录,l
代表软链接。
5.7 根据i结点查找
find [搜索范围] -inum [节点]
六、locate
与find
类似,locate
也用于查找文件。但与find
不同的地方在于,find
是实时搜索,而locate
则是建立了一个数据库,搜索时只在数据库里进行,因此速度比find
快很多。但缺点是如果数据库没有及时更新,刚建立的文件是搜索不到的。
使用locate
命令需要先安装mlocate
:
apt install mlocate
locate
的使用格式如下:
locate [文件名]
如果不区分大小写,则可加上-i
选项。此外,locate
与 Windows 类似,都是进行模糊搜索。
root@sky:~# locate inittab/usr/share/terminfo/a/ansi+inittabs/usr/share/vim/vim81/syntax/inittab.vim
从下面的例子可以看出,刚创建的文件无法用locate
搜索到,这是因为数据库还没有更新:
root@sky:~# touch raelum.txtroot@sky:~# locate raelum.txtroot@sky:~#
我们可以使用updatedb
来更新数据库,这样就可以搜到了
root@sky:~# updatedbroot@sky:~# locate raelum.txt/root/raelum.txt
另外,locate
一个缺点就是无法查找/tmp
下的文件:
root@sky:/tmp# touch raelum.txtroot@sky:/tmp# updatedbroot@sky:/tmp# locate raelum.txt/root/raelum.txt
七、which、whereis
一般来讲,存放在/bin
或/usr/bin
下的命令,所有用户都可以使用。存放在/sbin
或/usr/sbin
下的命令,只能由 root 用户使用。
给定一个命令,如何快速的找到它位于哪个地方?
答案是用which
,它用于查找命令所在位置,具体格式如下:
which [命令]
例如:
root@sky:~# which ls/usr/bin/lsroot@sky:~# which useradd/usr/sbin/useradd
与which
相似,whereis
也用来搜索命令所在路径,只不过whereis
还会多返回一个命令的帮助文档所在的路径。
root@sky:~# whereis lsls: /usr/bin/ls /usr/share/man/man1/ls.1.gzroot@sky:~# whereis useradduseradd: /usr/sbin/useradd /usr/share/man/man8/useradd.8.gz
八、grep
grep
用来查找文件内容中某个关键词的所在行,格式如下:
grep [关键词] [文件名]
例如:
root@sky:~# grep Thus /etc/ssh/ssh_config# Thus, host-specific definitions should be at the beginning of the
-i
选项可以不区分大小写,-v
选项用来排除关键词所在行。
九、man
man
是manual 的简写,它可用来获得帮助信息。
例如查看ls
命令的帮助信息
man ls
十、useradd、passwd
useradd
只能由 root 用户执行,用于添加新用户,格式如下:
useradd [用户名]
正常情况下,添加新用户后我们通常会为这个新用户设置密码,为用户设置密码的指令如下:
passwd [用户名]
每个普通用户只能更改自己的密码,而管理员 root 可以更改所有人的密码。