linux 基础指令篇

1. Linux 常用命令

所有命令的详细说明在 linuxcool 网站

命令 说明 命令 说明
date 显示系统时间 reboot 重启系统
poweroff 关闭系统 wget 下载网络文件
ps 进程状态 top 任务管理器
pidof 查看进程号 kill 关闭单个进程
killall 关闭服务以及其对应的所有进程 ifconfig 查看网络信息

1.1 Linux 系统的进程

通过ps指令来查看系统资源状态,可以通过 grep 来抓取进程对应的 pid 号,ps 进程的参数如下:

参数 作用
-a 显示所有进程
-u 用户的进程
-x 无控制终端的进程

1.1.1 linux 系统进程的状态

  • R(运行):进程正在运行或在运行队列中等待。
  • S(中断):进程处于休眠中,当某个条件形成后或者接收到信号时,则脱离该状态。
  • D(不可中断):进程不响应系统异步信号,即便用 kill 命令也不能将其中断。
  • Z(僵死):进程已经终止,但进程描述符依然存在,直到父进程调用 wait4() 系统函数后将进程释放。
  • T(停止):进程收到停止信号后停止运行。

僵死进程会一直吃系统资源

1.1.2. top 任务管理器

top 命令用于动态地监视进程活动与系统负载等信息,能够动态地查看系统运维状态,完全将它看作 Linux 中的“强化版的 Windows 任务管理器”。 top 命令的运行界面如下图所示。

top

统计信息含义如下:

行号 说明
1 系统时间、运行时间、登录终端数、系统负载(三个数值分别为 1 分钟、5 分钟、15 分钟内的平均值,数值越小意味着负载越低
2 进程总数、运行中的进程数、睡眠中的进程数、停止的进程数、僵死的进程数。
3 用户占用资源百分比、系统内核占用资源百分比、改变过优先级的进程资源百分比、空闲的资源百分比等。其中数据均为 CPU 数据并以百分比格式显示,例如“97.1 id”意味着有 97.1% 的 CPU 处理器资源处于空闲。
4 物理内存总量、内存使用量、内存空闲量、作为内核缓存的内存量。
5 虚拟内存总量、虚拟内存使用量、虚拟内存空闲量、已被提前加载的内存量

说明:

  • 第 1 行 up 后的是系统运行时间,user 是指的终端数目,load 是系统负载 [0, 1] 之间是比较好的,最大不要超过 5, 否则系统负载过大,影响响应速度
  • load average:0.1, 0.2, 0.3 指的负载逐渐降低,从右往左看。负载值升高,需要调整程序的设置
  • task:进程总数
  • %cpu :cpu 的负载情况(平均队列数),第 3 项是空闲情况
  • Kib Mem:真实物理内存的值
  • swap:交换内存的值(临时内存)
  • PID:进程编号
  • PR:优先级,越小越高
  • s:sleeping 等待中
  • %cpu:进程占用 cpu 的百分比
  • %mem:进程占用内存的百分比
  • Time:进程运行时间

要查看 sshd 进程的 pid 时,通过 pidof sshd 实现 要查看 sshd 服务的状态,通过 systemctl status sshd 实现

对于高并发的程序,会有多个进程号,这时用 killall 服务名称 批量关闭服务,相当于执行了 systemctl stop sshd

1.2 网络状态 ifconfig

ifconfig 命令用于获取网卡配置与网络状态等信息,格式为 ifconfig 『网络设备』 『参数』,其中 lo 部分是本地环回地址,主要是用于测试网卡。

eno1      Link encap: 以太网  硬件地址 aa:bb:cc:cd:c9:c3
          UP BROADCAST MULTICAST  MTU:1500  跃点数:1
          接收数据包:0 错误:0 丢弃:0 过载:0 帧数:0
          发送数据包:0 错误:0 丢弃:0 过载:0 载波:0
          碰撞:0 发送队列长度:1000
          接收字节:0 (0.0 B)  发送字节:0 (0.0 B)
          中断:16 Memory:df100000-df120000

ens2      Link encap: 以太网  硬件地址 00:e0:4c:14:0c:ad
          inet 地址:10.9.xxx.xxx  广播:10.9.xxx.xxx 掩码:255.255.255.128
          inet6 地址:xxxx::xxxx:xxxx:xxxx:faxf/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  跃点数:1
          接收数据包:98449 错误:0 丢弃:0 过载:0 帧数:0
          发送数据包:46180 错误:0 丢弃:0 过载:0 载波:0
          碰撞:0 发送队列长度:1000
          接收字节:61142534 (61.1 MB)  发送字节:6042999 (6.0 MB)

lo        Link encap: 本地环回
          inet 地址:127.0.0.1  掩码:255.0.0.0
          inet6 地址:::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  跃点数:1
          接收数据包:1936 错误:0 丢弃:0 过载:0 帧数:0
          发送数据包:1936 错误:0 丢弃:0 过载:0 载波:0
          碰撞:0 发送队列长度:1000
          接收字节:192827 (192.8 KB)  发送字节:192827 (192.8 KB)

说明:

  • eno1:网卡名称
  • inet:网卡 ip
  • ether: MAC 地址
  • Recv: 接收字节
  • Send:发送字节

1.3 系统内核与版本 uname

uname 命令用于查看系统内核与系统版本等信息,格式为 uname [-a]

[root@linuxprobe ~]# uname -a
Linux linuxprobe.com 3.10.0-123.el7.x86_64 #1 SMP Mon May 5 11:16:57 EDT 2017 x86_64 x86_64 x86_64 GNU/Linux

显示信息为:当前系统的内核名称、主机名、内核发行版本、节点名、制作系统时间、硬件名称、硬件平台、处理器类型以及操作系统名称等信息。

1.4 查看系统负载 uptime

uptime 用于查看系统的负载信息,就是 top 命令的第 1 行内容

1.5 查看内存 free

free 用于显示当前系统中内存的使用量信息,格式为 free [-h]

wilson@P310:~$ free -h

       内存总量   已用量   空闲量   进程共享的内存量   磁盘缓存的内存量   应用程序可用
         total     used    free     shared          buff/cache      available
Mem:       31G     1.7G    27G      127M            1.8G              28G
Swap:      31G       0B    31G

1.5.1. free 与 available 的区别

free 是真正尚未被使用的物理内存数量。 available 是应用程序认为可用内存数量,available = free + buffer + cache (注:只是大概的计算方法)

Linux 为了提升读写性能,会消耗一部分内存资源缓存磁盘数据,对于内核来说,buffer 和 cache 其实都属于已经被使用的内存。但当应用程序申请内存时,如果 free 内存不够,内核就会回收 buffer 和 cache 的内存来满足应用程序的请求。这就是稍后要说明的 buffer 和 cache。

1.5.2. buff 和 cache 的区别

buffer 为缓冲,cache 为缓存。 由于硬件制作工艺上的差别,所以当两种硬件需要交互的时候,会存在速度上的差异。假如接口速率 A = 1000M/s,B = 500M/s,如何解决时间浪费呢?这就是 buffer 和 cache 的作用了。这里用 ab 作为 A 和 B 之间的中间通道。

ab

  • A 从 B 取 1G 数据 A 把需求告诉了 ab,接下来 ab 通过 b 和 B 进行文件传送,同时 ab 都缓存一个拷贝,如果下次 A 或者其他 C 来取 B 的东西,ab 直接就给 A 或 C 一个已有的拷贝,然后把它通过 a 接口给了 A 或 C 由于 a 的速率相对接近 A 的接口速率,所以 A 觉得不错为他省了时间,说白了此时的 ab 提供的就是一种缓存能力,即 cache
  • A 发给 B 1G 的数据 1000M 通过 a 接口给了 ab ,站在 A 视图上他认为已经把 1000M 的文件给了 B,但对于 ab 并不立即交给 B,而是先缓存下来,除非 B 执行 sync 命令 因为 b 的接口速率大于 B 接口速率,所以也不会存在漏洞时间。A 节约了时间干其他的事务,而 ab 此时提供的就是一种缓冲的能力,即 buffer

1.6 用户终端信息 who

who 用于查看当前登入主机的用户终端信息,格式为 who 『参数』

登陆的用户名 	终端设备 	登陆到系统的时间
root 	          :0 	    2017-08-24 17:52 (:0)
root 	         pts/0 	    2017-08-24 17:52 (:0)

1.7 登录记录 last

last 命令用于查看所有系统的登录记录,格式为 last 『参数』

1.8 历史记录 history

history 命令用于显示历史执行过的命令,格式为 history [-c] 可以自定义 /etc/profile 文件中的 HISTSIZE 变量值。在使用 history 命令时,如果使用 -c 参数则会清空所有的命令历史记录。 还可以使用“! 数字”的方式来重复执行某一次的命令。 历史命令保存在 ~/.bash_history 文件中。

1.9 诊断报告 sosreport

sosreport 命令用于收集系统配置及架构信息并输出诊断文档,格式为 sosreport。当系统出现问题时,可以通过此命令将系统诊断信息打包后,发送给红帽公司定位问题。

2. 工作目录切换

工作目录指的是用户当前在系统中所处的位置。

主要命令:

  • pwd
  • cd: cd - 返回上次目录
  • ls

3. 文件编辑

命令 说明 命令 说明
cat cat -n 带行号的查看 more 翻页查看
head head -n N 查看前 N 行 tail tail -n;tail -f 实时查看文件
tr 替换字符,『原始字符』 『目标字符』 wc 统计行数 (-l)、字数 (-w)、字节数 (-c)
stat 具体存储信息和时间等信息 cut 按“列”提取文本字符。-f列号,-d间隔符
diff 比较文件差异    

文件的 3 个时间:

  1. A time:access time,文件最后查看时间
  2. M time:modify time,文件内容最后一次的修改时间
  3. C time:Change time,文件属性变量的时间

3.1 列提取 cut

cut -d: f1 /etc/passwd

: 为分隔符从 /etc/passwd 中提取分割后的第 1 列

3.2 比较差异 diff

  1. 判断是否相同 –brief

     [root@linuxprobe ~]# diff --brief diff_A.txt diff_B.txt
     Files diff_A.txt and diff_B.txt differ
    
  2. 查看不同 -c

     [root@linuxprobe ~]# diff -c diff_A.txt diff_B.txt
     *** diff_A.txt 2017-08-30 18:07:45.230864626 +0800
     --- diff_B.txt 2017-08-30 18:08:52.203860389 +0800
     ***************
     *** 1,5 ****
     ! Welcome to linuxprobe.com
     Red Hat certified
     ! Free Linux Lessons
    

4. 文件目录管理

序号 命令 参数 作用
1 touch [-o] file -a 修改读取时间 atime
    -m 修改修改时间 mtime
    -d 修改 atime 和 mtime
    - 创建空白文本文件
2 mkdir [-o] dir - 创建目录
    -p 递归创建目录
3 cp [-o] scr dst - 复制文件
    -r 递归复制
    -p 保留原始文件属性
    -d 复制链接
4 mv scr dst - 移动
5 rm [-o] file -f 强制删除 (避免二次确认)
    -r 递归删除
6 dd [-o] if 输入文件名 input
    of 输出文件名 output
    bs 批大小 batchsize
    count 批数目
7 file 文件名 - 查看文件类型

4.1 dd 命令

  1. 从 /dev/zero 设备文件中取出一个大小为 560MB 的数据块,然后保存成名为 560_file 的文件
    [root@linuxprobe ~]# dd if=/dev/zero of=560_file count=1 bs=560M
    1+0 records in
    1+0 records out
    587202560 bytes (587 MB) copied, 27.1755 s, 21.6 MB/s
    
  2. 把光驱设备中的光盘制作成 iso 格式的镜像文件
    [root@linuxprobe ~]# dd if=/dev/cdrom of=RHEL-server-7.0-x86_64-LinuxProbe.Com.iso
    7311360+0 records in
    7311360+0 records out
    3743416320 bytes (3.7 GB) copied, 370.758 s, 10.1 MB/s
    

4.2 打包压缩与搜索

序号 命令 参数 作用
1 tar file -c 创建压缩文件
    -x 解压文件
    -z 用 Gzip 压 / 解
    -j 用 bzip2 压 / 解
    -v 显示过程,防死机
    -f 目标名,必须在最后
    -C 指定解压路径
2 grep 选项 文件 -b 搜索二进制文件内容
    -c 仅显示目标行数
    -i 忽略大小写
    -n 显示行号
    -v 反向列出无 key 的行
3 find 『路径』 条件 操作 -name 匹配名称
    -perm 匹配权限 -mode:包含即可
    -user 匹配所有者
    -m/a/ctime -n +n 修改内容时间 (-n: n 天内,+n: n 天前)
    -size 匹配文件大小
    -exec …{}\; 将结果交于 exec 处理

4.2.1 tar 命令

把 /etc 目录通过 gzip 格式进行打包压缩,并把文件命名为 etc.tar.gz:

[root@linuxprobe ~]# tar czvf etc.tar.gz /etc

解压到 /root/etc 目录中:

[root@linuxprobe ~]# mkdir /root/etc
[root@linuxprobe ~]# tar xzvf etc.tar.gz -C /root/etc

4.2.2 grep 命令

grep 命令来查找出当前系统中不允许登录系统的所有用户信息:

[root@linuxprobe ~]# grep /sbin/nologin /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

4.2.3 find 命令

根据文件系统层次标准(Filesystem Hierarchy Standard)协议,Linux 系统中的配置文件会保存到 /etc 目录中,要想获取到该目录中所有以 host 开头的文件列表,可以执行如下命令:

[root@linuxprobe ~]# find /etc -name "host*" -print
/etc/avahi/hosts
/etc/host.conf
/etc/selinux/targeted/modules/active/modules/hostname.pp
/etc/hostname

搜索权限中包括 SUID 权限的所有文件:

[root@linuxprobe ~]# find / -perm -4000 -print
/usr/bin/fusermount
/usr/bin/su

在整个文件系统中找出所有归属于 linuxprobe 用户的文件并复制到 /root/findresults 目录,这里的 -exec {} \; 参数,其中的 {} 表示 find 命令搜索出的每一个文件,并且命令的结尾必须是 \;

[root@linuxprobe ~]# find / -user linuxprobe -exec cp -a {} /root/findresults/ \;

5. 重定向

5.1 输入输出描述符

重定向就是将输入、输出转到其他位置。Linux 系统默认有 3 个输入输出方向,在系统中 0, 1, 2 对应的就是文件描述符

名称 编号 操作符 Linux 下文件描述符
stdin 0 <<< /dev/stdin -> /proc/self/fd/0 -> /dev/pts/0
stdout 1 >, >>, 1>, 1>> /dev/stdout -> /proc/self/fd/1 -> /dev/pts/0
stderr 2 2>, 2>> /dev/stderr -> /proc/self/fd/2 -> /dev/pts/0

因为 stdout 的描述符 1 可以省略,所以

echo "hello" > t.log

可以写成:

echo "hello" 1> t.log

5.2 关于 2>&1 的含义

  1. 将标准错误输出重定向到标准输出
  2. 符号》& 是一个整体2>1 的重定向含义是把标准错误输出到文件 2 中,为了区别这个问题,只能在 stdout 的描述符 1 前加入 &

对于 nohup java -jar app.jar >log 2>&1 这条命令,具体过程如下:

  1. 本来 1—–>屏幕 (1 指向屏幕)
  2. 执行》log 后, 1—–>log (1 指向 log)
  3. 执行 2>&1 后, 2—–>1 (2 指向 1,而 1 指向 log, 因此 2 也指向了 log)

对于 nohup java -jar app.jar 2>&1 >log 这条命令:

  1. 1—–>屏幕
  2. 2—–>1 (2 指向 1,而 1 指向屏幕,因此 2 也指向了屏幕)
  3. 1—–>log (1 指向 log,2 还是指向屏幕)

5.3 输入重定向

符号 功能
cmd < file 文件内容 -> 命令
cmd << 分界符 从 stdin 中读入,直到遇见分界符才停止
命令 < 文件 1 > 文件 2 将文件 1 作为命令的标准输入并将标准输出到文件 2

把 readme.txt 文件导入给 wc -l 命令,统计一下文件中的内容行数:

[root@linuxprobe ~]# wc -l < readme.txt
2

5.4 输出重定向

符号 功能
命令 > 文件 标准输出重定向
命令 2> 文件 错误输出重定向
命令 » 文件 追加
命令 2» 文件 追加
命令 » 文件 2>&1 标准输出重定向到文件,错误输出重定向到文件

命令 » 文件 2>&1 也可以写成: 命令 &» 文件,表 stdout 和 stderr 都定向到文件 命令 > 文件,应该解读成 命令 1>文件

6 管道符

把前面命令的输出内容导入后面的命令

  1. 统计未登陆用户
     [root@linuxprobe ~]# grep "/sbin/nologin" /etc/passwd | wc -l
     33
    
  2. 密码重置
     [root@linuxprobe ~]# echo "linuxprobe" | passwd --stdin root
     Changing password for user root.
     passwd: all authentication tokens updated successfully.
    
  3. 让用户一直输入内容,直到用户输入了其自定义的分界符时,才结束输入
    [root@linuxprobe ~]# mail -s "Readme" root@linuxprobe.com << over
    > I think linux is very practical
    > I hope to learn more
    > can you teach me ?
    > over
    [root@linuxprobe ~]#
    

7 通配符

通配符 功能
* 匹配零个或多个字符
? 单个字符
[0-9] 0~9 之间的单个数字
[abc] a、b、c 三个字符中的任意一个
[1,3,5] 三个指定数字中的一个

8 转义字符

转义符 功能
\ 反斜杠 后面的一个变量变为单纯的字符
' ' 单引号 全局转义,所有变量转义为字符串
"" 双引号 保留其中的变量属性,不进行转义处理
``反引号 把其中的命令执行后返回结果
$ 提取变量

$$:显示当前进程号 DATE = date,则系统变量 DATE 保存 date 指令的打印结果

9 环境变量

Linux 中变量是用于保存值的数据类型,一般约定用大写。环境变量是定义运行环境的一些参数,为用户提供了服务的工作运行环境。我们看一下在 Linux 系统中,执行一条指令的过程是怎样的:

  1. 是否以绝对路径或相对路径的方式输入命令(如 /bin/ls),如果是的话则直接执行
  2. 命令是否为“别名命令”
  3. Bash 解释器判断内部还是外部命令。内部会被直接执行
  4. 外部命令则在 PATH 路径中查找命令程序,
  • 别名是通过 alias 别名 = 命令 创建,unalias 别名 取消
  • type 命令 查看是内部命令还是外部命令
  • PATH 是系统路径,PATH=$PATH:/root/bin 增加路径
  • env 可以查看所有环境变量

为什么要用 ./ 命令 来执行命令呢?

为防止黑客在比较常用的公共目录 /tmp 中存放了一个与 ls 或 cd 命令同名的木马文件,而用户又恰巧在公共目录中执行了这些命令,那么就极有可能中招了

所以,作为一名态度谨慎、有经验的运维人员,时常查看 PATH 变量中是否有可疑的目录

9.1 10 个重要的环境变量

变量 作用
HOME 用户的主目录(即家目录)
SHELL 用户在使用的 Shell 解释器名称
HISTSIZE 输出的历史命令记录条数
HISTFILESIZE 保存的历史命令记录条数
MAIL 邮件保存路径
LANG 系统语言、语系名称
RANDOM 生成一个随机数字
PS1 Bash 解释器的提示符
PATH 定义解释器搜索用户执行命令的路径
EDITOR 用户默认的文本编辑器
  • 每个用户都有自己的环境变量,比如 $HOME 变量
  • 通过 WORKDIR=/home/workdir 可以设置一个局部变量,仅用于当前用户
  • 通过 export WORKDIR 升级为全局变量

10 配置系统

10.1 配置主机名

主机名大多保存在 /etc/hostname 文件中,修改文件内容即可

通过 hostname 查看当前主机名

10.2 配置网卡

  • 在 Linux 中一切皆文件,所以配置网卡就是修改配置文件。
  • 在 RHEL 5、RHEL 6 中,网卡配置文件的前缀为 eth,第 1 块网卡为 eth0,第 2 块网卡为 eth1
  • 在 RHEL 7 中,网卡配置文件的前缀则以 ifcfg 开始,加上网卡名称共同组成了网卡配置文件的名字,例如 ifcfg-eno16777736

现在有一个名为 ifcfg-eno16777736 的网卡设备 (通过 ifconfig 确认),我们将其配置为开机自启动,并且 IP 地址、子网、网关等信息由人工指定:

#  ubuntu: /etc/network/interfaces
cd /etc/sysconfig/network-scripts
vim ifcfg-eno16777736
TYPE=Ethernet
BOOTPROTO=static
NAME=eno16777736
ONBOOT=yes
IPADDR=192.168.10.10
NETMASK=255.255.255.0
GATEWAY=192.168.10.1
DNS1=192.168.10.1

含义:

  • 设备类型:TYPE=Ethernet
  • 地址分配模式:BOOTPROTO=static
  • 网卡名称:NAME=eno16777736
  • 是否启动:ONBOOT=yes
  • IP 地址:IPADDR=192.168.10.10
  • 子网掩码:NETMASK=255.255.255.0
  • 网关地址:GATEWAY=192.168.10.1
  • DNS 地址:DNS1=192.168.10.1

10.3 配置 YUM 仓库

要使用 YUM 仓库,就要先把它搭建起来,然后将其配置规则确定好

cd /etc/yum.repos.d/
vim rhel7.repo  # 新建文件
[rhel7]
name=rhel7
baseurl=file:///media/cdrom
enabled=1
gpgcheck=0
  • [rhel-media] :Yum 软件仓库唯一标识符,避免与其他仓库冲突
  • name=linuxprobe:Yum 软件仓库的名称描述,易于识别仓库用处
  • baseurl=file:///media/cdrom:提供的方式包括 FTP(ftp://..)、HTTP(http://..)、本地 (file:///..)
  • enabled=1:设置此源是否可用;1 为可用,0 为禁用
  • gpgcheck=1:设置此源是否校验文件;1 为校验,0 为不校验
  • gpgkey=file:///media/cdrom/RPM-GPG-KEY-redhat-release:若上面参数开启校验,那么请指定公钥文件地址

按配置参数的路径挂载光盘,并把光盘挂载信息写入到 /etc/fstab 文件中,然后可能通过 yum install httpd -y 来测试仓库配置是否生效

[root@linuxprobe yum.repos.d]# mkdir -p /media/cdrom
[root@linuxprobe yum.repos.d]# mount /dev/cdrom /media/cdrom
mount: /dev/sr0 is write-protected, mounting read-only
[root@linuxprobe yum.repos.d]# vim /etc/fstab
/dev/cdrom /media/cdrom iso9660 defaults 0 0
[root@linuxprobe ~]# yum install httpd