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 groupeffective 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基础知识相关推荐

  1. 【图文教程】Shell基础知识

    Shell基础知识 1. shell介绍 2. history命令 history主要参数示例: 3. 命令补全和别名 4. 通配符 5. 输入输出重定向 6. 管道符和作业控制 管道符: 作业控制: ...

  2. 3000字扫盲shell基础知识(新手必备)

    目录 shell基础语法之变量 shell 变量命名 shell 变量调用 shell 变量分类 shell 运算符 运算符种类 关系运算符 布尔运算符 字符串运算符 逻辑运算符 文件测试运算符 sh ...

  3. linux 运行class文杰,Linux Shell基础知识,你想的到的都在这里

    小编提示:此篇文章阅读时间为15分钟左右,可先收藏后阅读. 01/Linux 的江湖地位 Linux 作为一个全球用户超过14亿的操作系统,它的强大与神奇就不必多说了,混在IT界 Linux是可以装B ...

  4. Shell 基础知识--细说linux配套视频

    Shell 基础概括 Shell是什么? shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动.挂起.停止甚至是编写一些程序 ...

  5. shell基础知识总结

    1. shell 对于一台计算机而言,其硬件受系统内核的控制,使用者想要控制计算机,就必须有与系统内核进行通讯的手段.而shell就是使用者与计算机进行通讯的手段之一.从命名上看,shell其实是相对 ...

  6. Shell基础知识及字符处理

    1.1 简介 Shell是一个C语言编写的脚本语言,它是用户与Linux的桥梁,用户输入命令交给Shell处理,Shell将相应的操作传递给内核(Kernel),内核把处理的结果输出给用户. 下面是处 ...

  7. linux增删查改语句,mysql基础知识之增删查改使用介绍

    mysql基础知识之增删查改使用介绍 本文主要介绍mysql常用的SELECT.INSERT.UPDATE.DELETE语句的使用,数据库的安装这里不做介绍,并且事先已经准备好相关数据. 本文中使用的 ...

  8. Linux学习总结(十七)-shell 基础知识

    该篇内容很杂,但还是不难理解,就不逐个贴图举例. 一 先介绍几种常用字符: 1 * 匹配任意个任意字符 2 ?匹配一个任意字符 3 # 注释符号,符号后的语句不被执行 4 \脱意字符,后面跟带含义字符 ...

  9. linux创建zip+函数,linux+shell基础知识

    目录: 1.路径: 2.进程: 3.清屏和退出当前命令操作: 4.ls 参数: 5.创建目录\文件\复制文件: 6.查看文件内容: 7.linux通配符: 8.grep: 9.终止命令: 10.搜索文 ...

最新文章

  1. linux小知识之终端
  2. python三元表达式
  3. python封装c++接口_使用MetaSIP自动生成SIP封装C++到Python接口
  4. jQuery插件_SuperSlide插件(焦点图切换、标签切换、多个slide组合)
  5. NameNode启动
  6. VB6.0动态加载ActiveX控件漫谈[转]
  7. 连通性问题--Algorithms IN C读书笔记
  8. Centos使用Cacti监控你的网络
  9. lato字体可以商用吗_Google Fonts最受欢迎25款,免版权字体
  10. 史上最管用的C盘深度清理秘籍
  11. 完美解决Tensorflow不支持AVX2指令集问题
  12. 基于开源 Rexsee 的 UP 移动浏览器开放测试
  13. 对面积和坐标的曲面积分
  14. 深圳大学计算机专业评级,泰晤士中国学科评级榜单2021 南科大上榜学科全为A
  15. python抓取京东商品评价总数_python爬虫抓取和分析京东商城评价
  16. 綫程池 部分代碼實現 筆記
  17. CLion中回退和前进的快捷键
  18. C语言实现高精度除高精度
  19. 天池大赛-数智重庆比赛日志
  20. RTX腾讯通对话框字体 错乱修复 ,如发出去 是躺着的字

热门文章

  1. PS网页设计教程XII——在PS中创建专业的web2.0的网页布局
  2. PN结(空间电荷区的形成)
  3. 多种国际编码格式之间进行文本内码的转换
  4. 维基百科地址(应该是吧)
  5. 产品读书《孙子兵法》
  6. Linux-网卡命名方式改变了-enp0s3,enp0s8
  7. sql 函数length() 和lengthb()的区别
  8. 计算机考研复试专业课常见问题----1
  9. 边缘检测之Sobel检测算子
  10. FW:HP笔记本type-c接口失效