Linux基础命令

本文主要内容为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连接

由于这里使用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,则此处为+,否则为.
  • 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 控制符结束
    • 多个控制符使用分号隔开

如:

[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

echo

2. 时间相关

date

输入或设置系统日期或时间,使用格式:

date [OPTION]... [+FORMAT]
date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
	YY:两位年份
	CCYY:四位年份
FORMAT描述
%alocale’s abbreviated weekday name (e.g., Sun)
%Alocale’s full weekday name (e.g., Sunday)
%dday of month (e.g, 01)
%Ddate; same as %m/%d/%y
%Ffull date; same as %Y-%m-%d
%mmonth (01…12)
%Mminute (00…59)
%na newline
%sseconds since 1970-01-01 00:00:00 UTC,timestamp
%Ssecond (00…60)
%Ttime; same as %H:%M:%S
%ylast two digits of year (00…99)
%Yyear

如:

[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, --recursivecopy directories recursively,递归复制一个目录及其目录下所有位文件(包括子目录)
-f, --force强行覆盖
-i, --interactive交互式复制,如提醒用户是否覆盖已存在的数据
-psame as --preserve=mode(权限),ownership(属主属组),timestamps(时间戳),保留文件的属主、属组、权限以及时间戳
-a, --archivesame as -dR,archive(归档),保留文件所有属性,常用于备份
-d,–no-dereference,–preserv=links不追踪符号链接
–preserve[=ATTR_LIST]ATTR_LIST
- - - - mode:权限
- - - - ownership:从属关系(属主属组)
- - - - timestamps:时间戳
- - - - links:链接属性
- - - - xattr:扩展属性
- - - - context:安全上下文
- - all:以上所有
-L, --dereferencealways follow symbolic links,复制链接指向的文件(默认如此)
-P, --no-dereferencenever follow symbolic links in SOURCE ,保持链接
-dsame 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命令可以使用+或-来设置或取消相关选项
  • >> 追加输出

  • 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

如图,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
      • 系统用户对守护进程获取系统资源进行权限分配,不允许登陆系统
  • 一般用户: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查看)
UIDthe numerical user ID
GID基本组(私有组)ID
GECOS可选的,用户的注释(comment)信息
directorythe 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

IDMethod
1MD5
2aBlowfish (not in mainline glibc; added in some Linux distributions)
5SHA-256 (since glibc 2.7)
6SHA-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的最大最小数等默认参数

用户管理相关配置文件总结
FileDescription6
/etc/passwdUser account information.
/etc/shadowSecure user account information.
/etc/groupGroup account information.
/etc/gshadowSecure group account information.
/etc/default/useraddDefault values for account creation.
/etc/skel/Directory containing default files.
/etc/login.defsShadow 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


  1. 这里暂不考虑特殊权限,关于特殊权限后续将详细介绍 ↩︎

  2. 关于用户管理类命令后文将介绍 ↩︎

  3. 这部分的“^”意为Ctrl键,如^F表示Ctrl+F。 ↩︎

  4. 后续将详细介绍 ↩︎

  5. 可使用man 3 crypt查看 ↩︎

  6. 表格摘自USERADD(8)-FILES ↩︎

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Brahming

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值