第二章 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/bashrcPS1="[\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 cdcd 是 shell 内嵌[18:38:01 root@nginx-18 ~]# type findfind 是 /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 aPS:1、多个选项以及多参数和命令之间使用空白字符分割2、取消和结束命令执行:ctrl+c,ctrl+d3、多个命令可以使用";"符号分开4、一个命令可以用\分成多行
1.7 常见命令和变量
1.7.1 查看硬件信息
1.7.1.1 查看CPU
lscpu命令可以查看cpu信息
cat /proc/cpuinfo也可以查看
[19:02:42 root@nginx-18 ~]# lscpuArchitecture: x86_64CPU op-mode(s): 32-bit, 64-bitByte Order: Little EndianCPU(s): 2On-line CPU(s) list: 0,1Thread(s) per core: 1Core(s) per socket: 1座: 2NUMA 节点: 1厂商 ID: GenuineIntelCPU 系列: 6型号: 60型号名称: Intel(R) Core(TM) i5-4460 CPU @ 3.20GHz步进: 3CPU MHz: 3192.045BogoMIPS: 6385.32超管理器厂商: VMware虚拟化类型: 完全L1d 缓存: 32KL1i 缓存: 32KL2 缓存: 256KL3 缓存: 6144KNUMA 节点0 CPU: 0,1Flags: 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 -mtotal used free shared buffers cachedMem: 981 476 505 0 62 298-/+ buffers/cache: 114 866 (工作看内存大小,主要看这里)Swap: 1023 0 1023提示: 1)linux系统的特性是将系统不用的物理内存做为缓存或缓冲使用,因此,505不是系统真实的内存2)系统真正系统可用内存是866M3)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% /devtmpfs 912M 0 912M 0% /dev/shmtmpfs 912M 8.6M 904M 1% /runtmpfs 912M 0 912M 0% /sys/fs/cgroup/dev/sda1 1014M 135M 880M 14% /boottmpfs 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 -aLinux 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-releaseCentOS Linux release 7.4.1708 (Core)#Ubuntu18.04查看发行版本root@Ununtu-08:~# cat /etc/os-releaseNAME="Ubuntu"VERSION="18.04.3 LTS (Bionic Beaver)"ID=ubuntuID_LIKE=debianPRETTY_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=bionicUBUNTU_CODENAME=bionic
1.7.3 日期和时间
Linux的两种时钟
系统时钟:由Linux内核通过CPU的工作频率进行的
硬件时钟:主板
相关命令:
date 设置和显示时间主要选项:-s 修改并设置时间-d 可以显示以前和未来的时间%H 小时%M 分钟%S 秒%X 相当于%H %M %S%F 显示当前所有时间属性%Y 完整年份%m 月%d 日%A 星期的全称date +%Fdate -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:~# hwclock2022-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 statusLocal time: Sat 2022-04-30 22:06:51 HKTUniversal time: Sat 2022-04-30 14:06:51 UTCRTC time: Sat 2022-04-30 14:06:51Time zone: Asia/Hong_Kong (HKT, +0800)System clock synchronized: yessystemd-timesyncd.service active: yesRTC in local TZ: no#设置时区root@Ununtu-08:~# timedatectl set-timezone Asia/Shanghairoot@Ununtu-08:~# timedatectl statusLocal time: Sat 2022-04-30 22:07:49 CSTUniversal time: Sat 2022-04-30 14:07:49 UTCRTC time: Sat 2022-04-30 14:07:49Time zone: Asia/Shanghai (CST, +0800)System clock synchronized: yessystemd-timesyncd.service active: yesRTC in local TZ: no#查看时区的另外一个方法root@Ununtu-08:~# cat /etc/timezoneAsia/Shanghai
1.7.5 关机和重启
关机:
haltpoweroff以上两个都是关机命令
重启:
reboot-f:强制关机-p:切断电源
关机或重启:
shutdown 关机或重启主要选项:-h 关机-r 重启-c 终止关机或重启的动作now:立刻关机或重启shutdown -h nowshutdown -r now
1.7.6 用户登录信息查看命令
whoami:显示当前登录用户root@Ununtu-08:~# whoamirootwho:系统当前所有的登录会话root@Ununtu-08:~# whoroot pts/0 2022-04-30 21:12 (10.0.0.1)w:系统当前所有的登录会话及所做的操作root@Ununtu-08:~# w22: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 WHATroot 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 $LANGzh_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 把历史列表中的命令追加至历史文件中主要案例:如何调用历史记录,使用!后面接命令的字符 比如:!Touchhistory -cHistory -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 内置命令命令 --helpman 命令info 命令搜索引擎
