Linux之(5)账户和shell基础知识
Linux之(5)账户和shell基础知识
Author:onceday date:2022年8月23日
漫漫长路,而今才刚刚开始…
本内容主要收集整理于:
- 《Linux命令行与shell脚本编程大全》
- 《鸟哥的linux私房菜》
本内容基于ubuntu >= 20.04
系统。
1.引言
shell是一种CLI,即command line interface,文本命令行界面。
它有图形化的模拟界面,也有模拟终端的形式,界面大小是经典的80x24(字符宽度)。
在linux发行版本里面,如ubuntu和centos,在图形化的桌面环境下,也可以进入终端模式。
即:Ctrl + Alt + F1-F7
切换不同的终端,具体需要根据Linux版本确定。
终端的背景色、前景色等可以通过setterm
指令来更改,但目前环境下使用较少,直接安装漂亮的终端美化工具即可获得炫酷的效果。
Linux是一个很复杂的系统,而shell是一个最基本的打交道的地方,就像钓鱼一样,哪怕成为全国大师,依然要绑钩调漂。
这是最基础的知识,非常杂乱,但是关键时刻又很有用。
比如修改主机名,一般命令行显示的主机名字都过于机械了,因此可通过以下命令修改:
hostname new-name
然后重启shell终端,便可以看到新的主机名字的了,但是当linux重启之后,便会失效。可以通过文件修改静态主机名。位于/etc/hostname
,需要root
权限操作。
通过/etc/shells
可以查看当前支持的shell种类:
onceday@ubuntu:~$ cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/bash
/usr/bin/bash
/bin/rbash
/usr/bin/rbash
/bin/dash
/usr/bin/dash
/usr/bin/tmux
/usr/bin/screen
/bin/zsh
/usr/bin/zsh
2.获取shell的账户信息
当我们登入终端时,Linux系统根据/etc/passwd
文件里面的信息来确定使用哪一种shell。
shell类型很多,比如常见的bash、sh、zsh等,当然,这些shell基本是兼容的。
这个文件,字面意思是存储密码信息,但现在已经不用它存储了,密码信息加密放在/etc/shadow
里。
所以passwd
里面现在存放了一堆账户信息,比如UID,GID,主目录,默认使用的shell等。
如下所示:
onceday@LAPTOP-JUN9BRPR:~$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
.......
onceday:x:1000:1000:,,,:/home/onceday:/bin/bash
.......
once:x:1001:1002:onceday,4-1,142511422,142452211,none:/home/once:/bin/sh
中间省略了很多账号信息,这些账号是系统服务和应用使用的账号,典型如网页服务器,www服务,它们不能工作在root模式下,这样太不安全了,因此需要一个系统服务账号,这些账号的UID一般从较小开始分配,因此用户的UID可以分配大一些,避免与它们重复。
这些冒号分割的段信息如下:
once :x :1001 :1002 :onceday,4-1,142511422,142452211,none:/home/once :/bin/sh
用户名:密码:User ID:Group ID:账户的文本描述性信息 :主(home)目录:默认shell
因为passwd
文件已经不再存储密码信息了,所以都用x
代替了。
再来看一看etc/shadow
文件的内容:
root:$6$B.1YKsef······JGcchK.:18859:0:99999:7:::
daemon:*:18781:0:99999:7:::
bin:*:18781:0:99999:7:::
sys:*:18781:0:99999:7:::
onceday:$6$Brt······p7QngL0:18859:0:99999:7:::
once: :19224: :0 :99999:7 : : :
[1] :[2]:[3] :[4]:[5]:[6] :[7]:[8]:[9]
- [1]为用户名,对应
passwd
的用户名。 - [2]为密码,是加密之后的密码。
- [3]为最近一次修改密码的时间,是天数,从1970-01-01开始算起。
- [4]限制改密码的时间,必须要经过该天数之后才能改密码。
- [5]要求多少天之后必须改密码。
- [6]表名在密码过期前多少天提醒用户改密码。
- [7]密码过期多少天禁用用户账户。
- [8]用户账户被禁用的日期,是天数,从1970-01-01开始算起。
- [9]保留字段。
3.修改用户账号信息
如果这些命令无法访问,可能是/sbin,或者/usr/sbin
不在PATH里面,通过$PATH
可以查看当前路径.
3.1 添加新用户,useradd
这个添加新用户的命令非常快捷,可以一次性创建新用户账户及设置用户HOME目录
。
该命令使用系统默认值来创建账户。
onceday@ubuntu:~$ useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/sh
SKEL=/etc/skel
CREATE_MAIL_SPOOL=no
这些默认的含义大概是:默认加入GID为100的公共组,主目录在/home/username
下,主目录默认模板为/etc/skel
,账户密码过期后不会被禁用,账户没有设置过期日期,不自动在mail下创建接收邮件的文件。
实际情况有所不同,比如默认GID一般不是100了,而是自动增加的一个数字,主目录也不会自动创建。
因此可以使用以下的命令来创建:
sudo useradd -m username
sudo useradd -m -s shell-path username
sudo useradd -m -u uid username
参数很多,可以直接看帮助文档,这个还是比较好理解的。
默认参数可以在命令行改动,也可以在/etc/default/useradd
文件里直接修改。
3.2 删除用户,userdel
userdel
可以从系统中删除用户,它只会删除\etc\passwd
文件中的用户信息,而不会删除系统中属于该账户的任何文件。
可以通过以下两个命令来删除额外的文件:
userdel -r username
userdel -fr username
这命令会移除home
下的文件,-f
是强行移除,即使文件可能不属于准备删除的用户。
3.3 修改用户信息
常见有以下工具可修改:
命令 | 描述 |
---|---|
usermod | 修改用户账户的字段,指定相关组的从属关系 |
passwd | 修改已有用户的密码 |
chpasswd | 从文件中读取登录名密码对,并更新密码 |
chage | 修改密码过期日期 |
chfn | 修改用户账户的备注信息 |
chsh | 修改用户账户的默认登入shell |
finger | 查看用户信息 |
id | 查询账号所属的UID和GID信息 |
pwck | 检查/etc/passwd文件的配置信息 |
pwconv | 将/etc/passwd内的账号密码信息移到/etc/shadow内 |
pwunconv | 将/etc/shadow内的账号密码信息移到/etc/passwd内,会删除/etc/shadow |
usermod十分强大,可以修改大多数/etc/passwd
和/etc/shadow
里面的字段,可以通过它的帮助文档来使用。
此外usermod还可以锁定可解锁账户,如:
usermod -L username #锁定账户,然后就无法登入
usermod -U username #解锁账户,然后就可以登入
passwd可以修改密码,每个用户可以修改自己的密码,这和passwd的特殊权限SUID有关,任何用户执行它时将具有暂时修改/etc/passwd
的权限,即root
权限。
passwd [username]
使用chpasswd
可以修改大量用户的密码,即它可以从文本读入userid:passwd
的密码对:
chpasswd < users.txt
此外finger
也可以用于查看用户账号的具体信息。
finger username
4.修改用户组信息
组权限允许多个用户对系统中的对象共享一组共用的权限。
组信息保存在系统的一个文件上,即/etc/group
中。
onceday@ubuntu:~$ cat //etc/group
root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:syslog,onceday
tty:x:5:syslog
disk:x:6:
lp :x :7 :
组名 :组密码:GID:属于该组的用户列表
........
组密码允许非组内成员通过它成为该组成员,功能不是普遍使用,组密码位于/etc/gshadow
中。
onceday@LAPTOP-JUN9BRPR:~$ sudo cat /etc/gshadow
root:*::
daemon:*::
bin:*::
sys:*::
adm:*::syslog,onceday
tty:*::syslog
组名:密码:用户组管理员的账号:加入该用户组支持的所属账号
注意,这个用户组管理员账号,可以管理该组,比如是否加入某个用户到该组中。
要添加用户到一个组内,需要通过usermod
命令,不能通过直接修改/etc/group
文件来操作。
需要注意的是:当一个用户账号在/etc/group文件中指定了默认组时,该用户账号不会再作为该组成员出现在/etc/group文件中。
4.1 groupadd创建新组
onceday@ubuntu:~$ groupadd --help
Usage: groupadd [options] GROUPOptions:-f, --force exit successfully if the group already exists,and cancel -g if the GID is already used-g, --gid GID use GID for the new group-h, --help display this help message and exit-K, --key KEY=VALUE override /etc/login.defs defaults-o, --non-unique allow to create groups with duplicate(non-unique) GID-p, --password PASSWORD use this encrypted password for the new group-r, --system create a system account-R, --root CHROOT_DIR directory to chroot into-P, --prefix PREFIX_DIR directory prefix--extrausers Use the extra users database
可以看到,直接使用groupadd groupname
即可创建新组了,但是不存在创建时指定组员的命令,需要通过usermod
命令手动添加。
此外,-r
可指定创建系统账户,以及-g
指定GID和-p
指定密码等。
当更改了账户所需的信息后,已登入账号需要重新登入后才能生效。
4.2 修改组groupmod
onceday@ubuntu:~$ groupmod
Usage: groupmod [options] GROUPOptions:-g, --gid GID change the group ID to GID-h, --help display this help message and exit-n, --new-name NEW_GROUP change the name to NEW_GROUP-o, --non-unique allow to use a duplicate (non-unique) GID-p, --password PASSWORD change the password to this (encrypted)PASSWORD-R, --root CHROOT_DIR directory to chroot into-P, --prefix PREFIX_DIR prefix directory where are located the /etc/* files
可以更改GID,name,密码,和所属的文件夹。
4.3 下面的是一些常见的其他命令
命令 | 描述 |
---|---|
groupdel | 删除用户组,注意无法直接删除初始用户组 |
gpasswd | 指定某个用户为某个组的管理员 |
5.额外信息
5.1 保存账号信息
登入账号的时候,Linux会读取/etc/passwd
、/etc/group
和/etc/shadow
、/etc/gshadow
里面的账号和密码信息,因此,如果要保存当前的账号信息,一定要把这三个文件都备份下来。
需要注意它的权限必须符合以下规则:
onceday@ubuntu:~$ ll /etc/passwd
-rw-r--r-- 1 root root 3013 Sep 10 17:19 /etc/passwd
onceday@ubuntu:~$ ll /etc/shadow
-rw-r----- 1 root shadow 1683 Aug 29 21:52 /etc/shadow
onceday@ubuntu:~$ ll /etc/group
-rw-r--r-- 1 root root 1171 Aug 29 21:52 /etc/group
onceday@ubuntu:~$ ll /etc/gshadow
-rw-r----- 1 root shadow 974 Aug 29 21:52 /etc/gshadow
5.2 忘记密码如何做?
对于普通用户,需要使用root
账户来修改密码,直接passwd name
即可。
对于root
用户,那么需要直接清除/etc/shadow
里面密码即可,例如:
- 进入单人维护模式,此时系统会主动给与root权限的bash接口
- 启动其他的linux系统,挂载
/etc/shadow
所在的文件系统,然后清除对应密码即可。
5.3 初始用户组initial group
和effective group
在/etc/passwd
里面账户信息里,会有一个GID,该GID所对应的用户组,即是该账号的初始用户组,初始用户组对应的账号不会在/etc/group
里面记录,这是新版Linux的特征。
当用户一登入时,立马会拥有该用户组的相关权限。
但是可以通过usermod
指令,为user添加多个组,如:
usermod -a -G user-groups user
-a
表示扩增用户组,-G
表示次要用户组,这样就可以添加多个用户组到一个用户上。
可直接在命令行输入groups
来获取当前账户的全部用户组信息。
onceday@ubuntu:~$ groups
OD adm dialout cdrom floppy sudo audio dip video plugdev netdev docker
第一个OD是初始用户组,即/etc/passwd
里面对应UID的用户组。
同时第一个输出的用户组OD也是有效用户组,因此新建文件默认的组是OD组。
可使用newgrp
命令来切换有效用户组,该命令切换的用户组必须是groups里面输出组其中一个。
该命令是通过重新开一个shell实现用户组切换的。
6.访问控制列表ACL
ACL是Acess Control List的缩写,用于提供详细的权限设置。
可以针对单一用户、单一文件或目录进行r、w、x的权限设置。
首先可以检查系统是否支持ACL属性,使用以下命令行:
dmesg |grep -i acl
6.1 获取ACL设置选项
使用命令getfacl
:
onceday@ubuntu:~$ getfacl .
# file: .
# owner: onceday
# group: OD
user::rwx
group::r-x
other::r-x
onceday@ubuntu:~$ getfacl --help
getfacl 2.2.53 -- get file access control lists
Usage: getfacl [-aceEsRLPtpndvh] file ...-a, --access display the file access control list only-d, --default display the default access control list only-c, --omit-header do not display the comment header-e, --all-effective print all effective rights-E, --no-effective print no effective rights-s, --skip-base skip files that only have the base entries-R, --recursive recurse into subdirectories-L, --logical logical walk, follow symbolic links-P, --physical physical walk, do not follow symbolic links-t, --tabular use tabular output format-n, --numeric print numeric user/group identifiers-p, --absolute-names don't strip leading '/' in pathnames-v, --version print version and exit-h, --help this help text
6.2 设置acl权限
setfacl [-bkRd] [{-m|-x} acl参数] 目标文件名
-m
设置后续的ACL参数给文件使用,不可与-x合用-x
删除后续的ACL参数,不可与-m
合用-b
删除所有的ACL设置参数-k
删除默认的ACL参数-R
递归设置ACL,即包括子目录都会设置起来-d
设置默认ACL参数的意思,只对目录有效。
1.对单一用户设置权限:
set -m u::rwx filename
此时查看该文件权限,可能会额外多出来一些权限,如:
onceday@ubuntu:~$ setfacl -m u:chenguang:rw hello.c
onceday@ubuntu:~$ ll hello.c
-rw-rw-r--+ 1 onceday OD 135 Oct 12 2021 hello.c
onceday@ubuntu:~$ getfacl hello.c
# file: hello.c
# owner: onceday
# group: OD
user::rw-
user:chenguang:rw-
group::r--
mask::rw-
other::r--
2.对用户组设置权限如下:
setfacl -m g:mygroup1:rx filename
3.设置有效权限(mask对应的权限):
setfacl -m m:rwx filename
需要注意: 用户组或用户所设置的权限必须要存在于mask的权限范围内才会生效。
4.使用默认权限设置目录未来文件的ACl权限继承
setfacl -m d:u:myuser1:rx directory #设置用户默认继承权限
setfacl -m d:g:mygroup1:rx directory #设置用户组默认继承权限
取消上面设置的这些权限,也要经过setfacl -b
命令就可以了。
在设置无任何权限的ACL语法中,权限的字段不可以留白,应该如下:
setfacl -m u:xxx:- filename
7.用户身份切换
7.1 切换登入账号
使用su
命令
su user #代表直接切换到user
su - user #代表使用login-shell的变量文件读取方式登入系统
直接使用su
切换到root用户,会有很多变量没有重新设置,因此最好使用su -
的切换方式。
su -m/-p
表示使用目前的环境设置,而不读取新使用者的配置文件。
su -c
表示仅执行一次命令。
7.2 sudo命令
该sudo的执行权限需要在创建账户的时候指定为system account才行。
也可以在/etc/sudoers
文件处修改添加。
用法如下:
sudo [-b] [-u username] .......
-b
表示是否放在后台中让系统自动执行,不与当前的shell产生影响。
-u
后面可以接准备切换的使用者,无此项代表切换为root。
该命令需要通过visudo
来修改,实际上普通文本编辑也可以。
# User privilege specification
root ALL=(ALL:ALL) ALL# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
onceday ALL=(ALL) NOPASSWD: ALL
对于第一个行的各字段含义如下:
root ALL=(ALL:ALL) ALL
使用者账号 登入者的来源主机名称=(可切换的组:用户者) 可执行的命令
带有%admin
表示的是用户组,NOPASSWD表示使用sudo的时候无需密码。
最后的ALL
是允许所有命令,也可以用绝对路径指定可以执行的命令。
也可以使用!/usr/bin/passwd root
阻止其他sudo权限用户更改root的密码。这里可以使用通配符。
如!/usr/bin/passwd [A-Za-z]*
。
sudo命令可以通过别名来快速设置用户以及可执行的命令,如下:
User_Alias MY_USER = user1,user2,user3,user4
Cmnd_Alias My_USER_CMD = !/user/bin/passwd, ......
MY_USER ALL=(root) MY_USER_CMD
类似的别名包括User_Alias、Cmnd_Alias、Host_Alias,都需要使用大写字符。
sudo一般在5分钟内使用是无需再输入密码的。
8.特殊shell
8.1 无法登入的shell,/sbin/nologin
使用了该shell的账号,无法登入各类shell,如bash,csh等,会显示该账号目前不可用。
可以更改/etc/nologin.txt
文件,这样可以定制显示的内容。
8.2 PAM模块的安全限制
在/etc/security/limits.conf
文件中,可以对账户做一些限制,已登入账号必须重新登入才生效。
# /etc/security/limits.conf
#
#Each line describes a limit for a user in the form:
#
#<domain> <type> <item> <value>
#
#Where:
#<domain> can be:
# - a user name
# - a group name, with @group syntax
# - the wildcard *, for default entry
# - the wildcard %, can be also used with %group syntax,
# for maxlogin limit
# - NOTE: group and wildcard limits are not applied to root.
# To apply a limit to the root user, <domain> must be
# the literal username root.
#
#<type> can have the two values:
# - "soft" for enforcing the soft limits
# - "hard" for enforcing hard limits
#
#<item> can be one of the following:
# - core - limits the core file size (KB)
# - data - max data size (KB)
# - fsize - maximum filesize (KB)
# - memlock - max locked-in-memory address space (KB)
# - nofile - max number of open file descriptors
# - rss - max resident set size (KB)
# - stack - max stack size (KB)
# - cpu - max CPU time (MIN)
# - nproc - max number of processes
# - as - address space limit (KB)
# - maxlogins - max number of logins for this user
# - maxsyslogins - max number of logins on the system
# - priority - the priority to run user process with
# - locks - max number of file locks the user can hold
# - sigpending - max number of pending signals
# - msgqueue - max memory used by POSIX message queues (bytes)
# - nice - max nice priority allowed to raise to values: [-20, 19]
# - rtprio - max realtime priority
# - chroot - change root to directory (Debian-specific)
#
#<domain> <type> <item> <value>
##* soft core 0
#root hard core 100000
#* hard rss 10000
#@student hard nproc 20
#@faculty soft nproc 20
#@faculty hard nproc 50
#ftp hard nproc 0
#ftp - chroot /ftp
#@student - maxlogins 4
8.3 PAM的错误日志
在/var/log/secure
的日志中,会记录一些登入错误问题,可以有助于定位账号类的问题。
9.不同用户之间信息传递
9.1 查询用户的名字
命令 | 描述 |
---|---|
w | 查询已登入的用户 |
who | 查询已登入的用户 |
last | 查询登入者以往的登入信息 |
lastlog |
直接输出/etc/log/lastlog 日志文件,包含大量账号最近登入的时间
|
9.2 用户间交流
使用write user [tty]
可以向指定用户发送消息。
使用mesg n/y
可以开启或者关闭消息,不过对root用户来说,其消息无法屏蔽。
可以使用wall "message"
群体发送警告消息。
Linux之(5)账户和shell基础知识相关推荐
- 【图文教程】Shell基础知识
Shell基础知识 1. shell介绍 2. history命令 history主要参数示例: 3. 命令补全和别名 4. 通配符 5. 输入输出重定向 6. 管道符和作业控制 管道符: 作业控制: ...
- 3000字扫盲shell基础知识(新手必备)
目录 shell基础语法之变量 shell 变量命名 shell 变量调用 shell 变量分类 shell 运算符 运算符种类 关系运算符 布尔运算符 字符串运算符 逻辑运算符 文件测试运算符 sh ...
- linux 运行class文杰,Linux Shell基础知识,你想的到的都在这里
小编提示:此篇文章阅读时间为15分钟左右,可先收藏后阅读. 01/Linux 的江湖地位 Linux 作为一个全球用户超过14亿的操作系统,它的强大与神奇就不必多说了,混在IT界 Linux是可以装B ...
- Shell 基础知识--细说linux配套视频
Shell 基础概括 Shell是什么? shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动.挂起.停止甚至是编写一些程序 ...
- shell基础知识总结
1. shell 对于一台计算机而言,其硬件受系统内核的控制,使用者想要控制计算机,就必须有与系统内核进行通讯的手段.而shell就是使用者与计算机进行通讯的手段之一.从命名上看,shell其实是相对 ...
- Shell基础知识及字符处理
1.1 简介 Shell是一个C语言编写的脚本语言,它是用户与Linux的桥梁,用户输入命令交给Shell处理,Shell将相应的操作传递给内核(Kernel),内核把处理的结果输出给用户. 下面是处 ...
- linux增删查改语句,mysql基础知识之增删查改使用介绍
mysql基础知识之增删查改使用介绍 本文主要介绍mysql常用的SELECT.INSERT.UPDATE.DELETE语句的使用,数据库的安装这里不做介绍,并且事先已经准备好相关数据. 本文中使用的 ...
- Linux学习总结(十七)-shell 基础知识
该篇内容很杂,但还是不难理解,就不逐个贴图举例. 一 先介绍几种常用字符: 1 * 匹配任意个任意字符 2 ?匹配一个任意字符 3 # 注释符号,符号后的语句不被执行 4 \脱意字符,后面跟带含义字符 ...
- linux创建zip+函数,linux+shell基础知识
目录: 1.路径: 2.进程: 3.清屏和退出当前命令操作: 4.ls 参数: 5.创建目录\文件\复制文件: 6.查看文件内容: 7.linux通配符: 8.grep: 9.终止命令: 10.搜索文 ...
最新文章
- linux小知识之终端
- python三元表达式
- python封装c++接口_使用MetaSIP自动生成SIP封装C++到Python接口
- jQuery插件_SuperSlide插件(焦点图切换、标签切换、多个slide组合)
- NameNode启动
- VB6.0动态加载ActiveX控件漫谈[转]
- 连通性问题--Algorithms IN C读书笔记
- Centos使用Cacti监控你的网络
- lato字体可以商用吗_Google Fonts最受欢迎25款,免版权字体
- 史上最管用的C盘深度清理秘籍
- 完美解决Tensorflow不支持AVX2指令集问题
- 基于开源 Rexsee 的 UP 移动浏览器开放测试
- 对面积和坐标的曲面积分
- 深圳大学计算机专业评级,泰晤士中国学科评级榜单2021 南科大上榜学科全为A
- python抓取京东商品评价总数_python爬虫抓取和分析京东商城评价
- 綫程池 部分代碼實現 筆記
- CLion中回退和前进的快捷键
- C语言实现高精度除高精度
- 天池大赛-数智重庆比赛日志
- RTX腾讯通对话框字体 错乱修复 ,如发出去 是躺着的字