1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > Linux基础系列(二)——链接 权限管理 文件搜索 用户管理

Linux基础系列(二)——链接 权限管理 文件搜索 用户管理

时间:2020-09-13 08:31:45

相关推荐

Linux基础系列(二)——链接 权限管理 文件搜索 用户管理

目录

一、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

lnlink 的简写,该命令用于生成链接文件,使用格式如下:

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

chownchangeownership 的缩写,用于改变文件或目录的所有者。格式如下:

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

manmanual 的简写,它可用来获得帮助信息。

例如查看ls命令的帮助信息

man ls

十、useradd、passwd

useradd只能由 root 用户执行,用于添加新用户,格式如下:

useradd [用户名]

正常情况下,添加新用户后我们通常会为这个新用户设置密码,为用户设置密码的指令如下:

passwd [用户名]

每个普通用户只能更改自己的密码,而管理员 root 可以更改所有人的密码。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。