第二章 Linux基础入门
1 Linux基础
1.1 用户类型
- root用户:超级管理员,root拥有完整的系统控制权限,但是用得不好,对系统损害也是最大的。
- 普通用户:除了root用户之外,其他都可以称之为普通用户。权限有限,并且造成损害的能力也比较有限
1.2 终端
设备终端包括:键盘、鼠标、显示器
1.2.1 终端类型
- 控制台终端:/dev/console
- 串行终端:/dev/ttyS#
- 虚拟终端:/dev/tty# tty可以有N个
- 图形终端:xwindows,startx
- 伪终端:/dev/pts#。如:SSH远程连接
1.2.2 查看当前的终端设备
tty命令可以查看当前所在终端
[root@nginx-18 ~]# tty
/dev/pts/1
1.3 交互式接口shell
Shell是Linux系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接受用户输入的命令并把它送入内核去执行。
Shell也被称为Linux的命令解释器,Shell本身是一个程序。将用户输入的命令行拆解为”命令名”和”参数”。接着,根据命令名找到对应要执行的程序,对被执行的程序进行初始化,然后将刚才解析出来的参数传给该程序并执行。
Shell是一种高级程序语言,提供了变量、函数、条件判断、循环等常见的开发功能。
1.3.1 各种shell
- sh:bash的软链接
- bash:Centos默认使用的shell
- csh:C shell,一种C语言风格的shell
- ksh:Korn Shell,AIX默认shell
我们这里主要讲解bash shell
显示当前使用的shell
[root@nginx-18 ~]# echo $SHELL
/bin/bash
显示当前系统使用的所有shell
[root@nginx-18 ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
1.4 设置主机名
#临时生效
[root@nginx-18 ~]# hostname nginx-18
#永久生效
[root@nginx-18 ~]# hostnamectl set-hostname nginx-18
注意:
- 主机名不支持使用下划线,但支持横线,可使用字母、横线或数字组合
- 有些软件对主机名有特殊要求
1.5 命令提示符
登录Linux后,默认的系统提示符是毫无个性的,我们可以通过修改PS1变量实现个性的提示符格式。
1.5.1 默认提示符
#默认的提示符
[root@nginx-18 ~]#
PS:
# 表示是管理员
$ 表示是普通用户
1.5.2 显示提示符
[root@nginx-18 ~]# echo $PS1
[\u@\h \W]\$
1.5.3 提示符格式说明
\d :#代表日期,格式为weekday month date,例如:"Mon Aug 1"
\H :#完整的主机名称。
\h :#仅取主机的第一个名字。
\t :#显示时间为24小时格式,如:HH:MM:SS
\T :#显示时间为12小时格式
\A :#显示时间为24小时格式:HH:MM
\u :#当前用户的账号名称
\v :#BASH的版本信息
\w :#完整的工作目录名称。家目录会以 ~代替
\W :#利用basename取得工作目录名称,所以只会列出最后一个目录
\# :#下达的第几个命令
\$ :#提示字符,如果是root时,提示符为:# ,普通用户则为:$
\e :#控制符 这里面可以写入颜色
1.5.4 修改提示符
#临时生效,重启系统失效
[root@nginx-18 ~]# PS1="[\t \e[32;40m\]\u\[\e[37;40m\]@\h \[\e[36;40m\]\w\[\e[0m\]]\\$ "
[17:58:24 root@nginx-18 ~]#
#永久生效
[root@nginx-18 ~]# vim /etc/bashrc
PS1="[\t \e[32;40m\]\u\[\e[37;40m\]@\h \[\e[36;40m\]\w\[\e[0m\]]\\$ "
[root@nginx-18 ~]# . /etc/bashrc
1.6 Shell中的命令
Shell中可执行的命令有两类
- 内部命令:由Shell自带的,而且通过某命令形式提供
- 外部命令:在文件系统路径下有对应的可执行文件
1.6.1 区别命令是否是外部或内部
[18:37:59 root@nginx-18 ~]# type cd
cd 是 shell 内嵌
[18:38:01 root@nginx-18 ~]# type find
find 是 /usr/bin/find
1.6.2 查看外部命令路径
which 详细查看命令的路径
主要选项:--skip-alias 不显示别名
[18:38:04 root@nginx-18 ~]# which find
/usr/bin/find
1.6.3 Hash缓存表
系统初始hash表为空,当外部命令执行时,默认会从PATH路径下寻找该命令,找到后会将这条命令的路径记录到hash表中,当再次使用该命令时,shel解释器首先会查看hash表, 存在将执行之,如果不存在,将会去PATH路径下寻找,利用hash缓存表可大大提高命令的调用速率。
hash命令常见用法:
-d name #清除name缓存
-l #显示hash缓存
-p path name #将命令全路径path起别名为name
-r #清除缓存
-t #打印缓存中name的路径
1.6.4 命令别名
对于经常执行的较长命令,可以将其定义成较短的别名,以方便执行
1、alias 查看和设置别名
#查看别名,直接输入alias。
#设置别名:alias cp='cp -i'
alias rm='echo "this command does not allow to ues"'
别名的配置文件:/etc/profile或者/etc/bashrc 全局生效
~/.bashrc #当前用户生效
天坑:设置alias rm='echo "this command does not allow to ues"',并且在/etc/profile下配置了,但是在下次登录的时候,还是有问题。问题原因在于/root/.bashrc配置文件中,也有alias rm='rm -i',需要把这一行给注释掉
2、取消别名
unalias 取消别名
unalias rm
1.6.5 命令格式
COMMAND [OPTIONS...] [ARGUMENTS...]
COMMAND [COMMAND] [COMMAND] ....
选项:用于启用或关闭命令的某个或某些功能
- 短选项:UNIX风格选项,-c 列如:-l,-h
- 长选项:GNU风格选项,—word 列如:—all —human
- BSD风格选项:一个字母,列如:a,使用相对较少
[18:58:53 root@nginx-18 ~]# id -u root
[19:02:23 root@nginx-18 ~]# ls -a
[19:02:26 root@nginx-18 ~]# ls --all
[19:02:30 root@nginx-18 ~]# free -h
[19:02:35 root@nginx-18 ~]# free --human
[19:02:40 root@nginx-18 ~]# ps a
PS:
1、多个选项以及多参数和命令之间使用空白字符分割
2、取消和结束命令执行:ctrl+c,ctrl+d
3、多个命令可以使用";"符号分开
4、一个命令可以用\分成多行
1.7 常见命令和变量
1.7.1 查看硬件信息
1.7.1.1 查看CPU
lscpu命令可以查看cpu信息
cat /proc/cpuinfo也可以查看
[19:02:42 root@nginx-18 ~]# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 2
On-line CPU(s) list: 0,1
Thread(s) per core: 1
Core(s) per socket: 1
座: 2
NUMA 节点: 1
厂商 ID: GenuineIntel
CPU 系列: 6
型号: 60
型号名称: Intel(R) Core(TM) i5-4460 CPU @ 3.20GHz
步进: 3
CPU MHz: 3192.045
BogoMIPS: 6385.32
超管理器厂商: VMware
虚拟化类型: 完全
L1d 缓存: 32K
L1i 缓存: 32K
L2 缓存: 256K
L3 缓存: 6144K
NUMA 节点0 CPU: 0,1
Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm epb fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid xsaveopt dtherm ida arat pln pts
[19:06:30 root@nginx-18 ~]# cat /proc/cpuinfo
1.7.1.2 查看内存
free 可以显示当前系统未使用的和已使用的内存数目,还可以显示被内核使用的内存缓冲区
主要选项:
-m 已MB为单位显示
-h 已人类可读的方式显示
[root@web01 ~]# free -m
total used free shared buffers cached
Mem: 981 476 505 0 62 298
-/+ buffers/cache: 114 866 (工作看内存大小,主要看这里)
Swap: 1023 0 1023
提示: 1)linux系统的特性是将系统不用的物理内存做为缓存或缓冲使用,因此,505不是系统真实的内存
2)系统真正系统可用内存是866M
3)buffers为写入缓冲区,sync将缓冲区数据写入磁盘
4)cache为读取数据的缓存区
5)硬盘是机械的,无论是写入还是读取都太慢了,所以读取和写入都是用了缓存技术
6)门户网站架构都会用缓存技术,来让用户写入读取尽可能不接触硬盘
1.7.1.3 查看硬盘情况
df 列出linux下所有的磁盘容量
主要选项:
-h 已人类可读的方式(MB,GB,KB)显示出来
-i 列出inode剩余的总量和使用量
-T 查看当前挂载的文件系统
-l 仅显示本地文件的相关信息
[19:06:34 root@nginx-18 ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda3 17G 1.5G 16G 9% /
devtmpfs 903M 0 903M 0% /dev
tmpfs 912M 0 912M 0% /dev/shm
tmpfs 912M 8.6M 904M 1% /run
tmpfs 912M 0 912M 0% /sys/fs/cgroup
/dev/sda1 1014M 135M 880M 14% /boot
tmpfs 183M 0 183M 0% /run/user/0
1.7.2 查看系统版本信息
1.7.2.1 查看内核版本
uname 查看系统
主要选项:
-m 查看系统是几位操作系统
-r 查看系统的内核版本
-a 查看详细的系统内核版本和系统的操作系统
[19:10:56 root@nginx-18 ~]# uname -a
Linux nginx-18 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
1.7.2.2 查看操作系统版本
#centos7查看发行版本
[20:35:23 root@nginx-18 ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
#Ubuntu18.04查看发行版本
root@Ununtu-08:~# cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.3 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.3 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
1.7.3 日期和时间
Linux的两种时钟
系统时钟:由Linux内核通过CPU的工作频率进行的
硬件时钟:主板
相关命令:
date 设置和显示时间
主要选项:
-s 修改并设置时间
-d 可以显示以前和未来的时间
%H 小时
%M 分钟
%S 秒
%X 相当于%H %M %S
%F 显示当前所有时间属性
%Y 完整年份
%m 月
%d 日
%A 星期的全称
date +%F
date -s “2017-03-09 18:56:00”
echo `date +%F` 工作中会用到的
echo $(date +%F) 工作中会用到的
date +%F -d “-2day” 2天以前的时间
tar zcf etc.tar$(date +%F).gz /etc
hwclock 显示硬件时钟
主要选项:
-s 让系统时间同步硬件时间
-w 让硬件时间同步系统时间
root@Ununtu-08:~# hwclock
2022-04-30 22:05:46.369269+0800
// =============》date设置的是系统时间,实际上时间分为硬件时钟与系统时钟两种
#1、硬件时钟:硬件时钟是指主机板上的时钟设备,也就是通常可在BIOS画面设定的时钟,硬件时间存放于CMOS中。
#2、系统时钟:系统时钟则是指kernel中的时钟,当Linux启动时
ps:硬件时间默认比系统时间慢8个小时
// =============》硬件时钟与系统时钟的关系是:
Linux操作系统将时间从CMOS中读到系统时间变量中,之后系统时钟即独立运作。所有Linux相关指令与函数都是读取系统时钟的设定。
linux系统设置硬件时钟时,提供两种时区选择,一种为本地时区,此时硬件时间与系统时间相同;另一种为UTC时区,此时硬件时间存的是UTC时间,系统初始化时会转换为本地时间后再设置为系统时钟的时间。
以后修改时间通过修改系统时间实现。为了保持系统时间与CMOS时间的一致性,Linux每隔一段时间会将系统时间写入CMOS。由于该同步是每隔一段时间(大约是11分钟)进行的,在我们执行date -s后,如果马上重起机器,修改时间就有可能没有被写入CMOS,这就是问题的原因。
如果要确保修改生效可以执行如下命令。
#hwclock –w
这个命令强制把系统时间写入CMOS。
// =============》hwclock命令
hwclock命令,与clock命令是同一个命令,主要用来查询和设置硬件时钟(query and set the hardware clock (RTC))。RTC=Real Time Clock,也就是硬件时钟。在Linux中有硬件时钟与系统时钟等两种时钟。硬件时钟是指主机板上的时钟设备,也就是通常可在BIOS画面设定的时钟。系统时钟则是指kernel中的时钟。所有Linux相关指令与函数都是读取系统时钟的设定。因为存在两种不同的时钟,那么它们之间就会存在差异。根据不同参数设置,hwclock命令既可以将硬件时钟同步到系统时钟,也可以将系统时钟同步到硬件时钟。
1.7.4 设置/查看时区
#查看时区
root@Ununtu-08:~# timedatectl status
Local time: Sat 2022-04-30 22:06:51 HKT
Universal time: Sat 2022-04-30 14:06:51 UTC
RTC time: Sat 2022-04-30 14:06:51
Time zone: Asia/Hong_Kong (HKT, +0800)
System clock synchronized: yes
systemd-timesyncd.service active: yes
RTC in local TZ: no
#设置时区
root@Ununtu-08:~# timedatectl set-timezone Asia/Shanghai
root@Ununtu-08:~# timedatectl status
Local time: Sat 2022-04-30 22:07:49 CST
Universal time: Sat 2022-04-30 14:07:49 UTC
RTC time: Sat 2022-04-30 14:07:49
Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes
systemd-timesyncd.service active: yes
RTC in local TZ: no
#查看时区的另外一个方法
root@Ununtu-08:~# cat /etc/timezone
Asia/Shanghai
1.7.5 关机和重启
关机:
halt
poweroff
以上两个都是关机命令
重启:
reboot
-f:强制关机
-p:切断电源
关机或重启:
shutdown 关机或重启
主要选项:
-h 关机
-r 重启
-c 终止关机或重启的动作
now:立刻关机或重启
shutdown -h now
shutdown -r now
1.7.6 用户登录信息查看命令
whoami:显示当前登录用户
root@Ununtu-08:~# whoami
root
who:系统当前所有的登录会话
root@Ununtu-08:~# who
root pts/0 2022-04-30 21:12 (10.0.0.1)
w:系统当前所有的登录会话及所做的操作
root@Ununtu-08:~# w
22:22:46 up 1:15, 1 user, load average: 0.00, 0.00, 0.00
#第一行从左至右显示的信息依次为:时间、系统运行时间、登陆用户数、平均负载:平均负载里面的数字表示,1分钟内,5分钟内,15分钟内,当数值超过当前系统内核数量的时候,表示系统已经有了压力
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 10.0.0.1 21:12 1.00s 0.05s 0.00s w
1.7.7 输出信息echo
1.7.7.1 echo基本用法
echo 打印文件内容或编辑文件内容
主要选项:
-n 不换行输出
-e 可以使用转义字符(\n回车,\t tab键)
主要案例:
echo “I am studying linux”>>xujun.txt 追加文件尾部内容
echo $? 假如返回值为0的时候,表示上一次命令成功。假如是1到255的话,则是失败
echo -e “wo\tshi\tshei”> xujun.txt
1.7.7.2 echo高级用法
使用高级用法时必须加上\033[或\e[,确认不使用特殊属性后及时清除设置的属性,切记!切记!切记!
#属性
\033[0m 关闭所有属性
\033[1m 设置高亮度
\033[4m 下划线
\033[5m 闪烁
\033[7m 反显
\033[8m 消隐
\033[nA 光标上移n行
\033[nB 光标下移n行
\033[nC 光标右移n行
\033[nD 光标左移n行
\033[y;xH 设置光标位置,y表示行数,x表示从第几个字符开始
\033[2J 清屏
\033[K 清除从光标到行尾的内容
\033[s 保存光标位置
\033[u 恢复光标位置
\033[?25l 隐藏光标
\033[?25h 显示光标
#颜色
##字体颜色
\033[30m (黑色)
\033[31m (红色)
\033[32m (绿色)
\033[33m (黄色)
\033[34m (蓝色)
\033[35m (紫红色)
\033[36m (青色)
\033[37m (白色)
##背景颜色
\033[40m (黑色)
\033[41m (红色)
\033[42m (绿色)
\033[43m (黄色)
\033[44m (蓝色)
\033[45m (紫红色)
\033[46m (青色)
\033[47m (白色)
#列子1:
为test添加下划线,\033[0m表示取消下划线,如果不使用\033[0m取消特殊属性,该终端输出的所有信息都会带下划线。
#列子2:
设置test字体颜色为红色、背景颜色为青色。
1.7.8 查看当前字符集
[20:35:33 root@nginx-18 ~]# echo $LANG
zh_CN.UTF-8
1.8 括号扩展
{}可以实现打印重复字符串的简化形式
[21:53:46 root@nginx-18 ~]# echo file{1,3,5}
file1 file3 file5
[21:58:29 root@nginx-18 ~]# echo {1..10}
1 2 3 4 5 6 7 8 9 10
[21:58:39 root@nginx-18 ~]# echo {1..10..2}
1 3 5 7 9
[21:58:41 root@nginx-18 ~]# echo {000..20..2}
000 002 004 006 008 010 012 014 016 018 020
[21:58:49 root@nginx-18 ~]# echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z
[21:59:14 root@nginx-18 ~]# echo {A..Z}
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
1.9 tab键补全
tab键可以实现命令及路径等补全,提高输入效率,避免出错,命令的子命令补全,需要安装bash-complection
注意:用户给定的字符串只要一条唯一对应的命令或者路径,直接补全,否则,再次Tab会给出列表。
1.10 命令行历史
当执行命令后,系统默认会在内存记录执行过的命令。
当用户正常退出时,会将内存的命令历史存放对应历史文件中,默认是:~/.bash_history
登录shell时,会读取命令历史文件中记录下的命令加载到内存中
登录进shell后新执行的命令只会记录在内存的缓存区中。这些命令会在用户正常退出时”追加”至命令历史文件中
利用命令历史。可以用它来重复执行命令,提高输入效率
history:查看命令历史记录
登陆shell时,会读取命令历史文件中记录下的命令(~.bash_history)
登陆进shell后新执行的命令只会记录在缓存中,这些命令会用户退出时追加至~.bash_history
#调用命令行历史
!#:再一次执行历史列表中的第#条命令
!!:再一次执行上一条命令
!STRING:再一次执行已STRING开头的命令
#命令历史相关环境变量
HISTSIZE:shell进程可保留的命令历史条数
HISTFILE:保存命令历史文件所在的路径
HISTFILESIZE:命令历史文件的大小
控制命令历史记录的方式:HISTCONTROL=ignoredups(忽略重复的命令),ignorespace(忽略已空格开头的命令),ignoreboth(以上两者同时生效)
主要选项:
-a 追加本次会话新执行的命令历史列表至历史文件中
-c 清空所有
-d 删除指定历史内容
-r 从文件读取命令历史至历史列表中
-w 把历史列表中的命令追加至历史文件中
主要案例:
如何调用历史记录,使用!后面接命令的字符 比如:!Touch
history -c
History -d 5 删除指定历史内容
1.11 bash的快捷键
编辑命令
Ctrl + a :光标移到命令行首
Ctrl + e :光标移到命令行尾
Ctrl + f :按字符前移(右向)
Ctrl + b :按字符后移(左向)
Alt + f :按单词前移(右向)
Alt + b :按单词后移(左向)
Ctrl + xx:在命令行首和光标之间移动
Ctrl + u :从光标处删除至命令行首
Ctrl + k :从光标处删除至命令行尾
Ctrl + w :从光标处删除至字首
Alt + d :从光标处删除至字尾
Ctrl + d :删除光标处的字符
Ctrl + h :删除光标前的字符
Ctrl + y :粘贴至光标后
Alt + c :从光标处更改为首字母大写的单词
Alt + u :从光标处更改为全部大写的单词
Alt + l :从光标处更改为全部小写的单词
Ctrl + t :交换光标处和之前的字符
Alt + t :交换光标处和之前的单词
Alt + Backspace:与 Ctrl + w 相同类似,分隔符有些差别
重新执行命令
Ctrl + r:逆向搜索命令历史
Ctrl + g:从历史搜索模式退出
Ctrl + p:历史中的上一条命令
Ctrl + n:历史中的下一条命令
Alt + .:使用上一条命令的最后一个参数
控制命令
Ctrl + l:清屏,相当于clear命令
Ctrl + o:执行当前命令,并选择上一条命令
Ctrl + s:阻止屏幕输出
Ctrl + q:允许屏幕输出
Ctrl + c:终止命令
Ctrl + z:挂起命令
Bang (!) 命令
!!:执行上一条命令
!blah:执行最近的以 blah 开头的命令,如 !ls
!blah:p:仅打印输出,而不执行
!$:上一条命令的最后一个参数,与 Alt + . 相同
!$:p:打印输出 !$ 的内容
!*:上一条命令的所有参数
!*:p:打印输出 !* 的内容
^blah:删除上一条命令中的 blah
^blah^foo:将上一条命令中的 blah 替换为 foo
^blah^foo^:将上一条命令中所有的 blah 都替换为 foo
注意:Alt组合快捷键经常和其他软件冲突
在xshell中启动alt键
1.12 获得帮助
help 内置命令
命令 --help
man 命令
info 命令
搜索引擎