创建、查看和编辑文本文件
重定向符号 >
进程使用称为文件描述符的编号通道来获取输入并发送输出。所有进程在开始时至少要有三个文件描述符。如果程序打开连接至其他文件的单独连接,则可能要使用更大编号的文件描述符
上述通过通道1去写入,且写入的文件不存在会自动创建。且数字1可以省略
如下通道1和通道2的区别
通道2是输入错误信息,当写入的内容并不是标准错误时则不会写入文件,而是直接打印出来
注意当没有用追加时,会清空原有内容:
有选择的存储(下图表示ls为正确的命令就将执行结果存储在right中,错误则将错误信息存储在error中,且两个文件如果并不存在会自动被创建
当没有追加内容时,原有的信息会被覆盖,即使命令正确存储到right中,在error中原有的内容会被清空(所以记得可以追加>>
&> 不管命令对错都可存储到文件中
将返回值进行筛选:
在/etc目录下查找名字为passwd的内容,可以看到很多都是拒绝访问的错误信息,
如下筛选,将查找的内容存储到rr.txt中,错误内容存储到ee中
将内容放到/dev/null 中,其表示一个回收站,放进去的内容则会被清空:
/dev/null 在长列表的开头字母c可以看出null是一个字符设备
可以知道:
Ls >> rr.txt 2>&1 和 Ls &>> rr.txt 效果相同,都是所有内容都存入rr.txt中
(补充:关于用su切换用户
su 用户名则会切换到指定用户的同一个视图下,如root用户是在log目录下,则切换到student用户时也是在这个目录下,su - 用户名,则时切换过去的用户在该用户的家目录视图下。切换到管理员root用户:
构建管道:
管道是一个或多个命令的序列,用竖线字符| 分隔。管道将第一个命令的标准输出连接到下一个命令的标准输入。
如上两个命令效果相同(grep过滤关键字),都是在/etc/passwd中过滤带有root的信息
又如将ls -l 中的执行结果内容交给grep去过滤带有txt的信息
tee命令
将筛选或者说处理过的内容不直接将
(图中权限拒绝访问的内容没有存储,只是被过滤掉打印出来了)图中用tee命令,将 /etc下的所有内容都存进了hh.txt文件中,然后再对具有关键字passwd的内容存进haha.txt文件中:
vim编辑器
vim运行模式:包括命令模式、扩展模式(末行模式)、编辑模式和可视化模式
第一次打开Vim时,是命令模式启动,用于导航、剪切和粘贴,及其其他文本操作,通过单字符击键操作进入各个其他模式。
按i键进入插入模式
按v键进入可视化模式
。。。。。。。。
如图所示:
(上述操作中3dd是向下删除包括所在行在内的三行。3yy也是向下复制三行)
打开文件后分屏操作:
先打开进入,再输入:sp
退出分屏
同时打开两个文件(用分屏操作)
上下分屏打开两个文件:
左右分屏打开:
关闭方法:
:qa表示同时关闭打开的多个文件
:q则可关闭当前光标所在的文件(一个个关闭)
可视化操作:
ctrl v 可选择文本块
像左或向右则是代表选中行后再选中列的范围(一块一块的选中,可以不是每行一整行)
按v 或 shift v
v是可以选择多个字符进行文本操作,shift v选择多行,若是选中整行则二者没有不同
批量注释:
光标停在注释的该行首字母 --> ctrl v --> I (大写的i)----> # ----->esc 键
如上图,我要将这6行注释,我先将光标放到第一行注释的第一个字母上,然后ctrl v进入文本块选择的可视化模式,然后向下选中这要注释的6行
选中后添加按大写的I进入插入模式,输入#
最后按退出键esc就可以看到被批量注释
若是要批量删除则营进行如下操作
ctrl v 选中注销注释的行头的# ---》 按x键
(如果不是删除和增加注释也是一样的操作)
(补充:
a、输入
#
后,Vim会自动将光标所在位置的单词作为搜索模式,并向前搜索匹配的单词。所有匹配的单词都会被强调显示。:nohl取消高亮
b、按0可以回到该行首(shfit 6 也是一样的效果
c、shift 4 则移动到行尾
d、w往后跳,b往前跳一个单词(3w往后跳3个,3b也是一样
更改SHELL环境
Bash shell允许您设置shell变量,可以使用这些变量来帮助运行命令或修改shell的行为。还可以将shell变量导出为环境变量,它们会在程序启动时自动复制到从该shell运行的程序中。
为变量分配值:
变量名称可以包含大写或小写字符、数字和下划线字符(_)
使用set命令列出当前所有的shell变量
使用Shell变量配置Bash
使用环境变量配置程序
(不是环境变量的Shell变量只能由Shell使用。环境变量可以由shell以及从该shell运行的程序使用)
shell中定义的任何变量都可以变为环境变量,(方法是将它变量标记为使用export命令导出)。应用程序和绘画使用这些变量来确定齐行为
上图两种方式都可
PATH变量:包含一个含有程序的目录的冒号分隔列表
当运行ls(在/usr/bin/ls)等命令时,shell会按照顺序逐一在这些目录中查找可执行文件ls,并且运行它找到的第一个匹配文件。
如果某个目录中有像常规命令一样运行的可执行程序或脚本,可以添加到PATH中
例如:将/home/user/sbin目录添加到PATH的末尾
可以用env命令列出特定shell的所有环境变量
设置默认文本编辑器用EDITOR环境变量指定要用作命令行程序的默认文本编辑器的程序,
可根据需要覆盖原先的默认值
取消设置(unset)和取消导出设置(export -n)
取消设置:
用来从当前会话中移除变量,不再保留该变量的定义。它适用于所有类型的变量,包括环境变量和普通变量。使用
unset
命令后,该变量将不再可见,无法直接访问和使用。取消导入设置:
用来取消将一个变量导出为环境变量,使其不再对子进程可见。它只适用于环境变量,不会影响普通变量。使用
export -n
命令后,在当前会话和其子进程中取消导出的环境变量将不再可见,但在当前会话中仍然保留其定义。补充:如果你希望变量的取消设置或删除是永久性的,可以考虑编辑相关的配置文件,如
.bashrc
、.bash_profile
或其他 shell 配置文件,在其中对变量进行设置。这样,在每次启动终端会话时,变量会被自动重新设置。请注意,对环境变量的修改并不会影响到其他用户的环境。环境变量通常是在用户级别进行设置,每个用户可以独立地管理自己的环境变量。
管理本地用户和组
用户账户有三种类型:超级用户、系统用户和普通用户
超级用户(名称为root,账户UID为0):
- 根账户,也称为超级用户或管理员账户。
- 具有系统上所有权限,可以执行任何操作。
- 用于系统管理和配置,对系统文件和设置进行更改。
系统用户:
- 用于运行系统服务和进程的特殊账户。
- 系统进程、服务和守护进程会使用这些账户运行。
- 通常不允许交互式登录。
普通用户:
- 用于一般用户操作,如打开应用程序、存储文件等。
- 没有对系统底层进行修改的权限(对系统具有有限的访问权限)。
使用id命令显示有关当前已登录用户的信息
查看有关用户的基本信息,id 用户名
用ps查看进程信息(默认显示当前shell中的进程)
ps -a(添加-a选项可查看与某一终端相关的所有进程)
ps -u(可查看与进程相关联的用户)
ps -au
操作系统内部利用UID来跟踪用户,用户名到UID的映射在账户信息数据库中定义。默认情况下,系统使用/etc/passwd文件存储有关本地用户的信息。
该文件中每一行都包含有关某个用户的信息(其分为七个以冒号分隔的字段)
vim /etc/passwd
每个字段代表内容:
5、用户的描述
vim /etc/shadow
/etc/passwd和/etc/shadow
/etc/passwd
文件中存储了用户账户的基本信息,而/etc/shadow
文件则存储了用户账户的加密口令信息。这种设计有助于保护用户账户的安全性,防止密码被直接读取。只有系统管理员才能访问和修改/etc/shadow
文件,而普通用户只能读取/etc/passwd
文件中的信息。(补充:
UID是用户ID的缩写。UID的范围通常是从0开始,预留了几个特殊的UID:
UID 0:特殊的UID 0代表超级用户(root)。超级用户具有系统上最高的权限,可以执行任何操作,对系统进行任意更改。
UID 1-999:保留给特殊系统账户和系统进程使用。
UID 1000及以上:为普通用户所使用。
UID号不能直接用来评判是系统用户还是普通用户,因为在创建用户时可以设置UID号,且1-999不是所有的UID都已经指定给了不同用户(没有用光)。
UID的分配是由系统管理员进行管理的。在创建新用户时,系统会为其分配一个唯一的UID,并将其记录在
/etc/passwd
文件中。通过UID可以确定用户的身份和权限,例如文件所有权和访问权限等。
创建用户(在root用户下)
可以看到新创建的用户信息被写入/etc/passwd的最后一行
::第五个字段(就是那个真实姓名)是注释行(可写可不写),因为我们没有添加,所以没有内容
可以看到第六个字段/home/forget 对于新创建的用户,其主目录通常位于
/home
目录下,以用户名命名。最后一个字段为bash 说明该用户可以登录系统
一开始我们没有设置密码,所以在/etc/shadow中该第二个字段为!
设置密码
因为是管理员设置,所以尽管没有达到标准(提示说短于8个字符)。也可以设置成功
可以返现密码以加密格式保存在了/etc/shadow文件中
(补充:将密码通过passwd的标准输入通道传递给要设置密码的用户
或者时自己输入的复杂的值,按前面的密码设置,可能自己看不到,如下很方便:
创建用户不用密码也可以登录
如图需要密码才能登录,
进行如下操作
这时直接点击即可登录,不需要输入密码
创建用户,并添加注释行(即第5个字段)
-c选项(comment,注释的意思)可以看到第5个字段即是我们添加的注释信息
在已经创建好的用户下添加注释行
可以发现一开始Tina第5个字段没有内容,后来就有了
如果再执行同样的操作,添加了不同的注释信息,其会把之前的注释内容覆盖,若要追加则进入/etc/passwd去修改,而且/etc/shadow也不会同步
该目录下的注释行没有变化
创建一个用户,指定第7个字段(/bin/bash 或是 /sbin/nologin,默认情况是后者)
删除用户(在root用户下)
userdel 用户名 虽然删除了该用户,却没有删除用户下创建的家目录
当又创建同名用户,该该存在未删除的目录将会被新创建的目录覆盖(这是在新创建的用户的家目录同名的情况下)如:
且删除了用户未删除其家目录,系统将具有未分配UID所拥有的文件。如下:
图上可发现,一个可用UID(1002原先是Tom的,后来删除了Tom用户)被分配给新用户Nana,则之前未删除的Tom的家目录的所有权与UID关联,也就转移给了Nana。(也可以发现,图上仍可以找到以Nana命名的家目录,说明不影响其创建)
如果要完成删除要加上-r选项,递归删除其及目录。
在将用户清楚的同时,将家目录删掉。如图,在创建同名用户后没有什么提示(没有userdel删除后在创建的提示
组
共享文件和其他系统资源访问权限的用户的集合,在内部通过分配的唯一标识号(组ID或GID)来区分不同的组。组名称道GID的映射在组账户信息数据库中定义。默认情况下,系统使用/etc/group文件存储有关本地组的信息。
该文件每一行都包含了有关某个组的信息。每个组条目被分为四个以冒号分隔的字段:
vim /etc/group
每个字段表示的内容:
主要组和补充组:
每个用户只有一个主要组。
如图gid=1000(student)说明student就是该用户的主要组,该组名称为student,gid为1000
group=后面是用户所属的所有组,可以知道student为主要组,则wheel为附加组(附加组不唯一,可以有多个)
通常创建一个新的用户时会自动创建一个与该用户同名的新组,该组将用作新用户的主要组,而该用户时这一个用户专用组的唯一成员。
(例如创建一个用户forget,如果不加设定,系统会自动创建一个同名的主要组,且该用户自动在该组成员)
创建用户组
此时我再创建一个用户,可以发现其uid为1005,但是gid为1006,一般情况下,可能uid和gid比较一致,如果单独创建了用户组,该号数被占用,二者再数值上就不会比较同步。
在创建用户时设置主要组(用-g 选项)
useradd -g 组名 用户名
(注意:
该用户的主要组被设置以后,不会自动创建同名主要组
且设置成功的前提是该组已经存在:
如果是对已经存在的用户的主要组去修改(用usermod
删除用户组
如果是删除单独创建的用户组则可以直接用groupdel去删除
如果是删除一个用户的主要组则不可以:
如果你想删除一个用户的主要用户组,你可以先将该用户从其他用户组中删除,然后再删除主要用户组。
查看该用户所属的用户组:
只有Tina(其实如果是其他用户所属多组就可以都列出来,虽然这里可以不用,且用id 也可以知道)
从其他用户组中删除用户:
如果是从主要组中删除该用户,暂时还不知道,到时再补充。
将用户添加到一个组中,且该组为附加组 user -G 组名 用户名
第一种方法:在创建用户时加入该组
前提是该组已经存在:(如下创建用户时加入一个未创建的组)
第二种方法:用usermod(修改已经存在的用户)
但发现之前添加的class组被覆盖了, 如果想之前添加的附加组不被覆盖用-a选项:
usermod -aG 组名 用户名(注意a要写在G前面)
补充:
当遇到删除用户失败的情况:
这是因为在尝试删除用户时,发现该用户正在由某个进程使用。系统会拒绝删除一个正在被使用的用户账户,以防止可能的数据丢失或其他问题。要成功删除用户,你需要先确保没有任何进程在使用该用户。
在root用户下可能更不一样吧,直接告诉你进程数了,然后直接kill运行了该用户的进程,就可以删除该用户了。
如果没有直接给出进程数还需要用别的命令(fuser -u 用户名),且如果有多个进程,可采取别的高效方式去删除(例如使用循环结构),避免一个个手动删除。
kill -9 PID 会强制终止进程而不给予进程进行清理操作的机会。这可能导致数据丢失、资源泄漏或其他不良影响。
kill PID 发送一个终止信号给指定的进程,请求它正常地退出。进程有机会在终止之前完成清理工作,关闭文件、释放资源等。这是一个较为温和的终止方式,通常可以让进程正常退出。
同时修改用户信息
一开始user01的信息:
后来:(把主要组改成class,附加组添加了haha,注释行改了,交互式登录权限改了)
根据命令的选项进行一点解释说明
-u修改uid号,当指定的uid数很大时,则创建的下一个用户为其uid数+1
当给一个用户修改名字时用-l选项,且要注意要同步家目录名字
原来:
之后:
用usermod --help可以知道:
但是可以发发现主要组的名字还是没有变,
可以使用groupmod -n 新名 旧名
groupmod -g 可指定新的gid
上述内容的操作都是在root用户下,具有较高的管理权限。
获取root用户访问权限:用sudo命令
切换用户:su命令,如果从root用户运行su,不用输入密码。普通用户则需要
su 用户名和su - 用户名二者区别:命令su将启动非登录shell,仅以该用户身份启动shell,但使用的是原始用户的环境设置。 后者启动登录shell,将环境设置为如同以该用户身份重新登录一样。
su和su - 在省略用户名情况下,默认切换到root。
在普通用户中无法查看一些文件,如果要登录root用户又要知道其密码
给用户提权
一开始用head读取不了第一行,用sudo后可以,但是要输入当前用户自己的密码(输入后就可看到内容)
之后再去查看:
就不需要输入了,只要输入一次密码即可
(注意,普通用户可以查看/etc/passwd,不可以查看/etc/shadow)
如上在student用户没有查看权限的前提下在该命令开头加上sudo就可以查看,那是因为在装机之前就已经提升了管理员的权限,所以只要在执行命令时加上sudo即可
如果不是事先已经提权的用户,即使命令执行时加上sudo,也没有访问权限:
(sudoers文件时用来管理特权用户账户的,所以可以被提权的用户的信息及权限内容都在这个文件里。所以我们可以通过修改该文件内容来修改用户权限
在root用户下执行 vim /etc/sudoers 进入该文件
可以发现root用户权限无限大的原因
我们要想给用户提权或修改权限也可按照该语法去修改内容,注意该文件是只读,所以要想写入并保存要加上!,强制执行
保存退出之后再登录hello用户可以发现:
当给用户提权成root权限时,可以发现使用sudo去执行命令时,就相当于root在执行:
如上图,提权后像管理员一样不用输入密码,可以直接切换。
如上图,提权执行id命令,展示初的是管理员的信息。
如上图,sudo -i 也可以切换到管理员用户,和su - 一样
而sudo -s 和 su 相同
出于安全考虑我们可以只是给用户提升相关权限,而不是全部权限,这时就不是上面编辑的ALL,而是具体的某个权限,到那时并不是命令名字,而是该命令的绝对路径
可用which 命令获取命令所在绝对路径
如图修改,如果有多条命令可以用逗号隔开。(注意是usr不是user,很容易写错
保存修改文件后退出,登录hello用户在执行读取操作可以发现
执行useradd命令(提权后记得使用sudo执行该命令才有效,容易忘记
我们发现在这个文件中并没有student用户,但是我们可以发现:
%表示其不是一个用户而是一个用户组,
我们知道student在wheel这个附加组里,所以该组有的权限,组内的用户成员都享有。
但是我们可以发现每次执行命令都要输入密码,按文件内容提示,我们可以进行如下操作:
我们可以按照图上的注释知道,当我们对该组内容进行修改则可以不用密码:
用visudo 去查看和编辑/etc/sudoers
在文件中可以知道用visudo /etc/sudoers 编辑器内容是可读可写不用强制退出的,
只是失去了颜色罢了
(补充:logout和exit的区别
logout
命令用于注销用户(和ctrl d效果等同),而exit
命令用于退出当前的Shell会话。
管理用户密码
加密的密码被移动到只有root用户才能读取的独立/etc/shadow文件中(之前在passwd文件),与/etc/passwd相似,每个用户在/etc/shadow文件中都有对应的一行内容,其由九个冒号分隔字段组成。
每个字段代表内容:
vim /etc/shadow 可以看到
2、加密的密码
3、1970-1-1距今天数,18389天
4、 该值为0代表可以随时更改密码,如果为n等其它数值代表改后的n天内不的更改密码。代表n天后可以更改。(最小数值为0)
5、上面该值为99999天的密码有效期,这个时间内密码有效,可以不用更改(最大数值为99999)
6、上图该值为7,代表距离过期的7天前会提示警告过期信息
7、该值为空,代表过期了该账户不会被锁定,可继续使用,如果是n天,则表示过期后的n天内该账户还可以登录使用,过了n天则不可以
8、该值为空,表示不会在特定日期失效。直接设置密码多少天后过期(从1970-1-1开始算的天数),该字段优先级高于前面设置的有效期等,优先级高,到了天数直接过期。
加密密码的格式:
加密密码字段中存储了三段信息:所用的哈希算法、salt及加密哈希值。每段信息由¥符号分隔。每个字段内容如下:
密码验证
配置密码期限
想要修改密码内容,可以直接编辑/etc/shadow文件进行修改。(记得要强制保存退出)
下图分别用root用户和student用户对hello用户的密码的最小修改密码的天数进行修改。
只要记得参数选项就好(不同选项代表不同的修改字段)
根据不同选项即可对不同字段做出相应修改。
chage -d 0 用户名 表示强制用户在下一次登录时更新密码
chage -E 时间 用户名 表示用户在这个设定时间到期(时间可以自己设置,
可设置天数,如果不好计算具体哪天,可以用格式YYYY-MM-DD设定。如下
chage -l 用户 显示用户的密码期限详情
可用date -d 命令去计算距今天数对应的日期。-u选项可改变时区,变成UTC时区
限制访问
如上图,通过usermod修改账户到账日期并通过-L选项将user11用户锁定
图中所示,即使通过密码去的公路该锁定用户也无法登录。
其实也可修改锁定时间
r颗两个选项同时使用,记得-e在后面(忽略图中打错的命令
(补充:在一些操作系统中,默认情况下,普通用户可以使用sudo命令修改密码,但在其他一些系统中,可能需要登录root用户才能执行这个操作。