引入
1.什么是系统命令
- Shell解释器对系统接口的封装
命令控制的方法流程示例: 应用程序-->系统命令/shell命令--->Shell解释器--->系统接口--->内核--->硬件 系统命令/Shell命令--->Shell解释器--->系统接口--->内核--->硬件 应用程序--->系统命令/Shell命令--->系统接口--->内核--->硬件
2.为何要用系统命令
- 为了使用计算机
一.Bash Shell 是什么 ?
Xshell 是什么?
它是一个远程执行命令的客户端程序, 对应的服务端程序 openssh-server (默认22端口)
套接字客户端----------------网络----------------套接字服务端 Xshell openssh-server
远程管理工具 ⛅Mac: iTerm2 打开命令行终端 ssh root@服务器的IP地址 ⛅Windows: Xshell 缓冲区设置: 控制内容显示的行数 上下翻页: shift + Pg Up shift + Pg Dn
Shell是什么?
shell中文意思是贝壳,寓意类似内核的核。shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务,简而言之就是只要能够操作应用程序的接口度能够称为shell。狭义的shell指的是命令行方面的软件,广义的shell则包括图形界面。
shell有两层意思,分别为:
第一层意思: shell代表的是解释器, 是对系统接口的封装, 即在系统接口外加了一层壳
- shell只是一种称呼, 而Bash解释器才是具体的一种Shell
第二层意思: Shell这门编程语言, (一堆命令及用法)
- 用Shell程序写出来的程序一般叫做脚本程序
posix (了解)
全称 : “可移植性的操作系统接口”
Linux系统支持 “posix”, 它是一种规范
Windows系统部分支持 “posix”
作用: 在于提高应用程序在各种Unix操作系统环境之间的可以移植性
Bash
Bash(GNU Bourne-Again Shell) 是许多Linux发行版的默认Shell.
- shell是一个命令语言解释器, 在操作系统的最外层, 是用户(用户程序)与操作系统(Linux)内核的接口程序, 用户输入的每个命令都由shell先翻译再传给Linux内核, 并将处理后的结果输出至屏幕
- 当我们使用远程链接工具连接Linux服务时, 系统会打开一个默认的shell, 我们可以在这个界面执行命令. 比如:获取当前时间, 创建一个用户, 对文件的增删改查等等.
二.Bash Shell 能做什么?
- 使用Shell可以实现Linux系统的大部分管理
1.文件管理: 创建, 移动, 赋值, 删除, 编辑... 2.权限管理: 不同用户的不同权限管理. 3.用户管理: 创建以及删除用户. 4.磁盘管理: 磁盘挂载. 5.网络管理: IP的配置. 6.软件管理: 下载及运行等等.
三.Shell提示符交互式环境
用户登录成功后进入解释器bash交互式环境,可以输入命令
[root@shawn /]# "#" = root用户(管理员), "$" = 普通用户 root===》当前登录的用户 @======》分隔符 xxx====》主机名 ~ =====》当前所在路径 //非交互式设置密码 echo '1' |passwd --stdin egon[root@shawn /]# whoami //查看当前用户root[root@shawn /]# useradd yanxi //创建一个用户[root@shawn /]# passwd yanxi //设置yanxi的密码Changing password for user yanxi. New password: #//设置密码BAD PASSWORD: it is WAY too short BAD PASSWORD: is too simple Retype new password: #//确认密码passwd: all authentication tokens updated successfully.[root@shawn /]# su yanxi //切换到用户yanxi(超级用户切换普通用户不需要密码)[yanxi@shawn /]$ #//符号已变成普通用户符号[yanxi@shawn /]$ su #//(普通用户切换到root用户需要密码)Password: [root@shawn /]# //符号已变成root用户符号
ps: 交互式与非交互式创建用户
⛅交互式 # useradd Shawn # passwd Shawn 然后输入密码, 确认密码 ⛅非交互式 # echo "123" | passwd Shawn --stdin(标准输出管道) 将打印的"123"这个结果放入管道"|"中,给"passwd"这个命令使用,一步到位
四、shell基础语法
comment命令 | [-options]选项 | [arguments]参数
命令: 就是一个单词, 对应着一个功能/程序, 运行一条命令就启动了一个进程
选项: 对命令的描述,用于调节命令的输出效果,控制命令的具体运行
参数: 命令操作的对象,如文件、目录名等
注意: 选项和参数可以出现位置调换,命令,选项,参数之间要至少有一个空格.而命令必须开头, 选项和参数位置可以发生变化
- 以 “-”引导短格式选项(单个字符),例如“-l”
- 以“–”引导长格式选项(多个字符),例如“–color”
- 多个短格式选项可以写在一起,只用一个“-”引导,例如“-al”
# 命令 选项 参数# comment [-options] [arguments][root@shawn /]# ls #命令 //显示当前目录下的所有文件以及文件夹[root@shawn /]# ls -l #命令+选项 //以列表的形式显示当前目录下的所有文件以及子文件夹[root@shawn /]# ls -l /home #命令+选项+参数 //以列表的形式显示当前目录下的"home"目录的所有文件以及子文件夹 // ls -a -l (多个短格式) // ls -al (多个短格式写在一起) // ls --all (长格式) // --color
PS:
- Linux对大小写敏感,大多数命令都是小写。
- 命令选项和参数之间必须要用空格分隔,有多个空格Bash视为一个。
- 使用选项时,通常会在前面加上横杠 - ,如果使用的是长选项则需要加上两个横杠 --,例如ls -a 和 --all,其实它俩指的是一个意思。多个短选项可以组合起来,只写一个横杠 -
- 命令输入完成后,按下Enter就立即执行。
五.Tab命令补全
- 在敲命令行时, 有些命令太长不好记, Tab键可以实现命令补全, 路径补全
- 在输入命令的时候使用Tab键,Bash会自动寻找以已键入字符开头的命令。如果有多个相同开头的命令,连按两下Tab键会显示出所有的命令。
- 对于某些特别长的路径,我们在输入的过程中也可以使用Tab键,Bash会寻找当前路径所有以已输入字符开头的文件补全。
- 作用:在实际的工作中Tab键非常用有作用, 因为可以提高执行效率, 减少出错率
#当你忘记了一条命令的具体单词, 双击Tab键可查看你输入单词开头的所有命令[root@shawn ~]# ifif ifcfg ifconfig ifdown ifenslave ifstat ifup [root@shanw ~]# ifcifcfg ifconfig [root@shawn ~]# ifco#这一步按Tab键直接补全了 ifconfig 命令[root@shawn ~]# ifconfig
六、修改主机名
#通过修改文件来永久修改主机名[root@localhost ~]# vi /etc/hostname #通过命令的方式也是永久修改(例外)[root@localhost ~]# hostnamectl set-hostname [想要的主机名][root@localhost ~]# exit登出#重新登入即可
七.Shell的两种使用
1.命令:
- 效率低, 适合少量的工作.
2.脚本(Shell Script):
- 效率高, 适合重复的大量的工作.
例如:创建100个用户, 如果使用命令就需要执行一百次 useradd, 而脚本值需要几行就可以实现.[root@Shawn ~]# vim shell_script.sh //创建一个脚本文件按 i //编辑模式for i in {1..100}douseradd user $iecho "create user$i"done按Esc //退出编辑模式进入命令模式 :wq[root@Shawn ~]# bash shell_script.sh //执行
八.shell命令行–快捷键
使用shell快捷键能极大的提高工作效率
1.编辑常用命令
Ctrl + a: /移动到命令行首 Ctrl + e: /移动到命令行尾 Ctrl + f: /按照字符一个一个往右移 Ctrl + b: /按照字符一个一个往左移 Alt + f ://按单词往右边移动 Alt + b ://按单词往左边移动 Ctrl + 方向键: /按单词或空格左右跳 Ctrl + u ://从光标处删除至命令行首 Ctrl + k ://从光标处删除至命令行尾 Ctrl + h ://删除光标前的字符 Ctrl + d ://有命令字符的情况下删除光标后的字符, 没有字符是登出
2.历史执行命令
Ctrl + p://历史中的上一条命令 Ctrl + n://历史中的下一条命令 Ctrl + r://逆向搜索命令历史 Ctrl + g://从历史搜索模式退出 Alt + .://使用上一条命令的最后一个参数
3.控制命令
Ctrl + l://清屏(等同于clear命令)Ctrl + o://执行当前命令,并选择上一条命令 Ctrl + s://阻止屏幕输出 Ctrl + q://允许屏幕输出 Ctrl + c://终止前台运行的程序 Ctrl + z://将任务暂停,挂到后台 Ctrl + d ://登出, 如果命令行有字符则是删除光标后的字符
4. “!” 命令
!!://执行上一条命令!vim://执行历史命令中最近的以 vim 开头的命令,如 !ls,!cat...!$://上一条命令的最后一个参数,[与 Alt + . 相同(在Xshell中用不了)]!$:p://打印输出 !$ 的内容!blah:p://仅打印输出,而不执行!*://上一条命令的所有参数!*:p://打印输出 !* 的内容 ^blah://删除上一条命令中的 blah ^blah^foo://将上一条命令中的 blah 替换为 foo ^blah^foo^://将上一条命令中所有的 blah 都替换为 foo
5.历史命令 “history”
Bash会记录用户输入的所有命令,可以通过history命令。history是记录在内存中的,当用户退出或登出shell时,会自动保存到~/.bash_history文件中。
登录时,又会从文件中读取到内存。在内存中,历史命令默认能够存储1000条命令,数量是由环境变量HISTSIZE进行控制,HISTSIZE变量存在于/etc/profile中。
history //查看历史命令 history -d N //删除第N条历史命令 history -w //保存历史命令到文件,保存到当前用户的家目录(.bash_history) history -c //清空记录, 不会清空文件里的 //如果想要清空所有你敲的命令就要到(.bash_history)文件里面去删除 vi ~/.bash_history
6.命令别名 “alias”
- 将复杂的难记的命令简单化
- “alias 别名=命令”
- “” : 取消特殊意义, 取消了别名的意义: \ls,
- 取消别名 : “unalias 别名”
[root@shawn ~]# which [命令] #查看命令的完整路径 [root@shawn ~]# alias hh='cd /home/shawn' [root@shawn ~]# hh [root@shawn shawn]# pwd /home/shawn [root@shawn shawn]# unalias hh #取消别名 [root@shawn shawn]# hh -bash: hh: 未找到命令 #以上这些都是临时设置 #要想永久设置: 将 "alias 别名='想要别名的命令'" 写入 "~/.bashrc" 例子: "alias cat-ens32='cat /etc/sysconfig/network-scripts/ifcfg-ens32'"
- 取消别名运行的方式
which ls //先查看命令的完整路径, 在使用完整路径来运行 \ls //反斜杠可以取消特殊意义, 取消ls的别名意义unalias //直接取消别名
7.查看帮助信息
man手册
# man [命令]# man ls #查看ls命令的手册一.按章节来查找 常用的是 1 (命令用法), 5 (文本规范), 8 (系统管理命令)/usr/bin/passwd #命令, 修改用户密码 ----man 1 [命令]/etc/passwd #保存用户信息文件 ----man 5 [命令]/etc/exports #man exports ----man 5 exports
二.按关键字来检索 (适合记不住手册全名)man -k "_selinux" //手册名或手册描述中包含关键字_selinux 这会从whatish数据库中去查找
三.在所有章节中查询 # man -a passwd # man -f passwd
–help
用法: [命令] --help[root@shawn ~]# ls --help????"ls"用法: ls [选项]...[文件]... ????"ls"常见选项: -a all, 查看目录下的所有文件, 包括隐藏文件 -l 长列表显示 -h human 一人性化的方式显示出来 -d 只列出目录名, 不列出其他内容 -t 按修改时间排序 -r 逆序排列 -i 显示文件的inode号 (索引号)
- 参考文档/配置模块文件
- 官方手册
- baidu 以及 google
九、Bash Shell 命令执行流程
1.什么是内部命令以及外部命令
- 内部命令 : shell 程序自带的命令
- 外部命令 : 在系统PATH环境变量中某个路径下的可执行程序
2.判断是内部命令还是外部命令
//cd 为shell内部命令[root@shawn ~]# type -a cdcd id=s a shell builtin //shell 内建cd is /bin/cdcd is /bin/usr/cd //ping 为外部命令, 同时打印出当前命令路径[root@shawn ~]# type -a pingping is /bin/pingping is /bin/usr/ping //hh 为 cd 的别名[root@shawn ~]# alias hh='cd'[root@shawn ~]# type -a hhhh is aliased to 'cd' //hh 是 cd 的别名
3.如果是外置命令, Bash可以通过查找PATH变量来获取该命令的绝对路径
#打印当前环境变量目录[root@shawn ~]# echo $PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
4.命令缓存: hash表
- linux系统下会有一个hash表,当你刚开机时这个hash表为空,每当你执行过一条命令时,hash表会记录下这条命令的路径,就相当于缓存一样
- 第一次执行命令shell解释器默认的会从PATH路径下寻找该命令的路径,当你第二次使用该命令时,shell解释器首先会查看hash表,没有该命令才会去PATH路径下寻找。
- 作用: 大大提高命令的调用速率
1.只要执行外部命令1次就会对该命令进行缓存 2.如果将命令移动了位置,该如何执行 a.使用绝对路径执行 b.删除hash表的缓存指令 //查找缓存命令所在的路径[root@shawn ~]# hashhits command 1 /sbin/ifconfig 2 /bin/systemctl 7 /bin/ping //移动已缓存的命令, 会造成命令无法执行[root@shawn ~]# ping baidu.com-bash: /bin/ping: No such file or directory //清除hash表里其中一条[root@shawn ~]# hash -d ping //清除hash表里全部缓存[root@shawn ~]# hash -r[root@shawn ~]# hashhash: hash table empty #显示为空
5.命令查找优先级
- 首先判断命令是否通过绝对路径
- 判断命令是否有 alias 别名
- 判断是否是复合命令(Compound Commands)
- 判断是否是函数(function)
- 判断用户输入的是内部命令还是外部命令
- 如果是Bash内部命令直接执行, 外部命令则检测是否存在hash缓存
- 最后到PATH路径查找命令, 有就执行, 没有报错: command not found
复合命令:例:# for((i=0;i<=3;i++))do echo 1213;done函数:例:# function func(){ echo 123; }????{}左右两边有空格 ????查看命令所在的位置:# which [命令]
十、CentOS 7 设置默认启动级别
Linux的运行等级设定如下:
0:关机
1:单用户模式,不需要输入账号密码登录进操作系统后就是管理员账号
2:无网络支持的多用户模式
3:有网络支持的多用户模式,命令行界面
4:保留,未使用
5:有网络支持有X-Window支持的多用户模式
6:重新引导系统,即重启临时修改运行级别init命令
[chirou@duorou ~]$ init 3 # 修改为命令行界面
在CentOS 6中设置默认启动级别是修改/etc/inittab文件,在CentOS 7中打开此文件发现与CentOS 6不同
按照该文件所说的,runlevels被targets所取代,即CentOS7采用加载target的方式来替代之前的启动级别。其中有两个重要的target:multi-user.target(表示运行级别中的3)与graphical.target(表示运行级别中的3与5级别)。
那么,查看当前运行级别的命令
systemctl get-default
修改默认启动级别为命令行界面
systemctl set-default multi-user.target # 设置启动级别为3
修改默认启动级别为图形界面
systemctl set-default graphical.target
重启即生效。
九.设置时间命令
设置时间的方法有三种
1.Linux的系统时间
- 这里说的系统时间说的是Linux操作系统维护的时间
????查看时间 # date ????以自己想要的格式查看时间 # date "+%Y__%m__%d %H::%M::%S" ????自己设置系统时间 # date -s "2050-12-25 12:25:41"
注意,Linux有两个时间,一个是系统时间,是由Linux系统启动后维护的。另一个是硬件时间,硬件时间是指主板上的时钟设备,在BIOS设定的时钟。硬件时间存放于CMOS中。当Linux启动时,Linux系统将时间从CMOS中读到系统时间变量中,之后系统时钟即独立运作。所有Linux相关指令与函数都是读取系统时钟的设定。
Linux系统设置硬件时钟时,提供两种时区选择,一种为本地时区,中国使用的是东8区,此时硬件时间与系统时间相同。另一种是UTC时区,就是世界标准时间,此时硬件时间存的是UTC时间,系统初始化时会转换为本地时间后再设置为系统时钟的时间。
为了保证系统时间与CMOS时间的一致性,Linux每隔一段时间会将系统时间写入CMOS。由于该同步是每隔一段时间(大约11分钟)进行的,在我们执行date -s 后,如果马上重启机器,修改时间就有可能没有被写入CMOS。
将系统时间写入CMOS
[root@duorou ~]# date -s '2020-2-2 2:2:2'2020年 02月 02日 星期日 02:02:02 CST[root@duorou ~]# hwclock2020年10月20日 星期二 19时54分56秒 -0.416221 秒[root@duorou ~]# hwclock -w2020年02月02日 星期日 02时02分31秒 -0.056272 秒
将硬件时间同步给系统时间
[root@duorou ~]# date2222年 01月 03日 星期四 22:50:35 CST[root@duorou ~]# hwclock2020年10月20日 星期二 19时50分19秒 -0.964076 秒[root@duorou ~]# hwclock -s[root@duorou ~]# date2020年 10月 20日 星期二 19:50:35 CST
2.硬件时间
- 硬件时钟是指主机板上的时钟设备,也就是通常可在BIOS画面设定的时钟,硬件时间存放于CMOS中
????查看硬件时间 # hwclock ????强制把系统时间写入硬件(cmos)中 # hwclock -w ????"-s" 相反, 将硬件时间写入系统时间 # hwclock -s
3.NTP时间协调服务器
- 为了使系统时间准确,最好还是使用ntp方式。Centos7用chrony替换ntp。
- NTP(Network Time Protocol) 网络时间协议
- 使用ntpdate命令是使用NTP协议从网络同步时间,再写入同步到硬件时钟。
????同步网络时间# ntpdate ntp1.aliyun.com????查看时间是否更新了# date????然后将其写入硬件时间把我们之前乱写的时间改回来# hwclock -w????阿里云提供的 7 个NTP时间服务器(Internet时间同步服务器地址)ntp1. aliyun. com ntp2. aliyun. com ntp3. aliyun. com ntp4. aliyun. com ntp5. aliyun. com ntp6. aliyun. com ntp7. aliyun. com
4.系统时间与硬件时间的关系
????这里说的是系统时间,是linux由操作系统维护的 ????硬件时钟是指主机板上的时钟设备,也就是通常可在BIOS画面设定的时钟,硬件时间存放于CMOS中 ????系统时钟则是指内核(kernel)中的时钟,当Linux启动时,Linux操作 系统将时间从CMOS中读到系统时间变量中 ????之后系统时钟即独立运作, 所有Linux相关指令与函数都是读取系统时钟的设定
????linux系统设置硬件时钟时,提供两种时区选择,一种为本地时区, 此时硬件时间与系统时间相同 ????另一种为UTC时区,此时硬件时间存的是UTC时间,系统初始化时会转换为本地时间后再设置为系统时钟的时间 ????以后修改时间通过修改系统时间实现, 为了保持系统时间与CMOS时间的一致性,Linux每隔一段时间会 将系统时间写入CMOS ????由于该同步是每隔一段时间(大约是11分钟) 进行的,在我们执行"date -s"后,如果马上重起机器,修改时间就有可能没有被写入CMOS ????如果要确保修改生效可以执行"hwclock -w" 将其写入硬盘
十一.重启, 关机, 注销
1.重启
shutdown -r 10 //10分钟后重启shutdown -r 0 //立即重启shutdown -r now //立即重启 init 6 //立即重启reboot //立即重启
2.关机
shutdown -h 10 //10分钟后关机shutdown -h 0 //立即关机shutdown -h now //立即关机 init 0 //立即关机 halt //立即关机 poweroff //立即关机.
取消正在进行的关机或者重启
shutdown -c
Linux系统一般作为服务器系统,服务器在生产环境中很少会关机。若要关机,一定要将内存中的数据写入硬盘后再关机。推荐使用shutdown命令,它在关机前会先将内存中的数据写入硬盘,然后再关机。另外只有管理员root权限才能执行关机命令。
3.注销
1.exit 2.logout 3.poweroff 4.Ctrl + d
十二.查看操作系统版本
//查看操作系统版本# cat /etc/redhat-release//内核版本# uname -r# uname -a