本文主要内容为Linux基础系统管理命令,包括文件管理、用户管理,权限管理,以及一些文本查看工具的介绍,同时也介绍了bash的基础特性、Globbing,以及Linux操作过程中帮助的获取方式等。
Linux基础命令
一、远程连接
在介绍命令之前,首选说明一下这里使用的环境,所有命令的执行时在Windows主机上,通过远程连接本地虚拟机的方式进行。LInux系统为CentOS 7.1 x64,远程连接工具为Xshell。
第一次连接的同学可以在Linux键入命令 ifconfig 来获取本机地址:
[root@localhost ~]# ifconfig
eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.18.128 netmask 255.255.255.0 broadcast 192.168.18.255
inet6 fe80::20c:29ff:fecf:6af3 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:cf:6a:f3 txqueuelen 1000 (Ethernet)
RX packets 539 bytes 49226 (48.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 501 bytes 57664 (56.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 0 (Local Loopback)
RX packets 22 bytes 2232 (2.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 22 bytes 2232 (2.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
笔者这里的地址为192.168.18.128,lo接口为本地环回接口(后面将详细介绍),而后打开Xshell,填写连接地址与名称:
![SSH连接](https://i-blog.csdnimg.cn/blog_migrate/f17401437a2d75aec550501b5ed91806.png)
由于这里使用SSH协议连接,需要Linux打开SSH服务,可使用如下命令查看:
[root@localhost ~]# netstat -tnl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 ::1:25 :::* LISTEN
tcp6 0 0 ::1:6010 :::* LISTEN
若主机监听TCP/22端口,则证明已经开启SSH服务(默认配置,可修改)
若一切无误,即可通过远程连接登录CentOS。
二、基础命令介绍
1. 基础命令
pwd
pwd意为Print Working Directory,即打印工作目录。对于现代操作系统而言,用户在登录后,一定会处于某一目录下,这个目录就叫做工作目录(Working Directory),使用pwd命令可以显示该位置,如:
[root@localhost ~]# pwd
/root
ls
ls为list之意,可列出目录内容,其用法如下:
ls [OPTION]... [FILE]...
OPTION | 描述 |
---|---|
-l | 使用长格式 |
-h, --human-readable | 通常与-l选项一同使用,可将文件大小显示为“人类易读的”形式,即对文件大小做格式转换,原默认单位为字节 |
-a, --all | 显示以"."开头的隐藏文件,有两个特殊目录: .当前目录, …上一级目录 |
-A, --almost-all | 与-a相同,但是不显示.与…目录 |
-d, --directory | 显示目录自身信息,而非其内容,通常与-l一起使用 |
-i, --inode | 显示文件的索引节点号 |
-S | 按文件从大到小排序 |
-t | 按文件创建时间排序 |
-r, --reverse | 逆序排列,即逐级向下显示子目录中的内容 |
-R, --recursive | 递归显示 |
如:
[root@localhost /]# ls /usr/
bin etc games include lib lib64 libexec local sbin share src tmp
[root@localhost /]# ls -a /usr/
. .. bin etc games include lib lib64 libexec local sbin share src tmp
[root@localhost /]# ls -d /usr/
/usr/
关于-l选项,其输出如下:
[root@localhost ~]# ls -l /etc/fstab
-rw-r--r--. 1 root root 541 Dec 20 04:12 /etc/fstab
各部分意义如下:
- -rw-r–r--.
- 共11位,最左侧一位表示文件类型,有一下几种类型:
- -:常规文件(file)
- d:目录文件(directory)
- b:块设备文件(block device)
- c:字符设备文件(character device)
- l:符号链接文件(symbolic link file)
- p:命名管道(pipe)
- s:套接字文件(socket)
- 第2到第10位表示文件的基本权限信息,rwx(读、写、执行),没有改权限则用"-"表示1,分为三组:
- 第一组为文件的属主权限
- 第二组为文件的数组权限
- 第三组为其他用户的权限
- 扩展权限,若文件设置了FACL,则此处为+,否则为.
- 共11位,最左侧一位表示文件类型,有一下几种类型:
- 1:文件被硬链接的次数
- root:文件的属主(owner)
- root:文件的数组(group)
- 541:文件大小,默认单位为字节
- Dec 20 04:12:文件最后一次的修改时间
- /etc/fstab:文件名
cd
cd意为Change Directory,可用于更改当前工作目录,若不跟参数,则默认切换到当前用户的家目录,若使用 ~USERNAME,可切换到指定用户的家目录(仅管理员可执行),如:
[root@localhost ~]# id centos
uid=1000(centos) gid=1000(centos) groups=1000(centos)
[root@localhost ~]# cd ~centos
[root@localhost centos]# pwd
/home/centos
tty
显示当前终端对应的终端 设备文件(前文有介绍),如
[root@localhost ~]# tty
/dev/pts/0
who
show who is logged on,查看当前系统上登录的所有用户及其信息,常用选项如下:
OPTION | 描述 |
---|---|
-b | 系统此次启动的时间 |
-d | 显示死亡的进程 |
-l | 显示登录进程 |
-r | 显示当前运行级别 |
如:
[root@localhost /]# who
root pts/0 2019-01-25 20:00 (192.168.18.1)
root pts/1 2019-01-25 20:00 (192.168.18.1)
[root@localhost /]# who -b
system boot 2019-01-25 19:58
[root@localhost /]# who -l
LOGIN tty1 2019-01-25 19:59 6337 id=tty1
[root@localhost /]# who -r
run-level 3 2019-01-25 19:59
[root@localhost /]# who -rb
system boot 2019-01-25 19:58
run-level 3 2019-01-25 19:59
[root@localhost /]# who -rbl
system boot 2019-01-25 19:58
run-level 3 2019-01-25 19:59
LOGIN tty1 2019-01-25 19:59 6337 id=tty1
file
查看文件内容格式,如
[root@localhost /]# file /etc/fstab
/etc/fstab: ASCII text
[root@localhost /]# file /dev/sda
/dev/sda: block special
[root@localhost /]# file /bin/cp
/bin/cp: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0x930ba1b99a27112a3ce696993ee8b38556235df2, stripped
echo
echo意为回声,即输出信息,有以下常用参数:
OPTION | 描述 |
---|---|
-n | 不为显示的内容自动添加换行符 |
-e | 启用转义(逃逸)符 |
-
常用转义符
- \b backspace 删除前一字符
- \n new line 换行符
- \r carriage return 回车符
- \t horizontal tab 横向制表符
- \v vertical tab 纵向制表符
-
\0NNN byte with octal value NNN (1 to 3 digits)
- \033[##m
- 第一个#:3表示前景色,4表示背景色
- 第二个# 颜色,1-7
- \033[0m 控制符结束
- 多个控制符使用分号隔开
- \033[##m
如:
[root@localhost /]# echo "Hello World"
Hello World
[root@localhost /]# echo -n "Hello World"
Hello World[root@localhost /]#
[root@localhost /]# echo -e "Hello\nWorld"
Hello
World
2. 时间相关
date
输入或设置系统日期或时间,使用格式:
date [OPTION]... [+FORMAT]
date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
YY:两位年份
CCYY:四位年份
FORMAT | 描述 |
---|---|
%a | locale’s abbreviated weekday name (e.g., Sun) |
%A | locale’s full weekday name (e.g., Sunday) |
%d | day of month (e.g, 01) |
%D | date; same as %m/%d/%y |
%F | full date; same as %Y-%m-%d |
%m | month (01…12) |
%M | minute (00…59) |
%n | a newline |
%s | seconds since 1970-01-01 00:00:00 UTC,timestamp |
%S | second (00…60) |
%T | time; same as %H:%M:%S |
%y | last two digits of year (00…99) |
%Y | year |
如:
[root@localhost /]# date
Fri Jan 25 20:19:28 CST 2019
[root@localhost /]# date +"%D"
01/25/19
[root@localhost /]# date +"This year is %Y"
This year is 2019
[root@localhost /]# date +"%Y-%m-%d"
2019-01-25
[root@localhost /]# date +"%F"
2019-01-25
cal
cal即calendar,显示系统日历:
[root@localhost ~]# cal
December 2018
Su Mo Tu We Th Fr Sa
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
clock, hwclock
clock的程序文件事实上是hwclock的符号链接,二者作用相同,用于查看硬件时钟。
Linux系统上有两套时钟,一个为主板上的硬件时钟,有独立电源供电,另一个问内核时钟,在系统启动时读取硬件时钟。二者在系统运行时可能不一致。
同步硬件时间与系统时间:
- # hwclock {-w|–systohc}: 将系统时间同步到硬件时间(改硬件时间)
- # hwclock {-s|–hctosys}: 将硬件时间同步到系统时间(改系统时间)
3. 关机命令
Linux有众多关机命令,如
# systemctl poweroff
# halt
-p 关机(poweroff)
--reboor 重启(reboot)
# shutdown
-r 重启(reboot)
-h 关闭(halt)
-c 取消关机(cancel)
-k 发送警告信息,禁止新用户登录
shutdown可以依据目前已启动的服务来逐次关闭各服务后才关机;
halt能够在不理会目前系统状况下,进行硬件关机。
4. 文本查看命令
cat
cat意为concatenate,连接文件并将其打印到标准输出,其使用格式为:
cat [OPTION]... [FILE]...
OPTION | 描述 |
---|---|
-E | 显示行结束符$ |
-s | 将多个连续的空白行显示为一行 |
-n | 显示行号 |
-v | 显示非打印字符 |
-e | 相当于-vE |
如,欲查看/etc/fstab文件内容:
[root@localhost /]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Wed Dec 19 20:12:26 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=a8cac4fb-841a-421d-ba11-ea7eee1c57bc /boot xfs defaults 0 0
/dev/mapper/centos-home /home xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
tac
与cat命令相似,只是默认按行逆序显示
[root@localhost /]# tac /etc/fstab
/dev/mapper/centos-swap swap swap defaults 0 0
/dev/mapper/centos-home /home xfs defaults 0 0
UUID=a8cac4fb-841a-421d-ba11-ea7eee1c57bc /boot xfs defaults 0 0
/dev/mapper/centos-root / xfs defaults 0 0
#
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
# Accessible filesystems, by reference, are maintained under '/dev/disk'
#
# Created by anaconda on Wed Dec 19 20:12:26 2018
# /etc/fstab
#
head
head意为头,顾名思义,可查看文本文件的前几行,默认为10
head [OPTION]... [FILE]...
[OPTION]
-c #: 指定获取前#字节
-n #: 指定获取前#行
-#:n可省略
如:
[root@localhost ~]# head -5 /etc/fstab
#
# /etc/fstab
# Created by anaconda on Wed Dec 19 20:12:26 2018
#
[root@localhost ~]# head -c 50 /etc/fstab
#
# /etc/fstab
# Created by anaconda on Wed Dec 1[root@localhost ~]#
该命令在执行完成后不会自动换行
tail
tail即尾部,同样,可用于查看文本文件的末尾几行,默认为10
tail [OPTION]... [FILE]...
[OPTION]
-c #: 指定获取后#字节
-n # 显示后#行
-#:n可省略
-f 显示文件尾部,不退出,等待显示后续追加至此文件的新内容,通常用来监视日志
如:
[root@localhost /]# tail -5 /etc/fstab
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=a8cac4fb-841a-421d-ba11-ea7eee1c57bc /boot xfs defaults 0 0
/dev/mapper/centos-home /home xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
more
more意为更多的,其命令手册解释为: file perusal filter for crt viewing,可用于显示文本文件,命令使用方式同man命令。与之不同的是,该命令在文件显示至尾部后,将会自动退出。
如:
[root@localhost /]# more /etc/fstab
#
# /etc/fstab
# Created by anaconda on Wed Dec 19 20:12:26 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=a8cac4fb-841a-421d-ba11-ea7eee1c57bc /boot xfs defaults 0 0
/dev/mapper/centos-home /home xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
[root@localhost /]#
less
less命令的同发与man命令相同,这里不再赘述。
- less与more的不同之处在于less命令在显示到文件尾部后不会自动退出,而more将会自动退出
如:
[root@localhost /]# less /etc/fstab
=============以下为新屏幕=============
#
# /etc/fstab
# Created by anaconda on Wed Dec 19 20:12:26 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=a8cac4fb-841a-421d-ba11-ea7eee1c57bc /boot xfs defaults 0 0
/dev/mapper/centos-home /home xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
/etc/fstab (END)
5. 目录与文件管理命令
cp
cp以为copy,即复制,用于复制文件或目录,格式:
cp SRC... DEST
若SRC是一个文件
若DEST不存在:创建此文件,并复制源文件的数据流至DEST中
若DEST存在:覆盖,此时建议使用-i选项
若DEST存在,且是个目录:复制源至目标目录中并保持源文件名
若SRC有多个文件
若目标存在,且是一个文件,报错
若目标存在,且是一个目录:复制个文件至目标目录中,并保持原名
若目标不存在,报错
若SRC是只有一个且是目录(cp目录默认只复制文件,不会复制目录)
若目标是一个文件且存在,报错
若目标不存在:创建新目录
若目标存在且是目录:复制源目录至目标目录中,且保持原名
常用选项
选项 | 描述 |
---|---|
-R, -r, --recursive | copy directories recursively,递归复制一个目录及其目录下所有位文件(包括子目录) |
-f, --force | 强行覆盖 |
-i, --interactive | 交互式复制,如提醒用户是否覆盖已存在的数据 |
-p | same as --preserve=mode(权限),ownership(属主属组),timestamps(时间戳),保留文件的属主、属组、权限以及时间戳 |
-a, --archive | same as -dR,archive(归档),保留文件所有属性,常用于备份 |
-d,–no-dereference,–preserv=links | 不追踪符号链接 |
–preserve[=ATTR_LIST] | ATTR_LIST - - - - mode:权限 - - - - ownership:从属关系(属主属组) - - - - timestamps:时间戳 - - - - links:链接属性 - - - - xattr:扩展属性 - - - - context:安全上下文 - - all:以上所有 |
-L, --dereference | always follow symbolic links,复制链接指向的文件(默认如此) |
-P, --no-dereference | never follow symbolic links in SOURCE ,保持链接 |
-d | same as --no-dereference --preserve=links,当源文件为连接文件时,复制链接文件本身而非其指向的源文件 |
如,复制/etc目录下所有以p开头,以非数字结尾的文件或目录到/tmp/mytest1目录中
[root@localhost /]# mkdir /tmp/mytest1
[root@localhost /]# ls -d /etc/p*[^[:digit:]]
/etc/pam.d /etc/pbm2ppa.conf /etc/plymouth /etc/popt.d /etc/prelink.conf.d /etc/profile.d /etc/python
/etc/passwd /etc/pinforc /etc/pm /etc/postfix /etc/printcap /etc/protocols
/etc/passwd- /etc/pki /etc/pnm2ppa.conf /etc/ppp /etc/profile /etc/pulse
[root@localhost /]# cp -r /etc/p*[^[:digit:]] /tmp/mytest1/
[root@localhost /]# ls /tmp/mytest1/
pam.d passwd- pinforc plymouth pnm2ppa.conf postfix prelink.conf.d profile protocols python
passwd pbm2ppa.conf pki pm popt.d ppp printcap profile.d pulse
mv
mv意为move,即移动,可用于移动文件位置,或文件重命名。使用格式如下:
mv [OPTION]... SOURCE... DIRECTORY
如果源和目标的路径相同,只是文件名不同,则为重命名
[OPTION]
-i prompt before overwrite 提示覆盖(默认管理员命令别名中存在)
-f do not prompt before overwriting 强制覆盖,不提示
-t, --target-directory=DIRECTORY
格式: mv -t DEST SRC
mv可以直接移动目录,而无需-r选项
install
install即安装,可用于复制文件并定制其属性,常用格式
单文件复制
install [OPTION]... [-T] SOURCE DEST
把多个文件复制到一个目录中:
install [OPTION]... SOURCE... DIRECTORY
install [OPTION]... -t DIRECTORY SOURCE...
创建目录
install [OPTION]... -d DIRECTORY...
[OPTION]
-m=MODE 指定权限,默认为755
-o=OWNER 指定属主
-g=GROUP 指定属组
mktemp
mktemp意为make temporary,可创建临时文件或目录。常见用法如下:
mktemp [OPTION]... [TEMPLATE]
[OPTION]
-d 创建临时目录
[TEMPLATE]
指定要创建的临时文件或目录的名称,需要至少包含3个“X”
如:
[root@localhost ~]# mktemp /tmp/mytmp
mktemp: too few X's in template ‘/tmp/mytmp’
[root@localhost ~]# mktemp /tmp/mytmpXXXX
/tmp/mytmp8wQ7
[root@localhost ~]# mktemp /tmp/mytmpXXXXXXXXX
/tmp/mytmp6CwrEUrFN
[root@localhost ~]# mktemp /tmp/mytmpX2X3X4X5X6X
mktemp: too few X's in template ‘/tmp/mytmpX2X3X4X5X6X’
mkdir
mkdir即make directory,创建空目录,用法如下:
mkdir [OPTION]... DIRECTORY...
[OPTION]
-p, --parents
no error if existing, make parent directories as needed
参数中路径的最后一个节点才是要创建的目录,即路径基名才为命令的作用对象
基名之前的路径须存在,若路径不存在可使用该选项创建
-v, --verbose
print a message for each created directory
-m MODE 创建目录时直接指定权限
如,使用命令行展开功能,创建/tmp/a1, /tmp/a2, /tmp/a1/a, /tmp/a1/b,在/tmp目录下创建目录:x_y, x_z, q_y, q_z
[root@localhost /]# mkdir -p /tmp/a{1/{a,b},2}
[root@localhost /]# mkdir /tmp/{x,q}_{y,z}
rmdir
rmdir意为remove directory,用于移除一个空目录
rmdir [OPTION]... DIRECTORY...
[OPTION]
-p, --parents Remove DIRECTORY and its ancestors
删除某目录后,若其父目录为空,则一并删除,依次类推
-v 显示详细信息
tree
tree意为树,我们通常将Linux目录结构称为倒置的树状结构,使用该命令可展示该结构,命令参数:
参数 | 说明 |
---|---|
-L level | 指定显示层级数目 |
-d | 只显示目录 |
-P pattern | 只显示由指定的pattern匹配到的路径 |
如:
[root@localhost ~]# tree -dL 1 /
/
├── bin -> usr/bin
├── boot
├── dev
├── etc
├── home
├── lib -> usr/lib
├── lib64 -> usr/lib64
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -> usr/sbin
├── srv
├── sys
├── tmp
├── usr
└── var
19 directories
rm
rm为remove,可移除文件或目录,该命令常用选项较少,但非常危险,请谨慎操作:
- -r, -R, --recursive:递归删除
- f, --force:强制删除
- -i:交互模式,在删除每一个文件前询问是否删除
由于管理员使用该命令风险较高,故mv、rm、cp等默认都为管理员用户设置了命令别名,用作提醒。
另外,建议所有不用的文件建议不要直接删除,而是移动至某个专用目录(模拟回收站)
三、bash基础特性
1. 命令历史
使用方式
bash会保存的过去曾经执行过的命令,在当前shell进程中,保存在内存缓冲区中;
在用户的家目录下有一个**.bash_history**的隐藏文件,在用户正常退出时,内存缓冲区中的命令历史会追加到该文件中
- Linux文件系统的另一特性:以点号开头的文件为隐藏文件,使用ls -a查看
用户在登陆时,系统会读取 ~/.bash_history 文件中记录下的命令
使用上下箭头键可以翻看此前曾经执行过的命令
可通过使用history命令查看命令历史
调用命令历史列表中的命令
按键 | 操作 |
---|---|
!n | 执行命令历史中的第n条命令 |
!-n | 执行命令历史中倒数第n条命令 |
!! | 执行上一条命令 |
!STRING | 执行命令历史中最近一个以STRING开头的命令(命令的重复执行有时候需要依赖于幂等性) |
!$ | 引用上一个命令的最后一个参数 |
ESC, . | (按下ESC后,松开按.),引用上一个命令的最后一个参数 |
Alt+. | 引用上一个命令的最后一个参数(远程终端可能不支持) |
命令:history
history,即历史,Display the history list with line numbers,用法:
history [-c] [-d offset] [n]
history -anrw [filename]
history -ps arg [arg...]
参数
-c 清空命令历史
-r 从文件读取命令历史到历史列表中
-w 把历史列表中的命令追加到历史文件中
-d OFFSET [n] 删除指定位置的命令
-a 追加当前会话的命令历史到历史文件中
# 显示历史中最近的#条命令
相关环境变量
- PATH:命令搜索路径
- HISTSIZE:命令历史缓冲区大小
- 在RedHat系统上默认是1000
- HISTFILE:命令历史文件
- HISTFILESIZE:命令历史文件中可以保存的命令的个数
- HISTCONTROL:控制命令历史的记录方式
- ignoredups 忽略重复的命令,连续相同的命令才为重复
- ignorespace 以空格开头的命令不会被记录
- ignoreboth 同时具有以上两个值的特性
2. bash的补全特性
我们在bash中输入时,可以通过敲Tab键来对我们的键入进行补全操作。
路径补全
按Tab可以补全以当前输入字符串开头的路径,若有多个,按两次Tab可以显示所有以该字符串开头的路径,若没有指出路径,则为当前目录。
该操作由bash搜索文件系统实现
命令补全
shell程序在接受到用户执行命令的请求,分析完成后,最左侧的字符串会被当做命令。在其搜索命令时,先搜索内部命令,而后将根据PATH坏境变量这设定的目录,自左而右逐个搜索目录下的文件名。
按Tab可以补全以当前输入字符串开头的命令,若有多个,按两次Tab可以显示所有以该字符串开头的命令,在PATH环境变量下搜索补全。
PATH环境变量是一组有冒号分隔的路径:
[root@localhost ~]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
由于进程在发起之前,其程序文件都是保存于计算机上的某位置,而我们之所以在键入命令时不必每次都输入命令的完整路径(即位置)就可以将其发起为一个进程(即运行命令),就是因为PATH环境变量。
3. 命令行展开
花括号展开
bash的*花括号展开特性可承载一个以逗号分隔的路径列表,并能够将其展开为多个,如:
[root@localhost ~]# mkdir -pv /mnt/test/{x/m,y}
mkdir: created directory ‘/mnt/test’
mkdir: created directory ‘/mnt/test/x’
mkdir: created directory ‘/mnt/test/x/m’
mkdir: created directory ‘/mnt/test/y’
以上命令同
[root@localhost ~]# mkdir -p /mnt/test/x/m
[root@localhost ~]# mkdir -p /mnt/test/y
[root@localhost ~]# mkdir -p /mnt/test/z
再如,使用展开用创建/tmp/test/a_b,a_c,d_b,d_c四个目录:
mkdir -pv /mnt/test/{a,d}_{b,c}
波浪线展开
- ~:展开为用户的主目录
- ~[USERNAME]:展开为指定用户的主目录
4. 快捷键
bash光标跳转的常用快捷键
按键 | 说明 |
---|---|
Ctrl+a | 跳到命令行首 |
Ctrl+e | 跳到命令行尾 |
Ctrl+u | 删除光标至命令行首的内容 |
Ctrl+k | 删除光标至命令行尾的内容 |
Ctrl+← | 向左跳转一个单词 |
Ctrl+→ | 向右跳转一个单词 |
Ctrl+l | 清屏,相当于clear命令 |
Ctrl+c | 取消或终止 |
Ctrl+z | 将当前命令送至后台,使用fg命令调回上次送至后台的进程 |
5. 命令别名
在我们经常使用某些冗长或不变记忆的命令时,可为其定义命令别名。
如在Windows中,cls为清空屏幕命令,而在Linux中为clear,若更习惯使用“cls”,则可将cls定义为clear的别名,如此,在执行cls时,bash将执行clear;
再如,我们若需要经常编辑/etc/sysconfig/network-scripts/ifcfg-eno16777736文件时,在输入时比较繁琐,可将其定义为别名,使用alias命令:
alias
[root@localhost ~]# alias vimnet='vim /etc/sysconfig/network-scripts/ifcfg-eno16777736'
如此,在运行vimnet后,将等同于键入了vim /etc/sysconfig/network-scripts/ifcfg-eno16777736。
不带参数的alias命令可用于查看当前shell已经生效的名别名:
[root@localhost ~]# alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias vimnet='vim /etc/sysconfig/network-scripts/ifcfg-eno16777736'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
上文有提到,rm等命令已经默认为管理员用户设置了命令别名,这里可以查询。
若命令别名设置的与原命令相同,可在命令前加“\”(反斜线)来执行原命令。
unalias
若要撤销设定的命令别名,可使用unalias命令:
unalias COMMAND_ALIAS
撤销命令别名时只需指定别名即可
常用选项
- -a:撤销所有别名
相关配置
使用alias设定的命令别名进队当前shell进程有效,可以在shell的配置文件中定义,使别名永久有效:
- 仅对当前用户有效:~/.bashrc
- 对所有用户有效:/etc/bashrc
若要使其立即生效,指定bash重新读取配置文件即可:
source /PATH/TO/CONFIG_FILE
该命令也可简写为.
. /PATH/TO/CONFIG_FILE
6. bash中的引号
引号,即为引用之意,bash中支持3种引用类型。
命令引用
使用反引号(``)引起来的内容将被当做命令执行,并将执行结果返回。
如,欲查看vim命令的课执行文件的类型:
[root@localhost ~]# which vim
/usr/bin/vim
[root@localhost ~]# file `which vim`
/usr/bin/vim: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked(uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0x530e3b1a3084847f35bfddc8527f432c028b7ca0, stripped
另外,使用 $(COMMAND) 也可实现相同的效果。
强引用
使用单引号(’’)可进行强引用,即引号中的内容将会按字符返回,不会被解析为其他意义(转义字符除外),所见即所得,如:
[root@localhost ~]# var1=1
[root@localhost ~]# echo $var1
1
[root@localhost ~]# echo '$var1'
$var1
弱引用
使用双引号("")为若引用,引号中的内容将会被解析为变量,如:
[root@localhost ~]# var1=1
[root@localhost ~]# echo "$var1"
1
[root@localhost ~]# echo $var1
1
[root@localhost ~]# echo '$var1'
$var1
如上所示,我们一般可以省略双引号。
7. 变量
变量(Variable) 相信大家并不陌生,其实质上就是一段命名的内存空间。而在bash中,同样支持变量的概念。
bash中的变量类型
变量类型 | 说明 |
---|---|
环境变量 | 作用域为当前shell进程及其子进程 |
本地变量 | 作用域为整个bash进程 |
局部变量 | 作用域为当前代码段(通常指函数) |
位置变量 | $1,$2,…用于让脚本在脚本代码中调用通过命令行传递给它的参数 |
特殊变量 | 保存某些特殊数据 |
-
特殊变量
- $0: 脚本名称本身
-
$?: 上一条命令的执行状态
- 状态用数字表示:0-255
- 成功:0
- 失败:1-255
- $$:脚本运行的当前进程ID
- $!:Shell最后运行的后台进程的PID
- $#: 参数数量
- $*: 所有参数的一个字符串
- $@:所有参数单独作为每个字符串
- $1、$2…:位置变量,对应第一、第二个参数 关于$@与$*的区别:
- 只有在双引号中体现出来。假设在脚本运行时写了三个参数(分别存储在$1 $2 $3)则"$*" 等价于 “$1 $2 $3"(传递了一个参数);而“$@" 等价于 “$1” “$2” “$3”(传递了三个参数)
变量声明
bash中变量的命名规则同其他语言类似,变量名只能包含数字、字母和下划线,而且不能以数字开头,另外,变量赋值时不能使用$。
本地变量的声明
bash为弱类型,故在声明变量时不必指定变量类型(但这不代表这些变量没有类型),可直接使用如下形式声明变量:
[set] VARNAME=VALUE
set可省略
使用不带参数的set命令可查看系统已定义的所有变量
只读变量的声明
readonly VARNAME
或
declare -r VARNAME
在声明时指定readonly,或使用declare -r,可声明只读变量(常量),由于其在声明后不可更改内容,需要在声明时进行初始化。
环境变量的声明
export VARNAME=VALUE
或
VARNAME=VALUE; export VARNAME
或
declare -x VARNAME
-
环境变量的查看
- printenv
- env
- export
环境变量对当前shell及其子shell都有效
局部变量的声明
local VARNAME=VALUE
仅对局部代码生效
变量的引用
- ${VARNAME} 不会引起混淆的话,{}可省略
- “” 弱引用,其中的变量引用会被替换为变量值
- ‘’ 强引用,其中的变量引用不会被替换为变量值,而保持原字符串
8. 重定向与管道
I/O重定向
Linux中一切皆文件,打开的文件都有一个FD(File Description)。即文件描述符,这里特别说明一下特殊的I/O文件:
- 默认输出设备:标准输出,STDOUT,默认为monitor,描述符为1
- 默认输入设备:标准输入,STDIN,默认为keyboard,描述符为0
- 标准错误输出:错误信息,STDERR,默认为monitor,描述符为2
默认设备
- 标准输入:键盘
- 标准输出和错误输出:显示器
而I/O重定向就是改变数据输入来源或输出目标的操作。
输出重定向与错误输出重定向
-
> 覆盖输出
- set -C : 禁止对已存在文件使用覆盖重定向
- >|: 强行覆盖输出(即使设置了set -C)
- set +C : 关闭上述功能
- set命令可以使用+或-来设置或取消相关选项
- set -C : 禁止对已存在文件使用覆盖重定向
-
>> 追加输出
-
2> 重定向错误输出(覆盖输出)
-
2>> 重定向错误输出(追加方式)
-
&> 覆盖重定向(标准输出与错误输出)
-
&>> 追加重定向(标准输出与错误输出)
如
[root@localhost ~]# echo 'hello world' > hello.out
[root@localhost ~]# cat hello.out
hello world
[root@localhost ~]# echo 'how are you' > hello.out
[root@localhost ~]# cat hello.out
how are you
[root@localhost ~]# echo 'new line' >> hello.out
[root@localhost ~]# cat hello.out
how are you
new line
[root@localhost ~]# ls /err 2> hello.out
[root@localhost ~]# cat hello.out
ls: cannot access /err: No such file or directory
[root@localhost ~]# lss /tmp 2>> hello.out
[root@localhost ~]# cat hello.out
ls: cannot access /err: No such file or directory
-bash: lss: command not found
[root@localhost ~]# ls / &>> hello.out
[root@localhost ~]# cat hello.out
ls: cannot access /err: No such file or directory
-bash: lss: command not found
bin
boot
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
-
标准输出和错误输出各自定向值不同位置
- COMMAND > /path/to/file.out 2> /path/to/error.out 合并标准输出和错误输出为同一个数据流进行重定向
- &> 覆盖重定向
- &>> 追加重定向
- COMMAND > /path/to/file.out 2> &1
- COMMAND >> /path/to/file.out 2> &1 程序的执行状态返回值
- Linux中的程序或指令在执行完成后,不只有执行结果(有的不会显示),还会有一个执行状态返回值(Return Code),用于标识该指令执行成功与否。
- 0表示执行成功,否则标识执行不成功,该值保存于变量$?中
输入重定向
- < 输入重定向
- << Here Document 在此处生成文档
- <<后的为文档结束符,如:cat >> /tmp/myfile.txt << EOF
管道
管道(pipe)的作用为连接程序,实现将前一个命令的输出直接定向后一个程序当作输入数据流,即前一个命令的输出作为后一个命令的输入。用法格式为
COMMAND1 | COMMAND2 | COMMAND3 | ...
如:
[root@localhost ~]# echo 'hello world' | tr 'a-z' 'A-Z'
HELLO WORLD
-
Tips
-
- 最后一个命令会在当前shell进程的子shell进程中执行
相关命令
tr
tr为translate的前2个字母,可用于转换或删除字符
tr [OPTION]... SET1 [SET2]
将SET1中的字符替换为SET2的字符
[OPTION]
-d delete characters in SET1, do not translate
该命令在执行时一般使用重定向,如:
tr 'ab' 'AB' < /etc/passwd # 将/etc/passwd文件中的a或b转换成A或B
tr 'a-z' 'A-Z ' < /etc/passwd # 将/etc/passwd文件中的小写字母转换成大写
将当前系统登录用户的信息转换为大写后保存至/tmp/who.out文件中
[root@localhost /]# id `whoami` | tr 'a-z' 'A-Z'
UID=0(ROOT) GID=0(ROOT) GROUPS=0(ROOT)
[root@localhost /]# id `whoami` | tr 'a-z' 'A-Z' >> /tmp/who.out
[root@localhost /]#
tee
如图,tee命令可将数据流分为“两份”,一份发送到标准输出,另一份可通过重定向输出到文件。
/dev/zero
/dev/null是使用软件模拟的特殊的设备文件
该设备被称为bit bucket,它就像一个垃圾桶,丢进去的数据都会消失。那这个设备有什么用呢?
我们知道程序的执行结果又两种,一种是正常的返回结果,另一种是程序的执行状态结果,用于标识程序是否正常执行。例如我们想知道用户“user1”是否存在,可以使用id命令2,而我们并不关心其本身信息,只是通过id命令的执行状态返回值判断其是否存在:
[root@localhost ~]# id user1 &> /dev/null
[root@localhost ~]# echo $?
1
[root@localhost ~]# useradd user1
[root@localhost ~]# id user1 &> /dev/null
[root@localhost ~]# echo $?
0
四、获取帮助
1. 内部命令获取帮助
内部命令帮助的获取可通过help命令获取,格式为:
# help COMMAND
2. 外部命令获取帮助
外部命令为文件系统上的某位置的与命令名称对应的可执行文件,一般会有一个参数–help,使用该参数可以查看基本帮助:
# COMMAND --help
另一种获取帮助的方式就是查看命令手册(manual),接下来将介绍。
3. 命令手册
通过man命令可查看命令手册:
# man COMMAND
手册文件的一般位置为:/usr/share/man/
对于内部命令,使用man时,查看的是当前shell的使用手册(内部命令一般使用–help选项查看)
查看命令在使用手册中的哪些章节出现过
whatis KEYWORD 精确查找
其执行过程是查询数据库进行的
如果whatis的数据库尚未生成,可以使用makewhatis手动生成
man –f KEYWORD 作用同whatis
man -k KEYWORD 模糊查找
apropos KEYWORD 作用同man -k
man NUMBER COMMAND
查看指定章节的命令使用手册
-
命令手册的章节:
- 1、 用户命令(/bin, usr/bin, usr/local/bin)
- 2、 系统调用
- 3、 库调用
- 4、 特殊文件以及设备文件
- 5、 配置文件格式:解释某一个命令的配置文件的语法
- 6、 游戏
- 7、 杂项:Miscellanea
- 8、 管理命令(/sbin, /usr/sbin, usr/local/sbin)及守护进程
- 9、 内核有关的文件
man命令的配置文件:/etc/man.config
# man -M /PATH/TO/SOMEWHERE COMMAND
到指定的位置下搜索COMMAND命令的手册页并显示之
使用q退出
命令手册的分段:
分段 | 说明 |
---|---|
NAME | 命令名称以及功能简要说明 |
SYNOPSIS | 用法说明包括可用的选项 |
DESCRIPTION | 命令功能的详尽说明,可能包括每一个选项的意义 |
MANUAL SECTIONS | 帮助手册段 |
OPTIONS | 说明每一个选项的意义 |
ENVIRONMENT | 环境变量 |
FILES | 次命令相关的配置文件 |
BUGS | 报告bug的对象 |
TIPS | 提示 |
EXAMPLES | 使用示例 |
SEE ALSO | 另外参照 |
-
SYNOPSIS:使用帮助中命令格式中的字符意义:
- []:可选的
- <>:必选的
- |:多选一
- … :同类内容可以出现多次
- {}:分组,无特殊意义 翻屏操作
- 向后翻一屏:SPACE, ^F 3, ^V
- 向前翻一屏:B, ^B
- 向后翻一行:ENTER, ^N, E, ^E, J, ^J
- 向前翻一行:K, ^K, Y, ^Y, P
- 向后翻半屏:D, ^D
- 向前翻半屏:U,^U
- 定位到当前屏幕的指定行:#
- 定位到文件指定的行:#G
- 定位到文件最后一行:G
-
查找操作
-
-
/KEYWORD: 向文件尾部搜索,不区分字符大小写
- n:下一个
- N:前一个
-
-
?KEYWORD: 向文件首部搜索,不区分字符大小写
- n:下一个(与查找命令方向相同)
- N:前一个(与查找命令方向相反)
man命令实质上是调用less命令进行输出,以上用法与less命令相同。
4. 在线文档
info COMMAND
使用Page Up与Page Down来翻页
Tab切换超链接,按ENTER可实现页面间的跳转
5. 程序帮助文档
很多应用程序自带有文档,位于/usr/share/doc/APP-VERSION
一般有以下文件:
- README:程序的相关信息
- INSTALL:安装帮助
- CNANGES:版本迭代时的改动信息
此外,Google也是一个很好的获取资料的途径。
五、时间戳
1. 基础概念
数据是以文件的形式存储在磁盘上,除了文件的数据(Data)本身,在存储时还会保存一些其他信息,即元数据(Metadata)4,时间戳信息就是其中之一。
Linux中的时间戳有三个,即
- 最近一次的访问时间(Access Time),atime
- 最近一次的修改时间(Modify Time),mtime
- 最近一次的改变时间(Change Time),ctime
这里说明一下mtime与ctime的区别,前面提到,文件在存储时,有Data与Metadata,他们存储在不同的区域
- mtime为修改时间,指的是修改了文件Data区域的时间
- ctime为改变时间,指的是修改了Metadata区域的时间(如文件名)
需要注意的是,文件的mtime改变后,ctime一定会改变,因为mtime存储在Metadata中
2. 相关命令
stat
stat意为状态,可查看文件或文件系统的状态,如:
[root@ ~]# cp /etc/fstab ./
[root@ ~]# stat fstab
File: ‘fstab’
Size: 541 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 206917765 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2018-12-30 11:15:58.721775819 +0800
Modify: 2018-12-30 11:15:58.721775819 +0800
Change: 2018-12-30 11:15:58.721775819 +0800
Birth: -
可以看到文件的相关元数据信息,其中的Access、Modify、Change即为其时间戳信息。
touch
touch意为触摸,用于改变文件的时间戳信息,用法如下:
touch [OPTION]... FILE...
[OPTION]
-a change only the access time 只改变访问时间
-c do not create any files 如果文件不存在也不创建
-m change only the modification time 只改变修改时间
-t STAMP
use [[CC]YY]MMDDhhmm[.ss] instead of current time
没有只修改改变时间的选项,因为对文件做的任何修改(包括时间戳)都会改变文件的属性(改变时间)
若FILE不存在,touch命令会自动创建该文件,故可使用该命令来创建文件,使用-c指定若文件不存在也不创建。
如:在/tmp目录下创建以tfile开头,后跟当前日期和时间的文件,文件名形如:tfile-2016-05-27-09-32-22
[root@localhost /]# touch /tmp/tfile-`date +"%F-%H-%M-%S"`
六、Globbing
Globbing,通配,即通用匹配之意,是指用一些特殊的字符,使其不标识其本来的字面意义,而标识某一类字符集合,以此为 模式(Pattern) 进行字符匹配。
通配符 | 描述 |
---|---|
* | 任意长度的任意字符 |
? | 任意单个字符 |
[] | 匹配指定字符范围内的任意单个字符 |
[^] | 指定范围以外的任意单个字符 |
关于范围,可使用如下方式表示,如
范围 | 描述 |
---|---|
[abc] | 从abc中匹配,注意:此通配不区分大小写 |
[a-m] | 从a-m范围内匹配,注意:此通配不区分大小写 |
[0-9] | 数字 |
[a-zA-Z] | 字母 |
[[:space:]] | 空白字符 |
[[:punct:]] | 标点符号 |
[[:lower:]] | 小写字符 |
[[:upper:]] | 大写字母 |
[[:alpha:]] | 大小写字母 |
[[:digit:]] | 数字 |
[[:alnum:]] | 数字和大小写字母 |
-
Tips
-
- 指定范围是不区分大小写,而指定单个字母时区分
-
- 外层[]表示匹配任意单个字符,里面为集合;
-
- 也支持^,如[^[:digit:]]表示非数字;
-
- 使用man 7 glob可查看相关帮助
例
-
字母开头,字母结尾,中间有空白字符:
[[:alpha:]]*[[:space:]]*[[:alpha:]]
-
显示/var目录下所有以l开头,以一个小写字母结尾,且中间出现至少一位数字的文件或目录;
# ls -d /var/l*[0-9]*[[:lower:]]
-
显示/etc目录下,以任意一位数字开头,且以非数字结尾的文件或目录;
# ls -d /etc/[0-9]*[^0-9]
-
显示/var目录下所有以l开头,以一个小写字母结尾,且中间出现一位任意字符的文件或目录;
# ls -d /vat/l?[[:lower:]]
-
显示/etc目录下,以任意一位数字开头,且以非数字结尾的文件或目录;
# ls -d /etc/[0-9]*[^0-9]
-
显示/etc目录下,以非字母开头,后面跟一个字母及其它任意长度任意字符的文件或目录;
# ls -d /etc/[^[:alpha:]][a-z]*
-
复制/etc目录下,所有以m开头,以非数字结尾的文件或目录至/tmp/brahming目录;
# cp -r /etc/m*[^0-9] /tmp/brahming
-
复制/usr/share/man目录下,所有以man开头,后跟一个数字结尾的文件或目录至/tmp/man/目录下;
# cp -r /usr/share/man/man*[0-9] /tmp/man
-
复制/etc目录下,所有以.conf结尾,且以m,n,r,p开头的文件或目录至/tmp/conf.d/目录下;
# cp -r /etc/[mnrp]*.com /tmp/conf.d
七、用户管理
1. 什么是用户
现代的计算机都是多任务(Multi-Tasks)与多用户(Multi-Users) 的,早期的计算机由于各种原因,并不是每个人独立拥有一台计算机,而计算机用户的概念就可以用户标识每一位使用者。如今,这一概念已经普遍使用。
对于Linux系统而言,用户是系统进行资源分派的单位,其主要关注:
- 认证(Authentication)
- 授权(Authorization)
- 审计(Accounting)
2. Linux用户
UID
UID(User ID),即用户ID,UID是系统用于标识用户的字符,用户输入的登录名(即用户名)也将会映射为UID进而有系统处理。
用户分类
- 管理员:UID为0
- 普通用户:UID:1-65535
- 系统用户:UID:1-999
- 在CentOS6中UID为1-499
- 系统用户对守护进程获取系统资源进行权限分配,不允许登陆系统
- 系统用户:UID:1-999
- 一般用户:1000-60000
- 在CentOS7中为500-60000
- 交互式登录
UID的范围规定在 /etc/login.defs文件中
UID与用户名的映射关系保存于文件 /etc/fstab中
3. 组
什么是组
组(Group) 是用户的容器,若几个用户属于一个组,就有了这个组拥有的权限,可以说组是一个权限设定的容器。
GID
和UID相同,GID(Grou ID) 即组ID,用于标识一个组。
组的分类
-
用户组类别①
- 管理员组:GID为0
-
普通组:GID:1-65535
- 系统组:GID:1-499,在CentOS7中GID为1-999
- 一般组:GID:500-60000,在CentOS7中GID为1000-60000
用户组类别②
- 基本组(主组):用户的默认组
- 附加组,额外组:默认组以外的其他组 用户组类别③
- 私有组:创建用户时,如果没有为其指定所属的组,系统会自动为其创建一个仅包含当前用户的且与当前用户同名的组,只包含一个用户
- 公共组:组内包含多个用户
4. 用户管理相关命令
useradd
useradd以为用户添加,用法如下:
useradd [options] USERNAME
[options]
-u UID 指定UID,其他用户尚未使用的
-g GID 指定GID(基本组),组要事先存在,可为组名,也可为GID
-G GID,... 指定GID(附加组),组要事先存在,可为组名,也可为GID,多个组之间使用逗号分隔
-c "COMMENT" 指定注释信息
-d, --home /PATH/TO/SOMEDIRECTORY
指定家目录
通过复制/etc/skel目录并重命名的方式实现
若指定的目录事先存在,则不会为用户复制环境配置文件
-s SHELL 指定shell
/etc/shells指定了当前系统可用的安全shell
默认为/etc/default/useradd 中的 SHELL 变量中指定的shell
-m -k 强制为用户创建家目录,并且当-k选项启用时,将/etc/skel/下的文件复制到当前用户的家目录
-M 不为用户创建家目录,即使/etc/login.defs中允许创建
-r 添加一个系统用户
不会用用户创建家目录
默认shell为/sbin/nologin
-D 显示创建用户的默认配置
-D[options] 修改选项的值
修改的结果保存于/etc/default/useradd文件中
-f 指定账户非活动期限,指定-1则永不禁用
关于配置文件,后文将介绍
另外,也可使用adduser命令,该命令为useradd命令的符号链接
[root@ ~]# file `which adduser`
/usr/sbin/adduser: symbolic link to `useradd'
userdel
userdel即User Delete,删除用户,该命令用法较为简单:
userdel [options] USERNAME
[options]
-r 同时删除家目录,默认不会删除
usermod
usermod为User Modify,可用于更改用户的属性,用法为:
usermod [options] USERNAME
[options]
-u 修改UID
-g 修改基本组
-G 修改附加组,如果用户此前已经有附加组,修改后会覆盖此前的附加组
-a -G 追加(append)附加组
-c 修改注释信息
-d 修改家目录,默认不会迁移用户的家目录,也不会创建指定目录
-d -m 修改家目录并且将原来目录中的文件移动至修改后的目录
-s 修改用户shell
-l 修改用户登录名
-L 锁定账号,锁定后无法登录
-U 解锁账号
passwd命令也可以锁定与解锁账户
-e YYYY-MM-DD
指明用户账号过期日期
-f INACTIVE
设定账户非活动期限
passwd
passwd即Password,密码之意,可用于更新用户的认证信息(如密码),用法如下:
passwd [OPTION] [USERNAME]
[OPTION]
--stdin 从标准输入读取用户密码
例:
echo "redhat" | passwd --stdin user3
-l 锁定账号
-u 解锁账号
账户锁定后,/etc/shadow文件该账户对应条目密码字段前会多一个感叹号(!),可手动加上,以锁定用户
-e DATE 过期期限
-n mindays 指定最短使用期限
-x maxdays 最大使用期限
-w warndays 提前多少天开始警告
-i inactivedays 非活动期限
-d 删除用户密码
红帽系统会禁止空密码用户登录
- 不带参数的passwd命令可用于修改自己的密码
- 只有管理员可以不输入原始密码而修改其他用户的密码
-
密码复杂性策略
- 1、 使用4中类型字符(大写字母,小写字母,数字,特殊字符)中至少3种;
- 2、 足够长,建议大于8位;
- 3、 使用随机字符串;
- 4、 定期更换;
- 5、 循环周期要足够大;
id
前文有提到,可使用id命令查看用户信息:
id [OPTION]... [USER]
[OPTION]
-u 仅显示有效的UID
-g 仅显示基本组ID
-G 所有组的GID(包括基本组可附加组)
-r 显示真实ID
-n 以上命令统与-n一起使用,则显示名称,而不是ID号
不带参数的id命令可用于查看自己的信息,如:
[root@ ~]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
su
su即switch user,可用于切换用户,在介绍命令用法之前,先介绍一下Shell类型。
站在用户的角度,Shell分为登录式Shell与非登录式Shell
- 登录式Shell:正常通过某终端登录
- 非登录式Shell:图形终端下打开的命令窗口(伪终端)、自动执行的shell脚本
su的选项:
su [options...] [-] [user [args...]]
[options]
-l:“su -l UserName”相当于“su - UserName”
-c 'COMMAND':仅以指定用户的身份运行此处指定的命令
-
切换用户的方式
- su UserName:非登录式切换,即不会读取目标用户的配置文件;
- su - UserName:登录式切换,会读取目标用户的配置文件;完全切换; Tips
- root su至其他用户无须密码;非root用户切换时需要密码; 换个身份执行命令
- su [-] UserName -c ‘COMMAND’
chage
chage以为change age,可修改用户的账号过期信息
chage [options] USER
[options]
-d 最近一次修改时间(YYYY-MM-DD)
-E 账号的过期(禁用)时间(YYYY-MM-DD)
-I 非活动时间,即用户锁定后允许用户修改密码的时间
-m 密码最短使用期限
-M 密码最长使用期限
-W 警告时长
-l 显示用户密码过期信息
chsh
该命令可修改用户的默认shell
whoami
查看自己的用户名
pwck
验证密码文件的完整性
grpck
验证组文件的完整性
chfn
修改用户的注释信息
5. 组管理相关命令
groupadd
groupadd可用于创建一个新组,用法为:
groupadd [options] group
[options]
-g GID 指定GID,如不指定,则为系统中最高GID+1
-r 添加为系统组
如,创建用户tom,指定UID为5001,指定家目录为/tmp/tom, 指定shell为/bin/zsh, 指定基本组为tom,附加组为jack
[root@localhost /]# groupadd jack
[root@localhost /]# groupadd tom
[root@localhost /]# useradd -u 5001 -d /tmp/tom -s /bin/zsh -g tom -G jack tom
创建用户gentoo,附加组为bin和root,默认shell为/bin/csh,注释信息为“Gentoo Distribution”
[root@localhost /]# useradd -G bin,root -s /bin/csh -c "Gentoo Distribution" gentoo
groupdel
groupdel用于删除用户组
groupmod
groupmod可修改组信息,用法有groupadd相似:
groupmod [options] GROUP
[options]
-g GID 修改GID
-n GRPNAME 修改组名
gpasswd
gpasswd拥有给组添加密码,用法:
gpasswd [OPTIONS] GROUPNAME
[OPTIONS]
-a USER 将USER添加至指定组中
-d USER 删除用户USER的以当前组为组名的附加组
-A user1,user2,... 设置有管理权限的用户列表
-M Set the list of group members.
-
说明:
- 1、 用户创建的文件的属组为当前用户的基本组
-
2、 用户可以使用newgrp命令,将用户的基本组临时更换为其他组
- newgrp GRPNAME
- 使用exit,可以退出临时切换过去的组
- 如果用户本不属于此组,则需要组密码
- 3、 若用户的附加组中没有该组,则需要输入组密码
newgrp
newgrp即new group,可临时切换指定组为用户的基本组
nwegrp [-] [group]
-:会模拟用户重新登录以实现重新初始化其工作环境
6. 相关文件或目录
用户相关
/etc/passwd
该文件是用户信息数据库,每一行定义一个用户。以root为例,内容为:
[root@ ~]# head -1 /etc/passwd
root:x:0:0:root:/root:/bin/bash
该文件的每一行有7个字段,用于共同指定一个用户的相关信息,中间使用半角冒号(:)分隔,依次为用户名、密码、用户ID、用户私有组ID、用户注释、家目录、用户默认shell程序,即:
account:password:UID:GID:GECOS:directory:shell
字段 | 说明 |
---|---|
account | 登陆名 |
password | 可以是加密的密码,也可以是占位符(man 8 pwconv查看) |
UID | the numerical user ID |
GID | 基本组(私有组)ID |
GECOS | 可选的,用户的注释(comment)信息 |
directory | the user’s $HOME directory |
shell | 用户的默认shell(/etc/shells指定了当前系统可用的安全shell) |
可使用man 5 passwd查看文件格式信息
/etc/shadow
该文件为真正的密码文件,主要保存认证口令,依然是每一行用于记录一个用户的信息,以root为例,内容为:
[root@ ~]# head -1 /etc/shadow
root:$6$ZoCI8lk/jgp94iAd$DoJAlzqhNm4rkITOB4Dk/C9xZIw2nyv6AwT6YFosfidI6g9bpEx1YrrRncQEpR9a97Z/m0WBuNer5ukS7znHc0:17884:0:99999:7:::
另外该文件还记录了用户密码的使用时间,如用户密码的最长使用天数、用户当前密码已经使用的天数、账户的失效时间、密码的非活动时间等,文件格式为:
login name:encrypted password:date of last password change:minimum password age:maximum password age:password warning period:password inactivity period:account expiration date:reserved field
各部分说明如下
字段 | 说明 |
---|---|
login name | 登录名 |
encrypted password | 加密后的密码 |
date of last password change | 自1970.1.1至上次修改密码经过的天数 |
minimum password age | 密码最短使用天数 |
maximum password age | 密码最长使用天数 |
password warning period | 密码警告区间,即自上次修改密码至密码有效天数前的时间(天) |
password inactivity period | 密码非活动区间,及在用户密码过期之后、禁用之前的天数 |
account expiration date | 账户过期时间,自1970.1.1至账户禁用的天数 |
reserved field | 保留字段 |
-
关于加密后的密码(
encrypted password)字段的说明:
- 该字段由3个$隔开,前两个$中间的1表示使用md5加密,第二个与第三个$中间为为加密的密码加的随机字符串(salt,即杂质),第三个$后面的为密码
- 用户在登登陆时,系统将用户输入的密码中加入该杂质,计算后与passwd中的比较
加密方式的标识5
ID | Method |
---|---|
1 | MD5 |
2a | Blowfish (not in mainline glibc; added in some Linux distributions) |
5 | SHA-256 (since glibc 2.7) |
6 | SHA-512 (since glibc 2.7) |
可使用man 5 shadow查看该文件格式信息
加密算法介绍
- 对称加密:加密和解密使用同一个密码
- DES(data encryption standard),3DES,AES(Advanced Encryption Standard)
- 公钥加密:每个密码都成对出现,一个为公钥(public key),一个为私钥(secret key)
- DSA(Digital Signature Algorithm),RSA
- 单向加密,散列加密:也叫指纹加密,提取数据特征码,只能由明文(数据)得到密文,不可逆。常用于数据完整性校验
- MD5,Message-Digest Algorithm 5,信息摘要
- SHA1,Secure Hash Algorithm,安全hash算法
此处简单说明单向加密
-
单项加密特点:
- 1、 雪崩效应:即初始条件的微小改变,将会引起结果的巨大变化;
- 2、 定长输出; 注意:输出的是16进制数字,而不是字符 常用的单项加密:
- MD5: Message Digest,128位定长输出,由麻省理工学院人工智能实验室研发
- SHA1: Secure Hash Algorithm,160 位定长输出
- SHA224: 224位定长输出
- SHA256: 256位定长输出
- SHA384: 384位定长输出
- SHA512: 512位定长输出
/etc/default/useradd
在/etc/default/useradd中定义了useradd命令的相关默认信息,以下为该文件内容:
[root@ ~]# cat /etc/default/useradd
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
useradd使用-D选项修改的内容将保存于该文件中
用户的当前shell保存在环境变量SHELL中
/etc/skel/目录
/etc/skel/中有一些环境配置文件
- .bash_profile 登录时应用的用户配置文件
- .bashrc 切换shell时应用的用户配置文件
- .bash_logout 注销时应用的用户配置文件
/etc/login.defs
/etc/login.defs文件中有PASS_MAX_DAYS, PASS_MIN_DAYS, PASS_MIN_LEN, PASS_WARN_AGE, UID与GID的最大最小数等默认参数
用户管理相关配置文件总结
File | Description6 |
---|---|
/etc/passwd | User account information. |
/etc/shadow | Secure user account information. |
/etc/group | Group account information. |
/etc/gshadow | Secure group account information. |
/etc/default/useradd | Default values for account creation. |
/etc/skel/ | Directory containing default files. |
/etc/login.defs | Shadow password suite configuration. |
组相关
/etc/group
该文件存储了组名与GID的映射关系,依然是使用冒号分隔,每行定义一个组,格式为:
-
group_name:password:GID:user_list
- group_name:组名
- password:密码,一般为密码占位符
- GID:组ID
- user_list:以此组为附加组的用户列表(用户的基本在保存于/etc/passwd)
/etc/gshadow
该文件与/etc/shadow类似,保存加密后的组密码,使用冒号分隔,每行定义一个组:
group name:encrypted password:administrators:members