Linux基础命令(四):高级键盘操作与权限控制——history、自动补全、命令行快捷键、历史命令展开、id、chmod、umask、su、sudo、chown、chgrp、passwd

目录

高级键盘操作

命令行

移动命令行光标

修改命令行文本

剪切和复制

自动补全

历史命令

历史命令展开

权限控制

拥有者、组成员和其他人

读取、写入和执行

更改文件模式

设置默认权限

一些特殊权限

切换用户

更改文件所有者和用户组

更改用户密码

 创建新的用户与删除用户


高级键盘操作

Linux终端支持各种快捷键操作。掌握这些快捷键以及命令行交互式编辑特性,基本可以告别鼠标操作了。

clear - 清空屏幕

history - 显示历史列表内容

小技巧:Linux的图形用户界面中,非最大化的窗口是默认隐藏顶部选项卡的,可以通过保持按下Alt键来显示它们。

命令行

bash之所以可以编辑命令行,是使用了一个叫做Readline的库(开源的跨平台程序库,提供了交互式的文本编辑功能,如命令补全、搜索历史命令、方向键可以移动光标、行编辑快捷键等等)。

一些命令行的快捷按键组合(尤其使用 Alt 键的组合),可能会被 GUI 拦截来触发其它的功能。 当使用幕后控制台时,所有的按键组合都应该能够正确地工作。

移动命令行光标

Ctrl-a 移动光标到行首。 Ctrl-e 移动光标到行尾。 Ctrl-f 光标右移一个字符;和右箭头作用一样。 Ctrl-b 光标左移一个字符;和左箭头作用一样。 Alt-f 光标前移一个字符串。 Alt-b 光标后移一个字符串。 Ctrl-l 清空屏幕,移动光标到左上角。clear 命令完成同样的工作。

修改命令行文本

Ctrl-d 删除光标位置的字符。 Ctrl-t 光标位置的字符和光标前面的字符互换位置。 Alt-t 光标位置的字和其前面的字互换位置。 Alt-l 把从光标位置到字尾的字符转换成小写字母。 Alt-u 把从光标位置到字尾的字符转换成大写字母。

剪切和复制

Readline 的文档使用术语 killing 和 yanking 来指我们平常所说的剪切和粘贴。 剪切下来的本文被存储在一个叫做剪切环(kill-ring)的缓冲区中。

Ctrl-k 剪切从光标位置到行尾的文本。 Ctrl-u 剪切从光标位置到行首的文本。 Alt-d 剪切从光标位置到词尾的文本。 Alt-Backspace 剪切从光标位置到词头的文本。如果光标在一个单词的开头,剪切前一个单词。 Ctrl-y 把剪切环中的文本粘贴到光标位置。

自动补全

当你敲入一个命令的一半, 按下**tab **键,命令就会自动补全。它能帮助我们完成路径名、变量、用户名、命令、主机名的自动补全。当然了,只有系统中存在的资源才能够自动补全。但是要注意的是,如果我们输入的内容不止能够匹配一个结果,则自动补全不会生效,如果我们执意按tab键,它会给我们列出所有可能的结果。

Alt-? 显示可能的自动补全列表。在大多数系统中,你也可以通过按两次 tab 键完成这个。 Alt-* 插入所有可能的自动补全。当你想要使用多个可能的匹配项时,这个很有帮助。

小提示,Alt也可称作元键。

目前的 bash 版本有一个叫做可编程自动补全的工具,允许你来加入额外的自动补全规则。可编程自动补全是由 shell 函数实现的。

历史命令

bash 维护着一个已经执行过的命令的历史列表,默认最多存储500个命令。保存在家目录下,一个叫做 .bash_history 的文件里。

搜索历史命令

1history | less 2

我们可以通过历史命令列表中的行号展开该命令。如第6行:

1 !6 2

bash 也具有增量搜索历史列表的能力。意思是在字符输入的同时,bash 会去搜索历史列表(直接出结果,并高亮匹配的第一个字),每多输入一个字符都会使搜索结果更接近目标。输入Ctrl-r启动增量搜索, 接着输入你要寻找的字。找到以后,可以敲入 Enter 来执行命令, 或者输入 Ctrl-j,从历史列表中复制这一行到当前命令行。输入 Ctrl-g 或者 Ctrl-c,退出搜索

Ctrl-p 移动到上一个历史条目。类似于上箭头按键。 Ctrl-n 移动到下一个历史条目。类似于下箭头按键。 Alt-< 移动到历史列表开头。 Alt-> 移动到历史列表结尾,即当前命令行。 Ctrl-r 反向增量搜索。从当前命令行开始,向上增量搜索。 Alt-p 反向搜索,非增量搜索。(输入要查找的字符串,按下 Enter来执行搜索)。 Alt-n 向前搜索,非增量。 Ctrl-o 执行历史列表中的当前项,并移到下一个。如果你想要执行历史列表中一系列的命令,这很方便。

历史命令展开

!! 重复最后一次执行的命令。可能按下上箭头按键和 enter 键更容易些。 !number 重复历史列表中第 number 行的命令。 !string 重复最近历史列表中,以这个字符串开头的命令。 !?string 重复最近历史列表中,包含这个字符串的命令。

除非确定历史列表中的条目内容,否则要小心谨慎地使用 “!string” 和 “!?string” 格式。

脚本

除了 bash 中的命令历史特性,许多 Linux 发行版包括一个叫做 **script **的程序, 这个程序可以记录整个 shell 会话,并把 shell 会话存在一个文件里面。

基本语法为:script filename

filename 是指用来存储 shell 会话记录的文件名。如果没有指定文件名,则使用文件 typescript。

权限控制

Unix 传统中的操作系统不同于 MS-DOS 传统中的系统,区别在于它们不仅是多任务系统,而且也是多用户系统。意味着多个用户可以在同一时间使用同一台计算机。尽管计算机可能只有一个键盘和一个监视器,但是可以支持远程用户通过ssh登录并操作这台电脑。远程用户也能运行图形界面应用程序,并且图形化的输出结果会出现在远端的显示器上。 X 窗口系统把这个作为基本设计理念的一部分,并支持这种功能。

为了支持多用户特性,必须设计一种避免用户之间互相影响的机制,即权限。

拥有者、组成员和其他人

Unix 安全模型中,当一个用户拥有一个文件或目录时, 即拥有对这个文件或目录访问权限的控制权。一个或多个用户可以组成用户组,用户组成员对文件和目录的访问权限由所有者授予。除了用户组成员,文件所有者也可以给其他所有人操作权限。

可以用 id 命令,来查看自己的信息:

1id 2

用户帐户 定义在/etc/passwd 文件里面,用户组定义在/etc/group 文件里面。当用户帐户和用户组创建以后, 这些文件随着文件/etc/shadow 的变动而修改,文件/etc/shadow 包含了关于用户密码的信息。 对于每个用户帐号,文件/etc/passwd 定义了用户(登录)名、uid、gid、帐号的真实姓名、家目录和登录 shell。其中除了普通用户帐号之外,还有超级用户(uid 0)帐号,和各种各样的系统用户。

许多类 Unix 的系统会把普通用户分配到一个公共的用户组中,例如“users”,现在的 Linux 会创建只有一个成员的与用户同名的用户组。这样使某种类型的权限分配更容易些。

读取、写入和执行

对于文件和目录的访问权限是根据读、写和执行来定义的。

使用 ls 命令的 -l 选项可以输出一个文件的操作权限:

1ldz@MSI:~$ > a.txt 2ldz@MSI:~$ ls -l a.txt 3-rw-rw-rw- 1 ldz ldz 0 Sep 27 20:21 a.txt 4

前十个字符表示文件的属性。第一个字符表示文件类型

-    一个普通文件 d   一个目录 l   一个符号链接。注意对于符号链接文件,剩余的文件属性总是"rwxrwxrwx",而且都是虚拟值。真正的文件属性是指符号链接所指向的文件的属性。 c   一个字符设备文件。这种文件类型是指按照字节流来处理数据的设备。 比如说终端机或者调制解调器 b   一个块设备文件。这种文件类型是指按照数据块来处理数据的设备,例如一个硬盘或者 CD-ROM 盘。

剩下的九个字符叫做文件模式,代表着文件所有者、文件组所有者和其他人的读、写和执行权限。

r 允许打开并读取文件内容。 允许列出目录中的内容,前提是目录必须设置了可执行属性(x)。 w 允许写入文件内容或截断文件。但是不允许对文件进行重命名或删除,重命名或删除是由目录的属性决定的。 允许在目录下新建、删除或重命名文件,前提是目录必须设置了可执行属性(x)。 x 允许将文件作为程序来执行,使用脚本语言编写的程序必须设置为可读才能被执行。 允许进入目录,例如:cd directory 。

更改文件模式

可以利用 chmod 命令更改文件或目录的模式(权限)。注意只有文件的所有者或者超级用户才能更改文件或目录的模式。chmod 命令支持两种不同的方法来改变文件模式:八进制数字表示法或符号表示法

人类因为天生有十个手指,利用以10为基数的数字系统来计数。计算机,生来只有一个手指,只能表示0和1,因此它以二进制来计数。

八进制表示法

每个八进制数字代表了 3 个二进制数字,这种对应关系,正好映射到用来存储文件模式所使用的方案上。

八进制二进制文件模式
0000---
1001--x
2010-w-
3011-wx
4100r--
5101r-x
6110rw-
7111rwx

1

通过使用3个八进制数字,我们能够设置文件所有者、用户组和其他人的权限:

1chmod 600 a.txt #6的八进制为110,表示文件所有者拥有读写的权限,而用户组和其他人无权限。 2

虽然八进制到二进制的映射看起来不方便,但通常只会用到一些常见的映射关系: 7 (rwx),6 (rw-),5 (r-x),4 (r--),和 0 (---)。

符号表示法

符号表示法分为三部分:更改会影响谁, 要执行哪个操作,要设置哪种权限。通过字符 “u”、“g”、“o”和 “a” 的组合来指定 要影响的对象:

u"user"的简写,意思是文件或目录的所有者。
g用户组。
o"others"的简写,意思是其他所有的人。
a"all"的简写,是"u", "g"和“o”三者的联合。

1

如果没有指定字符,则默认使用”all”。执行的操作可能是一个 “+”字符表示加上一个权限, 一个**“-”字符表示删掉一个权限**,或者是一个**“=”字符表示只有指定的权限可用,其它所有的权限被删除**。权限由 “r”、“w”和 “x” 来指定。

u+x为文件所有者添加可执行权限。
u-x删除文件所有者的可执行权限。
+x为文件所有者,用户组,和其他所有人添加可执行权限。 等价于 a+x。
o-rw除了文件所有者和用户组,删除其他人的读权限和写权限。
go=rw给文件所属的组和文件所属者/组以外的人读写权限。如果文件所属组或其他人已经拥有执行的权限,执行权限将被移除。
u+x,go=rw给文件拥有者执行权限并给组和其他人读和执行的权限。多种设定可以用逗号分开。

1

 

我们也可以在GUI中更加直观的设置文件和目录的权限。

 

设置默认权限

创建一个文件时,umask 命令控制着文件的默认权限。umask 命令使用 4 位的八进制表示法来表达从文件模式属性中删除一个位掩码。对于普通文件和目录的权限设置,我们只关注后 3 位,将掩码化为二进制后哪一个比特位为1,删除该对应位置权限

首先查看默认的掩码值:

1ldz@MSI:~$ umask 20000 3

也就是没有为1的比特位,因此对应我们前面创建的 a.txt 文件的权限为:-rw-rw-rw- (由于a.txt既不是脚本文件又不是可执行文件,因此没有执行权限)。

我们将umask修改为 0002 ,再创建一个文件观察其权限:

1ldz@MSI:~$ umask 0002 2ldz@MSI:~$ > a1.txt 3ldz@MSI:~$ ls -l a1.txt 4-rw-rw-r-- 1 ldz ldz 0 Sep 27 21:28 a1.txt 5

将掩码化为二进制,000 000 000 010 ,比特位为1的位置,正好对应新建文件缺少的权限。

注意:umask 命令设置的掩码值只能在当前 shell 会话中生效,若当前 shell 会话结束后,则必须重新设置。

一些特殊权限

虽然通常一个八进制的权限掩码用三位数字来表示,但是从技术层面上来讲, 用四位数字来表示它更确切些。因为除了读取、写入和执行权限之外,还有其它较少用到的权限设置。比如:

setuid 位(八进制4000)

当应用到一个可执行文件时,它把有效用户 ID 从运行程序的用户设置成程序所有者的 ID。这种操作通常会应用到一些由超级用户所拥有的程序。设置了setuid位后,当普通用户运行一个由根用户(root) 所有的程序时,这个程序运行时具有超级用户的特权,这样程序就可以访问普通用户禁止访问的文件和目录。

setgid 位(八进制2000)

类似于 setuid 位,把有效用户组 ID 从运行程序的用户组 ID 更改为文件所有者的组 ID。如果设置了一个目录的 setgid 位,则目录中新创建的文件具有这个目录用户组的所有权,而不是文件创建者所属用户组的所有权。当一个普通用户组中的成员,需要访问共享目录中的所有文件,而不用管文件所有者的主用户组时, 那么设置 setgid 位很有用处。

sticky 位(八进制1000)

继承于 Unix,在 Unix 中,它可能把一个可执行文件标志为“不可交换的”。在 Linux 中,默认不设置文件的 sticky 位,但是如果一个目录设置了 sticky 位, 那么它能阻止其他用户删除或重命名文件。这个经常用来控制访问共享目录,比方说/tmp。

 

特殊权限使用方法:

chmod u+s 可执行文件名

1ldz@MSI:~$ chmod u+s a 2ldz@MSI:~$ ls -l a 3-rwsrwxrwx 1 ldz ldz 9328 Sep 28 11:04 a #可以看到用户的执行权限由之前的x更改为了s 4

chmod g+s 目录

1ldz@MSI:~/bb$ chmod g+s de 2ldz@MSI:~/bb$ ls -l 3total 0 4drwxrwsrwx 0 ldz ldz 512 Sep 3 10:48 de #可以看到用户组的执行权限由之前的x更改为了s 5

chmod +t 目录

1ldz@MSI:~/bb$ chmod +t de 2ldz@MSI:~/bb$ ls -l 3total 0 4drwxrwsrwt 0 ldz ldz 512 Sep 3 10:48 de #可以看到其他用户的执行权限由之前的x更改为了t 5

切换用户

有三种方式可以切换用户身份

注销系统并以其他用户身份重新登录系统。

使用 su 命令。

使用 sudo 命令。

第一种方法十分不方便,跳过就好。下面介绍另外两种。

使用 su 命令切换用户

使用方法为:su 选项 username

选项作用
-c<指令>或--command=<指令>执行完指定的指令后,即恢复原来的身份
-f或--fast适用于csh与tsch,使shell不用去读取启动文件
-l或--login改变身份时,也同时变更工作目录,以及shell环境
-m,-p或--preserve-environment变更身份时,不要变更环境变量
-s<shell>或--shell=<shell>指定要执行的shell

1

如果命令不包含参数选项,则仅仅切换用户身份,工作目录和shell环境不会改变(只有切换了Shell环境才不会出现PATH环境变量错误)。如果包含**”-l”选项**,那么会为指定用户启动一个需要登录的 shell。这意味着会加载此用户的 shell 环境, 并且工作目录会更改到这个用户的家目录。如果不指定用户,那么就假定是超级用户。注意,选项”-l”可以缩写为”-“。

eg:启动超级用户的 shell

1su - 2

按下回车符之后,shell 提示我们输入超级用户的密码。如果密码输入正确,出现一个新的 shell 提示符, 表明这个 shell 具有超级用户特权(提示符的末尾字符是”#”而不是”$”),并且当前工作目录是超级用户的家目录 (通常是/root)。一旦进入一个新的 shell,我们能执行超级用户所使用的命令。当工作完成后,输入”exit”,则返回到原来的 shell。

也可以利用“-c”选项只执行单个命令,而不是启动一个新的可交互的 shell:

1su -c 'command' 2

使用这种模式,命令传递到一个新 shell 中执行。注意要把命令用单引号引起来,因为我们不想命令在我们的 shell 中展开,而是在新 shell 中展开。

使用 sudo 命令以另一个用户身份执行命令

管理员能够配置 sudo 命令,从而允许普通用户以不同的身份(通常是超级用户),来执行命令。经过配置,**sudo 命令不要求超级用户的密码,而是使用自己的密码来认证。**与 su 的一个重要区别是 sudo 不会重新启动一个 shell,也不会加载另一个用户的 shell 运行环境。

查看 sudo 命令被授予了哪些权限,可以使用“-l”选项:

1ldz@MSI:~$ sudo -l 2[sudo] password for ldz: 3User ldz may run the following commands on MSI.localdomain: 4 (ALL : ALL) ALL 5

默认是 ALL 。注意,在第一次使用sudo命令之后,sudo命令会信任你几分钟,接下来再次使用sudo命令时不会提示输入密码,直到计时结束。

更改文件所有者和用户组

 chown 命令可以用来更改文件或目录的所有者和用户组。使用这个命令需要超级用户权限。

使用方法:chown 参数 filename...

bob 把文件所有者从当前属主更改为用户 bob。 bob:users 把文件所有者改为用户 bob,文件用户组改为用户组 users。 :admins 把文件用户组改为组 admins,文件所有者不变。 bob: 文件所有者改为用户 bob,文件用户组改为用户 bob 登录系统时所属的用户组。

**更改用户组所有权 **

旧版 Unix 系统中,chown 命令只能更改文件所有者,不能更改用户组。后者需要 chgrp 命令来完成,chgrp 命令与 chown 命令使用方法类似。

更改用户密码

使用 passwd 命令,来设置或更改用户密码。

使用方法:passwd  username

不带用户名参数时,默认修改当前用户密码,passwd 命令会强迫你使用“强”密码。拒绝接受太短的密码、与先前相似的密码、 字典中的单词作为密码或者是太容易猜到的密码。

如果具有超级用户权限,还可以指定一个用户名作为 passwd 命令的参数,设置另一个用户的密码。

修改超级用户密码有两种方式,第一种是先进入root用户,然后输入passwd,适用于单纯想要更新密码的。第二种是直接在普通用户输入sudo passwd root 修改密码,适用于忘记了root用户密码的情况。

 创建新的用户与删除用户

Linux提供adduser与useradd两个命令用来创建新的用户。但都需要使用root权限。

adduser 参数****username #创建一个普通用户

**deluser username **#删除一个普通用户

eg:

1adduser ldz 2

如果不设置中间参数,则默认在/home下自动创建用户目录,设置系统shell程序(通常为/bin/bash),会在创建时会提示设置密码。新创建的用户可以在电脑重启时用来登入GUI,也可以在系统设置中与原来的用户随时切换。

**useradd 选项 username **#创建一个普通用户

userdel username #删除一个普通用户

主要选项
-c:加上备注文字,备注文字保存在passwd的备注栏中。 
-d:指定用户登入时的启始目录。
-D:变更预设值。
-e:指定账号的有效期限,缺省表示永久有效。
-f:指定在密码过期后多少天即关闭该账号。
-g:指定用户所属的群组。
-G:指定用户所属的附加群组。
-m:自动建立用户的登入目录。
-M:不要自动建立用户的登入目录。
-n:取消建立以用户名称为名的群组。
-r:建立系统账号。
-s:指定用户登入后所使用的shell。
-u:指定用户ID号。

如果不使用任何选项,则默认只创建一个用户名,还需要手动设定登录密码、shell程序、用户目录等。注意:使用useradd新创建的用户,不可以用来登入GUI,只能在终端中切换该用户。使用useradd指令所建立的帐号,实际上是保存在/etc/passwd文本文件中。

eg:

1useradd csdn #新建用户 2 3passwd csdn #设置密码 4 5usermod -s /bin/bash csdn #设置shell程序 6 7usermod -d /home/csdn csdn #指定用户目录 8

 

有关用户和用户组管理的命令:useradd(添加)  usermod(修改)  userdel(删除)

**                                                  groupadd(添加)   groupmod(修改)  groupdel(删除)**

 

 

 

代码交流 2021