跳转至

初识shell与基础常用命令

Shell介绍

注意哦,提及shell,可能指的是 shell命令/shell编程语言 ,也可能指的是 shell解释器..

[层层封装]: 硬件 -- 内核 -- 系统接口 -- shell解释器 最后, shell命令调用
即shell解释器是对系统接口的封装!(在系统接口外又加了一层壳.)

shell只是一种统称,我们通常使用的是一种shell名为 bash解释器..
用shell语言写出来的程序(一堆shell命令组合在一起)通常称之为 shell脚本 ..
Ps: 常见的shell解释器 -- sh、bash、dash等

shell实现对linux的管理:
  1> 文件管理 (linux一切皆文件)
  2> 用户与权限管理
  3> 进程管理
  4> 磁盘管理
  5> 网络管理
  6> 软件管理

[POSIX] 全称 -- 可移植的操作系统接口
  Linux支持的POSIX是一种规范,保证软件的可移植性..(让开发的软件可以在unix、mac、centos..上都运行成功)
  简单可以理解POSIX标准是为操作系统设计API时遵循的规范,一套规范的系统调用集

Shell交互式环境

shell解释器的交互式环境, 用于执行一系列命令来间接管理硬件..

命令提示符

[root@xxx ~]#      
[root@xxx ~]$    

| 提示符 | 含义                                              |
| ------ | -------------------------------------------------|
| root   | 当前登录的用户                                     |
| @      | 分隔符                                            |
| xxx    | 主机名                                            |
|| 当前所在文件夹/路径 当前登录用户的个人文件夹,家目录/主目录 |
| #      | 超级管理员用户                                     |
| $      | 普通用户                                          |

Ps: unix认为命令运行完毕后没有提示便是最好的提示,即结果正确, linux继承了unix的优良传统..

添加账户/修改密码

<添加账户,设置or修改账户密码>
# -- 交互式
[root@localhost ~]# useradd dc
[root@localhost ~]# passwd dc # 交互式输入
更改用户 dc 的密码.
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的密码:
passwd:所有的身份验证令牌已经成功更新.

# -- 非交互式 
# echo 打印
# |管道    【精髓--共享内存】
  # 左边命令运行后是一个进程,运行产生的结果放到了管道中;右边的命令从管道中取出结果做后续结果
  # 进程与进程之间是相互隔离的,但|管道实现了共享内存!!!
  # 注意哦,所有的命令可以往管道里丢东西但不是所有命令可以从管道里取东西!
  # 那咋办呢?xargs可以使不支持从管道取东西的命令变得支持
# --stdin标准输入,而不是交互式的键盘输入
[root@localhost ~]# echo "123456" | passwd dc --stdin 
更改用户 dc 的密码.
passwd: 所有的身份验证令牌已经成功更新.

Shell命令的语法格式

由三部分组成
1> 命令(必选): 就是一个单词,对应着一个功能/程序. 运行一条命令就是启动了一个进程!
2> 选项(可选): 对命令的描述,控制命令如何具体的运行 通常以 - -- + 开头
3> 参数(可选): 命令的操作对象

linux是单根结构,所有的文件夹都是/的后代!

ls           # 默认是家目录
ls -l        # 用列表的格式
ls -l /boot  # 用列表形式查看/boot文件夹下的内容

bash特性

Tab命令补全

按Tab键补全, 多个的话连按两下,会提示所有... 命令文件路径 都能补全!!

快捷键

1> ctrl + l 或者 clear --- 清屏
2> ctrl + c --- 终止命令的运行
3> ctrl + d 或者 exit --- 退出登录
      ctrl + d --- 命令行输入了命令,将光标所在字符往后一个个的删除
4> ctrl + a --- 光标快速回到命令行首
5> ctrl + e --- 光标快速回到命令行尾

历史命令

history 查看历史命令
history -c echo "" > ~/.bash_history 清空历史命令
第一个会清除当前用户敲过的所有命令; 第二个会清除当前用户此次登录之前敲过的记录,即退出登录时才会记录到当前登录用户的家目录下的一个名为 .bash_history 的隐藏文件中!6 执行历史命令中第6条命令
!cat 搜索历史命令中最近一个以cat字符开头的命令
!$ 取上条命令的 最后一个 参数.

[root@172 ~]# history
    1  clear
    2  ls
    3  cat /etc/passwd
    4  clear
    5  history
    6  cat /etc/sysconfig/network-scripts/ifcfg-ens33 
    7  history
[root@172 ~]# !6
ls
anaconda-ks.cfg       公共  视频  文档  音乐
initial-setup-ks.cfg  模板  图片  下载  桌面
[root@172 ~]# !cat  # 运行的是最近的那条以cat开头的历史命令
... ... ...

[root@172 ~]# ls /boot/ /opt/
/boot/:
config-3.10.0-1160.66.1.el7.x86_64
config-3.10.0-1160.el7.x86_64
efi
grub
grub2
initramfs-0-rescue-be87405afe3b480da138503ccab0ebd2.img
initramfs-3.10.0-1160.66.1.el7.x86_64.img
initramfs-3.10.0-1160.el7.x86_64.img
symvers-3.10.0-1160.66.1.el7.x86_64.gz
symvers-3.10.0-1160.el7.x86_64.gz
System.map-3.10.0-1160.66.1.el7.x86_64
System.map-3.10.0-1160.el7.x86_64
vmlinuz-0-rescue-be87405afe3b480da138503ccab0ebd2
vmlinuz-3.10.0-1160.66.1.el7.x86_64
vmlinuz-3.10.0-1160.el7.x86_64

/opt/:
rh
[root@172 ~]# ls !$
ls /opt/
rh

别名

命令就是程序,本质就是代码文件..则肯定会有路径 比如: 查看ls命令所在文件的路径/位置 which ls
即在linux上安装好软件,就是新增了些许命令!! 
如何取消别名来运行命令
        which ls查看命令的完整路径,然后以 绝对路径/完整路径 的方式运行;
        加右斜杠\ls
        unalias dc
给某条命令设置别名 alias dc="ls /etc/sysconfig/network-scripts/ifcfg-ens33"
注意哦! 我们给命令设置的别名是临时生效的,没有写到文件里,重启后就没了.. 
(linux中通常命令的修改都是临时的, 有个别命令除外..)

# 查看ls命令文件的路径
[root@172 ~]# which ls    # ls默认设置的有别名  
alias ls='ls --color=auto'
    /usr/bin/ls
[root@172 ~]# ls                            # 有颜色(文件夹)
anaconda-ks.cfg       公共  视频  文档  音乐
initial-setup-ks.cfg  模板  图片  下载  桌面
[root@172 ~]# /usr/bin/ls --color=auto      # 有颜色
anaconda-ks.cfg       公共  视频  文档  音乐
initial-setup-ks.cfg  模板  图片  下载  桌面
[root@172 ~]# /usr/bin/ls                   # 没有颜色 取消ls命令的别名的方式一
anaconda-ks.cfg       公共  视频  文档    音乐
initial-setup-ks.cfg  模板  图片  下载    桌面
[root@172 ~]# \ls                           # 没有颜色 取消ls命令的别名的方式二
anaconda-ks.cfg       公共  视频  文档    音乐
initial-setup-ks.cfg  模板  图片  下载    桌面
[root@172 ~]# alias dc="ls /etc/sysconfig/network-scripts/ifcfg-ens33"
[root@172 ~]# ls /etc/sysconfig/network-scripts/ifcfg-ens33
/etc/sysconfig/network-scripts/ifcfg-ens33
[root@172 ~]# dc
/etc/sysconfig/network-scripts/ifcfg-ens33
[root@172 ~]# alias
alias cp='cp -i'
alias dc='ls /etc/sysconfig/network-scripts/ifcfg-ens33'
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 which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[root@172 ~]# unalias dc

命令查找优先级

path可以存放命令所在的文件夹!!
hash表命令缓存机制..

bash查找命令顺序

==>以路径(绝对路径,相对路径)开始命令 例如: /bin/ls 或 cd /bin; ./ls
  ==> alias 别名
    ==> Compound Commands 复合命令
      ==> function
        ==> build_in 内置命令
          如 cd,kill,pwd,alias,echo等 可以用"type -a 命令"查看
          ==> hash
            ==> $PATH 环境变量 查看环境变量echo $PATH
              ==> error: command not found

bash内置的命令

▲ bash解释器内嵌/内置/自带的命令
[root@172 ~]# type pwd
pwd 是 shell 内嵌
[root@172 ~]# type cd
cd 是 shell 内嵌
[root@172 ~]# type echo
echo 是 shell 内嵌
[root@172 ~]# type ifconfig      # ifconfig不是内嵌命令,是从安装的第三方软件包net-tools中来的
ifconfig 是 /usr/sbin/ifconfig
[root@172 ~]# type ls            # ls不是内嵌命令
ls 是 `ls --color=auto' 的别名
[root@172 ~]# type /usr/bin/ls
/usr/bin/ls 是 /usr/bin/ls

复合命令

▲ <复合命令>
# do ... done 看起来只有一条,实则是四条
[root@172 ~]# for((i=0;i<=3;i++))do echo 123;done
123
123
123
123

函数

▲ <函数>
# 注意{}左右两边有空格
[root@172 ~]# function f(){ echo 123; echo 456; }
[root@172 ~]# f
123
456 

path环境变量

Q: 想在任意地方,不加前缀/不以绝对路径的方式运行某条命令/新安装的软件,怎么搞?
A: 把新安装的软件所在的文件夹添加到PATH里!

▲ <path环境变量>
path环境变量的值在文件里.
# echo"打印"PATH这个环境变量的值  $符号是取PATH这个环境变量的值
# 打印结果是用":"分隔的
# 我们知道ls命令所在的文件路径是/usr/bin/ls 所以在命令行输入ls,会去PATH里面找,在/usr/bin中找到啦
# path里面包含bash内置的以及从安装的第三方包里得到的命令 即path可以存放命令所在的文件夹!!
[root@172 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

hash

▲ <hash>
能从内存取就别从硬盘取,所以linux中一张hash表.
hash表缓存的是: 我们解锁PATH从硬盘文件中读取的命令
[root@172 ~]# hash -r               # 清空hash表
[root@172 ~]# hash
hash: 哈希表为空
[root@172 ~]# ls
anaconda-ks.cfg       公共  视频  文档  音乐
initial-setup-ks.cfg  模板  图片  下载  桌面
[root@172 ~]# hash
命中  命令
   1    /usr/bin/ls

查看命令帮助信息

小白一上来,不要直接去研究官方文档,直接 从入门到放弃 Hhhh. 第一选择是百度谷歌.
官方文档追求的是面面俱到,用于深入研究和纠错用的...

1> Baidu, Google
2> -- help ls --help
     有些命令没有提供--help选项; 结果没有man命令全面 3> help命令
4> man手册 man ls man -a ls
     eg: man cp 底部输入/-f会将所有的-f地方高亮 按n跳转到下一个


基础常用命令

设置主机名

○ 查看主机名: hostname
     Ps: vim /etc/hosts 集群里面的主机可以设置一样的hosts文件,通过主机名进行通信.. 
○ 修改主机名:
     方式一(永久修改, 立即生效): hostnamectl set-hostname web01
     方式二(永久修改, 重启生效): vim /etc/hostname

设置默认启动级别

# 开机启动级别变为5 图形界面
systemctl set-default graphical.target
# 开机启动级别变为3 字符终端
systemctl set-default multi-user.target
# 重启机器
reboot

# 补充: 查看操作系统的发布的版本信息
[root@localhost ~]# cat /etc/redhat-release 
CentOS Linux release 7.9.2009 (Core)
[root@localhost ~]# uname -a
Linux localhost.localdomain 3.10.0-1160.66.1.el7.x86_64 1 SMP Wed May 18 16:02:34 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
[root@localhost ~]# uname -r  查看OS内核版本
3.10.0-1160.66.1.el7.x86_64

设置时间

集群化作业设置时间是很重要的,就像打仗一样,要对表嘛!

○ 查看时区: timedatectl status
○ 列出可用时区: timedatectl list-timezones
○ 设置时区:
     timedatectl set-timezone "Asia/Shanghai"
     timedatectl set-timezone UTC

○ 查看OS的系统时间: date
○ 设置查看系统时间显示的格式: date "+%Y-%m-%d %H:%M:%S"
○ 设置系统时间: date -s "2022-02-22 22:22:22"

○ 查看硬件时间: hwclock
○ 从硬件时钟设置系统时间: hwclock -s
○ 从当前系统时间设置硬件时钟: hwclock -w 有个写到硬件CMOS的过程,会等一会..

将两个时间与公网上的时间服务器进行同步! ntpdate ntp1.aliyun.com
Ps: 若主机上有ntp服务,重启后会自动帮忙同步...所以对两个时间的修改会失效.
     timedatectl set-ntp no         关闭默认的时间同步
     timedatectl set-ntp true      开始自动时间同步到远程NTP服务器
     timedatectl set-ntp false      禁用NTP时间同步

CST代表是中国东八区的时间;UTC代表的是世界标准时间,经过英国格林尼治天文台的一条经线,本初子午线
UTC比CST早,相差8小时.

在Linux中时间分两种
硬件时间: BIOS上的时间,断电后时间芯片算的时间,通过BIOS界面查看的话,会发现硬件使用的是UTC
系统时间: 操作系统的时间 我们使用的是CST
     所以开机后,OS会读取BIOS上的时间,在它基础上加8小时..

[root@localhost ~]# date
2022年 07月 05日 星期二 15:04:55 CST
[root@localhost ~]# date "+%Y-%m-%d %H:%M:%S"
2022-07-05 15:12:44
[root@localhost ~]# date -s "2022-02-22 22:22:22"
2022年 02月 22日 星期二 22:22:22 CST
[root@localhost ~]# hwclock
2022年07月05日 星期二 15时37分09秒  -0.383665 秒
[root@localhost ~]# hwclock -s
[root@localhost ~]# date
2022年 07月 05日 星期二 15:37:14 CST
[root@localhost ~]# ntpdate ntp1.aliyun.com
5 Jul 15:42:19 ntpdate[4648]: adjust time server 120.25.115.20 offset 0.147526 sec

<同步失败排错思路 网络问题>

网络排除具体步骤查看: https://zhuanlan.zhihu.com/p/337256553

step1: ping ntp1.aliyun.com 若ping不通,这涉及到外网,那就跟网关有关
step2: route -n 拿到网关地址172.16.150.2
step3: ping 172.16.150.2 若ping不通,确定网关的问题,看网卡有无关联上、看本地网络适配器VMnet8是否启用
step4: 在CentOS系统上,目前有NetworkManager和network两种网络管理工具 
     依次执行下面三条命令:
       systemctl stop NetworkManager     # 关掉
       systemctl disable NetworkManager  # 开机不启动
       systemctl restart network                 # 重启网络服务
step5: 同步失败,还有可能是SElinux防火墙的问题.

shutdown

注销登录的账号 logout exit ctrl+d

关机      init 0 级别0 
     poweroff 断电源
     shutdown -h now shutdown -h 0 立刻关机 
     shutdown -h 11:30 定点关机 
     shutdown -h 10 10分钟后关机 
     halt 关掉的是OS的运行,还需要自己断电..

重启 init 6 级别6 shutdown -r now

取消正在进行的关机或重启 shutdown -c