avatar


2.命令

概述

命令格式

1
命令主体 选项 操作对象

一个命令可以有多个选项,多个操作对象。

在上一章《1.简介、目录和VIM》,我们讨论了VIM打开文件的四种常用方式,其实就是命令格式的体现。

  1. vim 文件路径:打开指定的文件。
  2. vim +数字 文件路径:打开指定的文件,并且将光标移动到指定行。
  3. vim +/关键词 文件路径:打开指定的文件,并且高亮显示关键词。
  4. vim 文件路径1 文件路径2 文件路径3:同时打开多个文件(这种不常用)。

如果操作对象名称的开头有-
我们可以在前面加上./,这样带-的操作对象不会被解析为选项。

例如,文件名为-123.txt,示例代码:

1
vim ./-123.txt

如果操作对象名称中有空格呢?
我们可以为其加上转义\ ,或者用单引号双引号括起来。
例如,文件名为 123.txt,示例代码:

1
2
vim \ 123.txt
vim ' 123.txt'

帮助

获取帮助信息有两种方法:

  1. man
  2. help

man,示例代码:

1
man ls

help,示例代码:

1
help cd

这两种存在区别,但是在讨论区别之前,我们先讨论一下Linux中的命令分类:

  1. 内建命令:是shell程序的一部分,写在bash的源码builtins里的。例如:historycdexit
  2. 外部命令:外部命令是在bash之外安装的,通常在/bin/usr/bin/sbin/usr/sbin中。例如:lsvi

我们可以用type来区分是内建命令还是外部命令。

举例:

  1. 内建命令,示例代码:

    1
    type exit

    运行结果:

    1
    exit is a shell builtin

    解释说明:is a shell builtin,说明是内建命令。

  2. 外部命令,示例代码:

    1
    type vim

    运行结果:

    1
    vim is /usr/bin/vim

    解释说明:is /usr/bin/vim,说明是外部命令。

  3. 别名,示例代码:

    1
    type ls

    运行结果:

    1
    ls is aliased to `ls --color=auto'

    解释说明:该命令为其他命令的别名。

help只用于查看内建命令的帮助信息。

快捷操作

  1. 上下箭头
    在命令行输入之前执行过的命令,我们可以按回车执行,也可以进行修改后再执行。
  2. tab
    对命令进行补齐,这个在输入文件名的时候特别方便。

文件目录

pwd

pwd:查看当前工作目录的绝对路径。

示例代码:

1
pwd

运行结果:

1
/home/kaka

ls

ls:查看目录。
操作对象:需要查看的目录,默认当前目录。
常用选项:

  • -a:显示当前目录所有的文件和目录,包括隐藏的。
  • -l:以列表的方式显示信息。
  • -h:较易阅读的方式表示文件大小(默认以字节为单位),需要和-l配合使用。

举例:

  1. ls -al:显示当前所有的文件和目录,包括隐藏的;以列表的形式。示例代码:

    1
    ls -al

    运行结果:

    1
    2
    3
    4
    5
    6
    7
    8
    total 15360

    【部分运行结果略】

    -rw-r--r--. 1 kaka kaka 1113 Jul 3 03:47 Milan Milan 米兰米兰.txt
    -rw-r--r--. 1 kaka kaka 12288 Jul 3 10:19 .Milan Milan 米兰米兰.txt.swp

    【部分运行结果略】

    解释说明:.Milan Milan 米兰米兰.txt.swp,属于隐藏文件。

  2. ls -lh:以较易阅读的方式表示文件大小;以列表的形式。示例代码:

    1
    ls -lh

    运行结果:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    -rw-rw-r--. 1 kaka kaka 2.7K Jul  3 09:08 111.txt
    -rw-rw-r--. 1 kaka kaka 439 Jul 4 13:23 123.txt
    -rw-rw-r--. 1 kaka kaka 430 Jul 4 13:23 -123.txt
    -rw-rw-r--. 1 kaka kaka 370 Jul 1 20:02 123.txt
    -rw-rw-r--. 1 kaka kaka 2.7K Jul 4 13:06 222.txt
    -rw-rw-r--. 1 kaka kaka 3.8K Jul 4 13:02 A New Day Has Come.txt
    drwxrwxr-x. 9 kaka kaka 4.0K Jun 25 10:45 apache-tomcat-8.5.81
    -rw-r--r--. 1 kaka kaka 15M Jun 25 10:44 apache-tomcat-8.5.81.tar
    -rw-rw-r--. 1 kaka kaka 1.2K Jul 4 13:00 a.txt
    -rw-rw-r--. 1 kaka kaka 150 Jul 4 13:07 cal.txt
    drwxr-xr-x. 2 kaka kaka 4.0K Jun 25 10:43 Desktop
    -rw-rw-r--. 1 kaka kaka 9.1K Jul 3 00:27 dev.txt
    drwxrwxr-x. 3 kaka kaka 4.0K Jul 4 21:07 dir1
    drwxrwxr-x. 2 kaka kaka 4.0K Jul 3 22:05 dir2
    drwxr-xr-x. 2 kaka kaka 4.0K Jun 23 07:54 Documents
    drwxr-xr-x. 2 kaka kaka 4.0K Jun 23 07:54 Downloads

    【部分运行结果略】
  3. 查看指定目录,示例代码:

    1
    ls -l apache-tomcat-8.5.81

    运行结果:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    total 148
    drwxr-x---. 2 kaka kaka 4096 Jun 25 10:45 bin
    -rw-r-----. 1 kaka kaka 19497 Jun 9 05:30 BUILDING.txt
    drwx------. 3 kaka kaka 4096 Jun 25 10:45 conf

    【部分运行结果略】

    drwxr-x---. 2 kaka kaka 4096 Jun 25 10:45 temp
    drwxr-x---. 7 kaka kaka 4096 Jun 9 05:30 webapps
    drwxr-x---. 3 kaka kaka 4096 Jun 25 10:45 work

ll

llls的一个别名。

我们可以通过type查看一下,示例代码:

1
type ll

运行结果:

1
ll is aliased to `ls -l --color=auto'

cd

cd:切换到指定目录,操作对象为路径。

路径表示方法

  • ~:用户的Home目录。
  • ..:上一级目录。
  • 绝对路径(相对根目录),以/开头。
  • 相对路径(相对当前目录),不以/开头。

不仅仅在cd中是如此,只要是路径,都是如此。

mkdir

mkdir:创建目录。

常用选项:

  • -p:创建多级目录

举例:

  1. 创建一个目录,示例代码:
    1
    mkdir dir
  2. 创建多级目录,示例代码:
    1
    mkdir dir1/dir2
    运行结果:
    1
    mkdir: cannot create directory ‘dir1/dir2’: No such file or directory
    解释说明:因为dir1不存在,所以无法创建dir1/dir2
    但可以利用参数-p实现,示例代码:
    1
    mkdir -p dir1/dir2

rmdir

rmdir:删除空目录,如果目录非空无法删除。

如果有多个要删除的空目录,可以用空格分隔。示例代码:

1
rmdir dir dir1

对于非空目录,可以采用如下的方法删除。

1
rm -rf 要删除的目录

touch

touch:创建空文件。

cp

cp:拷贝文件到指定路径。

该命令需要两个操作对象,第一个是源,第二个是目标。

常用选项:

  • -r:递归复制整个文件夹

举例:

  1. A New Day Has Come-新的一天已经来临.txt拷贝到dir1目录下。示例代码:

    1
    cp A\ New\ Day\ Has\ Come-新的一天已经来临.txt dir1/
  2. dir2整个目录拷贝到dir1。示例代码:

    1
    2
    cp -r dir2/ dir1/
    ll dir1/

    运行结果:

    1
    2
    -rw-r--r--. 1 kaka kaka 2679 Jul  3 22:03 A New Day Has Come-新的一天已经来临.txt
    drwxrwxr-x. 2 kaka kaka 4096 Jul 3 22:06 dir2

    解释说明:此时dir2目录是dir1的子目录。

  3. dir3整个目录的所有内容,拷贝到dir4
    dir3的目录结构如下:

    1
    2
    3
    4
    5
    6
    dir3/
    ├── 1
    ├── 2
    ├── 3
    └── dir3_1
    └── 3_1

    拷贝,注意,是dir3/*,有通配符。示例代码:

    1
    2
    cp -r dir3/* dir4/
    tree dir4/

    运行结果:

    1
    2
    3
    4
    5
    6
    dir4/
    ├── 1
    ├── 2
    ├── 3
    └── dir3_1
    └── 3_1

    解释说明:不包括dir3目录本身。

rm

rm:移除(删除)文件或目录。

常用选项:

  • -r:递归删除整个文件夹。
  • -f:强制删除不提示。

mv

mv:移动文件与目录,也可以用来重命名。

cp一样,该命令也需要两个操作对象,第一个是源,第二个是目标。

举例:

  1. 11.txt重命名为123.txt,示例代码:
    1
    mv 11.txt 123.txt
  2. 12.txt移动到dir1/目录下:
    1
    mv 12.txt dir1/

basename

basename,取路径里的文件名称。

基本语法:basename [string / pathname] [suffix]

suffix为后缀,如果suffix被指定了,会将suffix去掉。

举例:

  1. 取文件名,示例代码:
    1
    basename /home/kaka/apache-tomcat-8.5.81/conf/server.xml
    运行结果:
    1
    server.xml
  2. 取文件名,同时去除后缀。示例代码:
    1
    basename /home/kaka/apache-tomcat-8.5.81/conf/server.xml .xml
    运行结果:
    1
    server

dirname

dirname,取路径里的目录部分。

基本语法:dirname 文件绝对路径

举例:

  1. 取绝对路径中的目录部分,示例代码:
    1
    dirname /home/kaka/apache-tomcat-8.5.81/conf/server.xml
    运行结果:
    1
    /home/kaka/apache-tomcat-8.5.81/conf
  2. 取相对路径中的目录部分,示例代码:
    1
    dirname apache-tomcat-8.5.81/conf/server.xml
    运行结果:
    1
    apache-tomcat-8.5.81/conf

cat

cat:将文件内容输出到控制台(以只读的方式)。

常用选项:

  • -n:显示行号

示例代码:

1
cat -n A\ New\ Day\ Has\ Come.txt

运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
 1  A New Day Has Come
2 新的一天已经来临
3 A New Day Has Come
4 新的一天已经来临
5 I was waiting for so long

【部分运行结果略】

90 不敢相信
91 If Ive been touched by an angel with love
92 天使触动了我 赐予我爱情
93 Hush, now
94 万籁俱寂[kaka@centos-linux ~]$

more

more:分页查看文本文件的内容。

通过more打开文件后,可以进行一些操作:

  • 空格键(Space):向下朝一页
  • Enter:向下翻一行
  • Ctrl + f:向下滚动一屏
  • Ctrl + b:向上滚动一屏
  • =:打印当前行的行号(在底部命令行打印)
  • : + f:打印文件名和当前行的行号(在底部命令行打印)
  • q:退出

less

less:分页查看文本文件的内容。与more类似,但是比more更强大,在查看文件内容时,并不是一次将整个文件加载,而是根据内容需要加载,对于查看大型文件具有较高的效率。

通过less打开文件后,同样可以进行一些操作:

  • 空格键(Space):向下朝一页
  • Enter:向下翻一行
  • f:向下滚动一屏
  • b:向上滚动一屏
  • =:显示当前页面是第几行到第几行
  • /:搜索
    • n:向下查找
    • N:向上(反向向下)查找
  • q:退出

>和>>

功能:输出重定向,可以将内容重定向至文件。如果文件不存在,会自动创建。
语法:

  • 覆盖:>
  • 追加:>>

举例:

  1. ll输出的内容,写入到a.txt中。示例代码:
    1
    2
    ll > a.txt
    cat a.txt
    运行结果:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    total 15264
    -rw-rw-r--. 1 kaka kaka 2679 Jul 3 09:08 111.txt
    -rw-rw-r--. 1 kaka kaka 370 Jul 1 20:02 123.txt
    -rw-rw-r--. 1 kaka kaka 2668 Jul 3 00:59 A New Day Has Come.txt
    drwxrwxr-x. 9 kaka kaka 4096 Jun 25 10:45 apache-tomcat-8.5.81
    -rw-r--r--. 1 kaka kaka 15380480 Jun 25 10:44 apache-tomcat-8.5.81.tar

    【部分运行结果略】

    drwxr-xr-x. 2 kaka kaka 4096 Jun 23 07:54 Pictures
    drwxr-xr-x. 2 kaka kaka 4096 Jun 23 07:54 Public
    drwxr-xr-x. 2 kaka kaka 4096 Jun 23 07:54 Templates
    drwxr-xr-x. 2 kaka kaka 4096 Jun 23 07:54 Videos
    -rw-------. 1 kaka kaka 171879 Jul 3 09:57 web.xml
  2. ll输出的内容,追加到A New Day Has Come.txt。示例代码:
    1
    2
    ll >> A\ New\ Day\ Has\ Come.txt 
    cat A\ New\ Day\ Has\ Come.txt
    运行结果:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    A New Day Has Come
    新的一天已经来临
    A New Day Has Come
    新的一天已经来临
    I was waiting for so long
    漫长等待
    For a miracle to come
    等待奇迹的出现

    【部分运行结果略】

    drwxr-xr-x. 2 kaka kaka 4096 Jun 23 07:54 Music
    drwxr-xr-x. 2 kaka kaka 4096 Jun 23 07:54 Pictures
    drwxr-xr-x. 2 kaka kaka 4096 Jun 23 07:54 Public
    drwxr-xr-x. 2 kaka kaka 4096 Jun 23 07:54 Templates
    drwxr-xr-x. 2 kaka kaka 4096 Jun 23 07:54 Videos
    -rw-------. 1 kaka kaka 171879 Jul 3 09:57 web.xml
  3. 将文件111.txt的内容覆盖到222.txt。示例代码:
    1
    cat 111.txt > 222.txt
  4. 将当前日历信息写到cal.txt。示例代码:
    1
    2
    cal > cal.txt
    cat cal.txt
    运行结果:
    1
    2
    3
    4
    5
    6
    7
    8
          July 2022     
    Su Mo Tu We Th Fr Sa
    1 2
    3 4 5 6 7 8 9
    10 11 12 13 14 15 16
    17 18 19 20 21 22 23
    24 25 26 27 28 29 30
    31

echo

echo:输出内容到控制台。

示例代码:

1
echo 123

运行结果:

1
123

head:打印文件的开头部分内容,默认10行。

常用选项:

  • -数字-n 数字:打印前指定的行。

打印前5行,示例代码:

1
head -5 A\ New\ Day\ Has\ Come.txt

运行结果:

1
2
3
4
5
A New Day Has Come
新的一天已经来临
A New Day Has Come
新的一天已经来临
I was waiting for so long

tail

tail:输出文件中尾部的内容,默认10行。
常用选项:

  • -数字-n 数字:打印结尾指定的行
  • -f:实时追踪该文档的所有更新,通常用于观察日志。

示例代码:

1
tail -5f Milan\ Milan\ 米兰米兰.txt

运行结果:

1
2
3
4
5
愿你远离污染
Milan Milansolocon te
米兰,米兰 只愿拥护你
Milan Milansempreper te
米兰,米兰 永远为了你

Linux中的命令headtail用于显示前若干行或后若干行,这个容易联想到Pandas中DataFrame的函数head()tail()
关于Pandas中的DataFrame的函数head()tail(),可以参考《用Python分析数据的方法和技巧:3.pandas》

split

用法:

1
split [参数] [要分割的文件名] [分割后的文件名前缀]

参数:

  • -b,指定切割文件大小,单位b、k、m。
  • -l,指定每多少行切割一次,用于文本文件分割。
  • -C,与-b类似,但尽量维持每行完整性。
  • -a,指定后缀名的长度,默认为2位。
  • -d,使用数字而不是字母作为后缀名。
  • –version,显示版本信息。

示例代码:

1
2
# 把 wm6.dmg 这个文件以 wm6.dmg. 开头,按1024m大小进行分割
split -b 1024m wm6.dmg wm6.dmg.

如何需要合并文件,可以用上文的cat方法。
files_name_1files_name_2files_name_3这三个文件进行合并,合并成一个叫files_name的文件,示例代码:

1
cat files_name_1 files_name_2 files_name_3 > files_name

ln -s

ln -s:创建软连接。
注意!一般都是建立软连接!即一般在ln加上选项-s
该命令需要两个操作对象,第一个是源,第二个是连接名。

示例代码:

1
2
ln -s apache-tomcat-8.5.81/logs/ tomcat-logs
ll

运行结果:

1
2
3
4
5
6

【部分运行结果略】

lrwxrwxrwx. 1 kaka kaka 26 Jul 4 21:30 tomcat-logs -> apache-tomcat-8.5.81/logs/

【部分运行结果略】

特别的,当我们使用pwd查看目录时,看到的是软链接所在目录。示例代码:

1
2
cd tomcat-logs/
pwd

运行结果:

1
/home/kaka/tomcat-logs

history

history:查看已经执行过的命令。

示例代码:

1
history

运行结果:

1
2
3
4
5
6
7
8

【部分运行结果略】

332 history
333 cal
334 cal 202206
335 cal 2022
336 history

上述的history命令没有显示执行时间。
显示执行时间有两种方法:

  1. 先执行HISTTIMEFORMAT="%F %T ",然后执行history
    该方法只在当前会话有效。
  2. 修改/etc/profile,添加如下内容,再执行source /etc/profile
    1
    2
    HISTTIMEFORMAT="%F %T: "
    export HISTTIMEFORMAT
    该方法长期有效。

时间日期

date

date:查看时间。

常见用法:

  • date:当前时间
  • date +%Y:年
  • date +%m:月
  • date +%d:日
  • date +%H:时
  • date +%S:秒(S,大写)
  • date +%s:当前时间戳(s,小写)

如果我们想查看"年-月-日 时:分:秒"这种格式的呢?
'+%Y-%m-%d %H:%M:%S'(需要用单引号或者双引号括起来),示例代码:

1
date '+%Y-%m-%d %H:%M:%S'

运行结果:

1
2022-07-04 21:43:16

date的另一个作用,是设置时间。

语法:date -s 字符串时间

示例代码:

1
date -s '2020-12-12 12:12:12'
运行结果:
1
Sat Dec 12 12:12:12 CST 2020

cal

cal:查看日历。

举例:

  1. 查看当前月份的日历,示例代码:
    1
    cal
    运行结果:
    1
    2
    3
    4
    5
    6
    7
    8
          July 2022     
    Su Mo Tu We Th Fr Sa
    1 2
    3 4 5 6 7 8 9
    10 11 12 13 14 15 16
    17 18 19 20 21 22 23
    24 25 26 27 28 29 30
    31
  2. 查看指定年的日历,示例代码:
    1
    cal 2022

搜索查找

find

find:从指定目录向下遍历符合条件的各个文件、子目录。

注意!该命令,操作对象在前,选项在后。语法如下:

1
find 查找范围 选项

常用选项:

  • -name 文件名:按文件名查找。
  • -size 文件大小:按文件大小查找。
    • +文件大小:大于
    • -文件大小:小于
    • 文件大小:等于
  • -user 用户名:按所属用户查找。

举例:

  1. 查找文件名为1的,示例代码:

    1
    find ~ -name 1

    运行结果:

    1
    2
    /home/kaka/.local/share/webkitgtk/deviceidhashsalts/1
    /home/kaka/dir2/1

    注意,是包括拓展名的全名匹配。
    我们查找不含拓展名的111,无结果,示例代码:

    1
    find ~ -name 111

    运行结果:

    1
    【无】

    但是查找含拓展名的111.txt,有结果。示例代码:

    1
    find ~ -name 111.txt

    运行结果:

    1
    /home/kaka/111.txt

    如果想模糊匹配,可以利用通配符*

  2. 查找大于10M的文件,示例代码:

    1
    find ~ -size +10M

    运行结果:

    1
    2
    /home/kaka/Desktop/apache-tomcat-8.5.81.tar
    /home/kaka/apache-tomcat-8.5.81.tar
  3. 查找小于1K的文件,示例代码:

    1
    find ~ -size -1k

    运行结果:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    /home/kaka/apache-tomcat-8.5.81/logs/manager.2022-07-04.log
    /home/kaka/apache-tomcat-8.5.81/logs/localhost_access_log.2022-07-04.txt
    /home/kaka/apache-tomcat-8.5.81/logs/manager.2022-07-03.log

    【部分运行结果略】

    /home/kaka/.cache/gdm/session.log.old
    /home/kaka/.cache/gdm/session.log
    /home/kaka/.cache/gnome-shell/update-check-3.28

    注意!命令中的k是小写的。

  4. 查找等于168k的,示例代码:

    1
    find ~ -size 168k

    运行结果:

    1
    2
    /home/kaka/web.xml
    /home/kaka/apache-tomcat-8.5.81/conf/web.xml

grep 和 |

grep:过滤查找。
|:管道符号,表示将前一个命令的运行结果输出传递给后面的命令处理。

grep命令的选项有:

  • -n:输出匹配行及行号。
  • -i:忽略大小写。

例如,查看文件中,含有"new"的行号以及内容,忽略大小写,示例代码:

1
cat A\ New\ Day\ Has\ Come.txt |grep -n -i new

运行结果:

1
2
3
4
5
6
7
8
9
1:A New Day Has Come
3:A New Day Has Come
15:I knew Id make it through
35:Let it shatter the walls for a new sun
37:A new day has come, oh
39:A New Day Has Come
63:Let it shatter the walls for a new sun

【部分运行结果略】

wc

wc:统计文件内容信息(包含行数、单词数、字节数)
常用参数:

  • -l:统计行数
  • -w:统计单词数
  • -c:统计字节数

举例:

  1. 统计行数,示例代码:
    1
    wc -l Milan\ Milan\ 米兰米兰.txt
    运行结果:
    1
    34 Milan Milan 米兰米兰.txt
  2. 统计单词数,示例代码:
    1
    wc -w Milan\ Milan\ 米兰米兰.txt
    运行结果:
    1
    121 Milan Milan 米兰米兰.txt
  3. 统计字节数,示例代码:
    1
    wc -c Milan\ Milan\ 米兰米兰.txt
    运行结果:
    1
    1113 Milan Milan 米兰米兰.txt
  4. 统计行数、字数和字节数,示例代码:
    1
    wc Milan\ Milan\ 米兰米兰.txt
    运行结果:
    1
    34  121 1113 Milan Milan 米兰米兰.txt
  5. grep结合,可以统计含有关键字的行数,例如可以用于分析日志中出现"ERROR"的行数。
    在这里,我们以Milan为例,示例代码:
    1
    grep Milan Milan\ Milan\ 米兰米兰.txt | wc -l
    运行结果:
    1
    10

压缩和解压

gzip gunzip

  • gzip:压缩文件,压缩后不会保留源文件。
  • gunzip:解压

举例:

  1. 压缩文件,示例代码:
    1
    2
    gzip A\ New\ Day\ Has\ Come.txt 
    ll
    运行结果:
    1
    2
    3
    4
    5
    6

    【部分运行结果略】

    -rw-rw-r--. 1 kaka kaka 1354 Jul 4 13:02 A New Day Has Come.txt.gz

    【部分运行结果略】
  2. 同时压缩两个文件。示例代码:
    1
    2
    gzip A\ New\ Day\ Has\ Come.txt Milan\ Milan\ 米兰米兰.txt 
    ll
    运行结果:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    【部分运行结果略】

    -rw-rw-r--. 1 kaka kaka 1354 Jul 4 13:02 A New Day Has Come.txt.gz

    【部分运行结果略】

    -rw-r--r--. 1 kaka kaka 625 Jul 3 03:47 Milan Milan 米兰米兰.txt.gz

    【部分运行结果略】
    解释说明:当gzip命令后面跟着两个操作对象的时候,两个操作对象都会被压缩。这一点不同于cpmv等命令(第一个是源,第二个是目标)。

zip unzip

基本用法

  • zip:压缩。
  • unzip:解压。

zipgzip的比较:

  1. 操作对象:
    zip至少需要两个操作对象,第一个操作对象是压缩文件的名字,之后的操作对象是被压缩文件。
    gzip可以只有一个操作对象,如果有多个操作对象,多个操作都会被压缩。
  2. 是否保留源文件:
    zip保留源文件。
    gzip不保留源文件。

举例:

  1. 如果只有一个操作对象的,会报错。示例代码:
    1
    zip A\ New\ Day\ Has\ Come.txt
    运行结果:
    1
    2
    3
    4
    5
    zip warning: missing end signature--probably not a zip file (did you
    zip warning: remember to use binary mode when you transferred it?)
    zip warning: (if you are trying to read a damaged archive try -F)

    zip error: Zip file structure invalid (A New Day Has Come.txt)
  2. 两个操作对象,第一个是压缩文件,第二个是被压缩文件。示例代码:
    1
    zip new.zip A\ New\ Day\ Has\ Come.txt
    运行结果:
    1
    updating: A New Day Has Come.txt (deflated 66%)
  3. 三个操作对象,第一个是压缩文件,之后的都是被压缩文件。示例代码:
    1
    zip n.zip A\ New\ Day\ Has\ Come.txt Milan\ Milan\ 米兰米兰.txt
    运行结果:
    1
    2
    adding: A New Day Has Come.txt (deflated 66%)
    adding: Milan Milan 米兰米兰.txt (deflated 48%)
  4. 如果被压缩对象是一个目录,加上-r。示例代码:
    1
    zip k.zip -r kafka_2.13-3.4.0

unzip命令只需要一个操作对象,被解压文件。

示例代码:

1
unzip tomcat.zip

运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
Archive:  tomcat.zip
creating: apache-tomcat-8.5.81/
inflating: apache-tomcat-8.5.81/RELEASE-NOTES
creating: apache-tomcat-8.5.81/bin/
inflating: apache-tomcat-8.5.81/bin/digest.sh
inflating: apache-tomcat-8.5.81/bin/startup.bat
inflating: apache-tomcat-8.5.81/bin/catalina.bat
inflating: apache-tomcat-8.5.81/bin/tomcat-native.tar.gz
inflating: apache-tomcat-8.5.81/bin/version.bat
inflating: apache-tomcat-8.5.81/bin/setclasspath.bat

【部分运行结果略】

选项

zip的常用选项:

  • -r:递归压缩,即压缩目录。

unizp的常用选项:

  • -d 目录:指定解压后文件的存放目录

举例:

  1. 利用-r,压缩目录,示例代码:

    1
    zip -r tomcat.zip apache-tomcat-8.5.81

    运行结果:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    adding: apache-tomcat-8.5.81/ (stored 0%)
    adding: apache-tomcat-8.5.81/RELEASE-NOTES (deflated 60%)
    adding: apache-tomcat-8.5.81/bin/ (stored 0%)

    【部分运行结果略】

    adding: apache-tomcat-8.5.81/conf/server.xml (deflated 66%)
    adding: apache-tomcat-8.5.81/conf/tomcat-users.xsd (deflated 67%)
    adding: apache-tomcat-8.5.81/LICENSE (deflated 75%)
  2. 解压文件到指定目录,示例代码:

    1
    unzip -d tomcat_un tomcat.zip

    运行结果:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Archive:  tomcat.zip
    creating: tomcat_un/apache-tomcat-8.5.81/
    inflating: tomcat_un/apache-tomcat-8.5.81/RELEASE-NOTES
    creating: tomcat_un/apache-tomcat-8.5.81/bin/
    inflating: tomcat_un/apache-tomcat-8.5.81/bin/digest.sh
    inflating: tomcat_un/apache-tomcat-8.5.81/bin/startup.bat
    inflating: tomcat_un/apache-tomcat-8.5.81/bin/catalina.bat
    inflating: tomcat_un/apache-tomcat-8.5.81/bin/tomcat-native.tar.gz
    inflating: tomcat_un/apache-tomcat-8.5.81/bin/version.bat

    【部分运行结果略】

    inflating: tomcat_un/apache-tomcat-8.5.81/conf/jaspic-providers.xml
    inflating: tomcat_un/apache-tomcat-8.5.81/conf/catalina.policy
    inflating: tomcat_un/apache-tomcat-8.5.81/conf/server.xml
    inflating: tomcat_un/apache-tomcat-8.5.81/conf/tomcat-users.xsd
    inflating: tomcat_un/apache-tomcat-8.5.81/LICENSE

    apache-tomcat-8.5.81tomcat_un的子文件夹,示例代码:

    1
    ll tomcat_un/

    运行结果:

    1
    drwxrwxr-x. 9 kaka kaka 4096 Jun 25 10:45 apache-tomcat-8.5.81

tar

tar,根据选项参数的不同,可以分别实现压缩和解压的功能。
常用选项:

  • -c生成.tar
  • -x解压.tar
  • -v显示详细信息
  • -z压缩
  • -f后面接着文件或目录(这也是为什么f必须在最后)。

常见用法:

  • 压缩:-cvzf
  • 解压:-xvzf

举例:

  1. 压缩多个文件,示例代码:

    1
    tar -cvzf a.tar A\ New\ Day\ Has\ Come.txt Milan\ Milan\ 米兰米兰.txt
  2. 压缩文件夹,示例代码:

    1
    tar -cvzf d.tar dir1/
  3. tar包解压到当前目录,示例代码:

    1
    tar -xvzf a.tar
  4. tar包解压到指定目录,示例代码:

    1
    tar -xvzf d.tar -C zhiDing/

    注意:

    • 需要基于参数-C
    • 指定解压到的那个目录,事先要存在,否则会报错。

用户、组和权限

用户管理

添加用户

命令:useradd
操作对象:用户名
常用选项:

  • -c,指定一段注释性描述。
  • -d,指定用户主目录(默认会在home目录下创建一个和用户名相同的目录)。
  • -g,添加用户时指定用户所属的用户组。

举例:

  1. 添加用户,示例代码:

    1
    useradd u1
  2. 给新创建的用户指定主目录,示例代码:

    1
    2
    useradd -d /home/uu/ u2 
    ll /home/

    运行结果:

    1
    2
    3
    4
    drwx------. 25 kaka kaka  4096 Jul  5 13:02 kaka
    drwx------. 2 root root 16384 Jun 23 07:41 lost+found
    drwx------. 2 u1 u1 4096 Jul 5 13:22 u1
    drwx------. 2 u2 u2 4096 Jul 5 13:24 uu
  3. 新增用户u1,同时指定组g1,示例代码:

    1
    useradd -g g1 u1

    在Linux中,每一个用户都必须有一个其所属的组。如果没有指定组,会自动会生成一个与用户名同名的工作组。

删除用户

userdel:删除用户。
操作对象:需要被删除的用户名。
参数:

  • -r:同时删除用户主目录,以及邮箱信息等。

举例:

  1. 删除用户u1,示例代码:
    1
    userdel u1
  2. 删除用户u2以及u2的主目录,示例代码:
    1
    userdel -r u2

有些资料建议删除用户的时候,不要加上-r,因为会把用户的主目录也删除。

我建议,加上-r,做好用户管理,不给以后留下"坑"。但在删除之前将用户目录中的内容备份。

修改用户

usermod,修改已有用户的信息。
操作对象:用户名
常用选项:

  • -c,指定一段注释性描述。
  • -d,指定用户主目录(默认会在home目录下创建一个和用户名相同的目录)。
  • -g,添加用户时指定用户所属的用户组。

修改用户u1ut组,示例代码:

1
usermod -g ut u1

密码管理

用户账号刚创建时没有密码,被系统锁定,无法使用,必须为其指定密码后才可以使用(此时由root用户指定密码)。

passwd指定用户密码或者修改用户密码。

操作对象:被修改密码的用户(如不写,则默认当前用户)。
常用选项:

  • -l:锁定密码,即禁用账号。
  • -u:密码解锁。
  • -d:删除密码,使账号无密码,也无法登录。
  • -f:强迫用户下次登录时修改密码。

输入密码

用户信息

  • whoami:查看当前系统当前账号的用户名。
  • who:查看当前所有登录系统的用户信息。
  • id:查询用户信息。

举例:

  1. 查看kaka用户的信息,示例代码:
    1
    id kaka
    运行结果:
    1
    uid=1000(kaka) gid=1000(kaka) groups=1000(kaka),10(wheel)
  2. 查询root用户的信息,示例代码:
    1
    id root
    运行结果:
    1
    uid=0(root) gid=0(root) groups=0(root)

切换用户

su:切换用户。
当需要返回到原来用户时,使用exit命令。

注意:从权限高的用户切换到权限低的用户,不需要输入密码,反之需要。

还要一个命令sudo,临时权限提升,以root身份来执行之后的命令。与su的区别在于:

  • su是身份完全转变
  • sudo是普通用户临时转变成root用户来执行命令,该命令执行完,仍为普通用户。

增加组

groupadd:增加组。

示例代码:

1
groupadd g1

删除组

groupdel:删除组。
示例代码:

1
groupdel g1

修改组

groupmod:修改组。
常用选项:

  • -n:将用户组的名字改为新名字。

将组g1重命名为newG,示例代码:

1
groupmod -n newG g1

查看用户的组

groups:查看用户的组。
操作对象:用户名(默认查看当前用户的组)

举例:

  1. 查看当前用户所在的组,示例代码:
    1
    groups
    运行结果:
    1
    root
  2. 查看指定用户所在的组,示例代码:
    1
    groups u1
    运行结果:
    1
    u1 : u1

权限管理

访问者类型

如果要讨论权限,就必须先梳理清楚Linux中的访问者类型:

  1. 所有者
    默认是文件的创建者,谁创建了该文件,就是该文件的所有者。
  2. 所属组
    默认所有者所在的组,就是所属组。
  3. 其他
    除文件的所有者和所属组的用户外的其它用户.

权限

示例代码:

1
ll startup.sh

运行结果:

1
-rwxr-x---. 1 kaka kaka 1904 Jun  9 05:30 startup.sh

说明

我们重点讨论一下-rwxr-x---部分。

  • 第0位表示文件类型:
    • b:块设备,例如:硬盘。
    • c:字符设备,例如:键盘、鼠标、显示器等。
    • d:目录文件。
    • l:链接文件。
    • s:套接字文件,用于进程之间的通信。
    • -:普通文件。
  • 第1-3位表示所有者拥有该文件的权限。
  • 第4-6位表示所属组拥有该文件的权限。
  • 第7-9位表示其他用户拥有该文件的权限。

我们看到权限写的是rwx,解释一下:

  • r:read
    • 对文件而言,具有读取文件内容的权限。
    • 对目录来说,具有浏览该目录信息的权限。
  • w:write
    • 对文件而言,具有修改文件内容的权限。注意,是可以修改文件内容,不代表可以删除该文件,删除文件的条件是对该文件所在的目录有写权限。
    • 对目录来说具有删除、移动目录内文件的权限。
  • x:execute
    • 对文件而言,具有执行文件的权限。
    • 对目录来说,具有进入目录的权限。
  • -:不具有该权限。

在上例中,我们看到权限部分写的是-rwxr-x---

  • 第0位,-:普通文件。
  • 第1-3位,rwx:对于所有者,可读,可写,可执行。
  • 第4-6位,r-x:对于所属组,可读,可执行,不可写。
  • 第7-9位,---:对于其他,不可读,不可写,不可执行。

修改权限

只有文件的拥有者和root用户才可以修改文件的权限。

chmod,修改文件或者目录的权限。
常用选项:

  • -R:如果是目录,则使其下所有子文件或目录都生效。

有两种方式:

  1. 通过=+-
  2. 通过数字

通过=、+、-

规则:

  • u,所有者
  • g:所属组
  • o;其他
  • a:所有用户(ugo的总和)(默认为所有用户)

举例:

  1. 对于所有者赋予rwx,对于所属组赋予rx,对于其他用户赋予x。示例代码:
    1
    2
    chmod u=rwx,g=rx,o=x startup.sh 
    ll startup.sh
    运行结果:
    1
    -rwxr-x--x. 1 kaka kaka 1904 Jun  9 05:30 startup.sh
  2. 为所属组,增加w的权限。示例代码:
    1
    2
    chmod g+w startup.sh
    ll startup.sh
    运行结果:
    1
    -rwxrwx--x. 1 kaka kaka 1904 Jun  9 05:30 startup.sh
  3. 为所有人,去除x的权限。示例代码:
    1
    2
    chmod a-x startup.sh 
    ll startup.sh
    运行结果:
    1
    -rw-rw----. 1 kaka kaka 1904 Jun  9 05:30 startup.sh

通过数字变更权限

规则:

  • r=4
  • w=2
  • x=1

所以,有:

权限 数字
r 4
w 2
x 1
r w 6
r x 5
w x 3
r w x 7
- - - 0

chmod 751就相当于上文的chmod u=rwx,g=rx,o=x

示例代码:

1
2
chmod 777 startup.sh 
ll startup.sh

运行结果:

1
-rwxrwxrwx. 1 kaka kaka 1904 Jun  9 05:30 startup.sh

修改所有者

只有root用户才可以修改文件所有者。

chown,修改文件的所有者。
常用选项:

  • -R:如果是目录,则使其下所有子文件或目录都生效。

举例:

  1. 修改目录u1机器所有的子文件或目录,所有者为root
    查看原始的所有者,示例代码:
    1
    ll u1
    运行结果:
    1
    drwx------ 2 u1 u1 4096 Jul  7 14:32 u1
    修改所有者为root,示例代码:
    1
    2
    chown root -R u1
    ll
    运行结果:
    1
    drwx------ 2 root u1 4096 Jul  7 14:32 u1
  2. 修改所有者的同时,修改所属组。
    修改目录u1的所有者为uu,所属组为root。示例代码:
    1
    2
    chown uu:root u1
    ll
    运行结果:
    1
    drwx------ 2 uu root 4096 Jul  7 14:32 u1

修改所属组

chgrp,修改文件或目录的所属组
常用选项:

  • -R:如果是目录,则使其下所有子文件或目录都生效。

配置文件

最后,我们讨论三个配置文件:

  1. /etc/passwd
  2. /etc/shadow
  3. /etc/group

/etc/passwd,用户的配置文件,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
root:x:0:0:root:/root:/bin/bash
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

【部分内容略】

postfix:x:89:89::/var/spool/postfix:/sbin/nologin
oprofile:x:16:16:Special user account to be used by OProfile:/var/lib/oprofile:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
kaka:x:1000:1000:Kaka Wan Yifan:/home/kaka:/bin/bash
u1:x:1001:1002::/home/u1:/bin/bash

含义:用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell

/etc/shadow,口令的配置文件,内容如下:

运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
root:76SaZUF4ETOd.::0:99999:7:::
bin:*:18353:0:99999:7:::
daemon:*:18353:0:99999:7:::
adm:*:18353:0:99999:7:::
lp:*:18353:0:99999:7:::

【部分内容略】

postfix:!!:19165::::::
oprofile:!!:19165::::::
tcpdump:!!:19165::::::
kaka:76SaZUF4ETOd.::0:99999:7:::
u1:!!:19179:0:99999:7:::

含义:登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志

/etc/group,组的配置文件,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:

【部分内容略】

oprofile:x:16:
tcpdump:x:72:
kaka:x:1000:kaka
g1:x:1001:
ut:x:1002:

含义:组名:口令:组标识号:组内用户列表

定时任务

命令

crontab,时程表。
常用选项:

  • -u:指定用户的时程表,默认当前用户。
  • -e:编辑时程表
  • -l:查看时程表
  • -r:删除时程表

开始

步骤:

  1. 编辑时程表,crontab –e
  2. 添加如下内容:
    1
    * * * * * date >> /tmp/d.txt
  3. 保存并退出

我们可以通过tail -10f /tmp/d.log查看一下,每分钟都会执行一次。

1
2
3
4
5
tail -100f /tmp/d.log 
Thu Jul 7 21:53:01 CST 2022
Thu Jul 7 21:54:01 CST 2022
Thu Jul 7 21:55:01 CST 2022
Thu Jul 7 21:56:01 CST 2022

Linux中的cron

解释一下调度文件的* * * * *,从左到右,分别是:

  1. 分钟,取值[0,59][0,59]
  2. 小时,取值[0,23][0,23]
  3. 日期:取值[1,31][1,31]
  4. 月份:取值[1,12][1,12]
  5. 星期:取值[0,7][0,7]0077都代表星期天

还有一些特殊字符。

特殊字符 含义 示例
* 所有可能的值 在月域中,*表示每个月;在星期域中,*表示星期的每一天。
, 列出枚举值 在分钟域中,5,20表示分别在5分钟和20分钟触发一次。
- 范围 在分钟域中,5-20表示从5分钟到20分钟之间每隔一分钟触发一次。
/ 指定数值的增量 在分钟域中,0/15表示从第0分钟开始,每15分钟,3/20表示从第3分钟开始,每20分钟。

举例

  1. 每天6时0分,执行sh start.sh
    1
    0 6 * * * sh start.sh
  2. 在12月, 每天的6点12点,每隔3个小时,在0分钟执行一次/usr/bin/backup
    1
    0 6-12/3 * 12 * /usr/bin/backup
  3. 周一到周五每天17时,执行sh stop.sh
    1
    0 17 * * 1-5 sh stop.sh
  4. 每天的0时20分、2时20分、4时20分等,执行echo "haha"
    1
    20 0-23/2 * * * echo "haha"
  5. 每两个小时重启一次服务mysqld
    1
    0 */2 * * * systemctl restart mysqld.service
  6. 每天7时50分,开启ssh服务:
    1
    50 7 * * * /sbin/service sshd start
  7. 每天22时50分,关闭ssh服务:
    1
    50 22 * * * /sbin/service sshd stop
  8. 每小时的第一分执行ll
    1
    1 * * * * ll
  9. 每周一至周五3时,在目录/home中,查找文件名为*.xxx的文件,并删除4天前的,可以用于定时清理日志。
    1
    00 03 * * 1-5 find /home "*.xxx" -mtime +4 -exec rm {} \;

注意!我们特别强调了,是在Linux中的cron,对于其他场景的cron,可能会不一样,比如"Quartz中的cron"。

关于"Quartz中的cron",可以参考《基于Java的后端开发入门:19.Quartz和APScheduler》

权限

一般任何用户都可以创建自己的计划任务。
但root用户可以通过配置来设置某些用户不允许设置计划任务,配置文件位于/etc/cron.deny,在该文件中写用户名,一行一个。

磁盘

du

du:查看文件和目录占用的磁盘空间。
操作对象:文件或目录,默认当前目录。
常用选项:

  • -h:以较易阅读的方式表示文件大小
  • -a:不仅查看子目录大小,还要包括文件
  • -c:显示所有的文件和子目录大小后,显示总和
  • -s:只显示总和

举例:

  1. 查看当前目录,示例代码:
    1
    du -sh
    运行结果:
    1
    108M
  2. 查看指定目录,示例代码:
    1
    du -sh apache-tomcat-8.5.81
    运行结果:
    1
    17M     apache-tomcat-8.5.81

ls -lh

除了du,还有一个命令也可以查看文件和目录占用的磁盘空间,ls -lh。但是在统计口径上,存在区别。ls -lh不会统计子目录的大小。

例如:

  1. du -sh,示例代码:
    示例代码:
    1
    du -sh
    运行结果:
    1
    108M    .
  2. ls -lh,示例代码:
    1
    ls -lh
    运行结果:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    total 36M
    4.0K -rw-rw-r--. 1 kaka kaka 2.7K Jul 3 09:08 111.txt
    4.0K -rw-rw-r--. 1 kaka kaka 439 Jul 4 13:23 123.txt
    4.0K -rw-rw-r--. 1 kaka kaka 430 Jul 4 13:23 -123.txt
    4.0K -rw-rw-r--. 1 kaka kaka 370 Jul 1 20:02 123.txt
    4.0K -rw-rw-r--. 1 kaka kaka 2.7K Jul 4 13:06 222.txt
    4.0K -rw-rw-r--. 1 kaka kaka 3.8K Jul 4 13:02 A New Day Has Come.txt
    4.0K drwxrwxr-x. 9 kaka kaka 4.0K Jun 25 10:45 apache-tomcat-8.5.81
    15M -rw-r--r--. 1 kaka kaka 15M Jun 25 10:44 apache-tomcat-8.5.81.tar

    【部分运行结果略】

df

df:查看磁盘空间使用情况。
常用选项:

  • -h: 以较易阅读的方式表示磁盘空间占用

示例代码:

1
df -h

运行结果:

1
2
3
4
5
6
7
8
9
10
Filesystem                    Size  Used Avail Use% Mounted on
devtmpfs 901M 0 901M 0% /dev
tmpfs 917M 0 917M 0% /dev/shm
tmpfs 917M 26M 892M 3% /run
tmpfs 917M 0 917M 0% /sys/fs/cgroup
/dev/mapper/VolGroup-lv_root 50G 5.1G 42G 11% /
/dev/sda1 477M 208M 241M 47% /boot
/dev/mapper/VolGroup-lv_home 12G 148M 11G 2% /home
iCloud 932G 598G 335G 65% /media/psf/iCloud
tmpfs 184M 48K 184M 1% /run/user/1000

解释说明:

  • Mounted on:/boot,这是引导分区。
    • 所属的文件系统是在/dev设备目录下。
  • Filesystem:tmpfs,基于内存的文件系统
    • Mounted on:/dev/shmshm的含义是Shared-Memory,共享内容。
    • Mounted on:/run:运行时
  • Filesystem:devtmpfs:Linux内核启动时候的挂载点

free

free,看内存的使用情况。
常用选项:

  • -h: 以较易阅读的方式表示磁盘空间占用

示例代码:

1
free -h

运行结果:

1
2
3
              total        used        free      shared  buff/cache   available
Mem: 1.8G 853M 285M 24M 694M 783M
Swap: 2.0G 3.0M 2.0G

lsblk

lsblk:查看设备挂载情况。
常用选项:

  • -f:查看详细的设备挂载情况。

示例代码:

1
lsblk

运行结果:

1
2
3
4
5
6
7
8
9
NAME                 MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda 8:0 0 64G 0 disk
├─sda1 8:1 0 500M 0 part /boot
└─sda2 8:2 0 63.5G 0 part
├─VolGroup-lv_root 253:0 0 50G 0 lvm /
├─VolGroup-lv_swap 253:1 0 2G 0 lvm [SWAP]
└─VolGroup-lv_home 253:2 0 11.6G 0 lvm /home
sr0 11:0 1 1024M 0 rom
sr1 11:1 1 1024M 0 rom

网络

ifconfig

ifconfig:显示所有网络接口的配置信息。

示例代码:

1
ifconfig

运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
inet 10.211.55.12 netmask 255.255.255.0 broadcast 10.211.55.255
inet6 fdb2:2c26:f4e4:0:21c:42ff:feeb:31ea prefixlen 64 scopeid 0x0<global>
inet6 fe80::21c:42ff:feeb:31ea prefixlen 64 scopeid 0x20<link>
ether 00:1c:42:eb:31:ea txqueuelen 1000 (Ethernet)
RX packets 43400 bytes 14363959 (13.6 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 24286 bytes 4139577 (3.9 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 2165 bytes 231262 (225.8 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2165 bytes 231262 (225.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:29:08:95 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

hosts

hosts文件位于/etc/hosts,我们可以通过VIM修改该文件。

有些资料说,重启网卡后才会生效,在我的实际测试中,修改后会立即成效。

ping

ping:测试主机之间网络连通性。

示例代码:

1
ping kakawanyifan.com

运行结果:

1
2
3
4
PING kakawanyifan.com (218.91.183.91) 56(84) bytes of data.
64 bytes from kakawanyifan.com (218.91.183.91): icmp_seq=1 ttl=128 time=13.3 ms
64 bytes from kakawanyifan.com (218.91.183.91): icmp_seq=2 ttl=128 time=16.7 ms
64 bytes from kakawanyifan.com (218.91.183.91): icmp_seq=3 ttl=128 time=28.5 ms

如果ping不通,不一定是网络问题,可能是目标机器禁ping了。

telnet

telnet:测试目标机器的端口是否开启。

举例:

  1. 测试kakawanyifan.com的443是否开启
    示例代码:
    1
    telnet kakawanyifan.com 443
    运行结果:
    1
    2
    3
    Trying 218.91.183.91...
    Connected to kakawanyifan.com.
    Escape character is '^]'.
    解释说明:Connected to kakawanyifan.com.,说明开启了。
  2. 测试kakawanyifan.com的3306是否开启
    示例代码:
    1
    telnet kakawanyifan.com 3306
    运行结果:
    1
    Trying 218.91.183.91...
    解释说明:一直在Trying 218.91.183.91...,说明没有开启。

telnet,一般需要我们额外安装,可以通过yum安装,方法如下:

1
yum install telnet telnet-server

curl

curl:发送网络请求,打印返回。

简单使用

示例代码:

1
curl kakawanyifan.com

运行结果:

1
2
3
4
5
6
7
8
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
<head><title>301 Moved Permanently</title></head>
<body>
<h1>301 Moved Permanently</h1>
<p>The requested resource has been assigned a new permanent URI.</p>
<hr/>Powered by Tengine</body>
</html>

自动跳转

-L,自动跳转到新的网址。

示例代码:

1
curl -L kakawanyifan.com

查看头信息

-i,查看响应的头信息,也查看响应体。
-I,只查看响应的头信息。

举例:

  1. -i,示例代码:
    1
    curl -i kakawanyifan.com
    运行结果:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    HTTP/1.1 301 Moved Permanently
    Server: Tengine
    Date: Sat, 09 Jul 2022 14:21:14 GMT
    Content-Type: text/html
    Content-Length: 262
    Connection: keep-alive
    Location: https://kakawanyifan.com/
    Via: cache62.cn4056[,0]
    Timing-Allow-Origin: *
    EagleId: 088432ca16573764746903823e

    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <html>
    <head><title>301 Moved Permanently</title></head>
    <body>
    <h1>301 Moved Permanently</h1>
    <p>The requested resource has been assigned a new permanent URI.</p>
    <hr/>Powered by Tengine</body>
    </html>
  2. -I,示例代码:
    1
    curl -I kakawanyifan.com
    运行结果:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    HTTP/1.1 301 Moved Permanently
    Server: Tengine
    Date: Sat, 09 Jul 2022 14:23:22 GMT
    Content-Type: text/html
    Content-Length: 262
    Connection: keep-alive
    Location: https://kakawanyifan.com/
    Via: cache65.cn4056[,0]
    Timing-Allow-Origin: *
    EagleId: 088432cd16573766029225411e

查看通信过程

-v,查看通信过程。

示例代码:

1
curl -v -L kakawanyifan.com

运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
* About to connect() to kakawanyifan.com port 80 (#0)
* Trying 218.91.183.91...
* Connected to kakawanyifan.com (218.91.183.91) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: kakawanyifan.com
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Server: Tengine
< Date: Sat, 09 Jul 2022 14:29:22 GMT
< Content-Type: text/html
< Content-Length: 262
< Connection: keep-alive
< Location: https://kakawanyifan.com/
< Via: cache56.cn4056[,0]
< Timing-Allow-Origin: *
< EagleId: 088432c416573769621968097e
<
* Ignoring the response-body
* Connection #0 to host kakawanyifan.com left intact
* Issue another request to this URL: 'https://kakawanyifan.com/'
* Found bundle for host kakawanyifan.com: 0x1aafee0
* About to connect() to kakawanyifan.com port 443 (#1)
* Trying 218.91.183.91...
* Connected to kakawanyifan.com (218.91.183.91) port 443 (#1)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* CAfile: /etc/pki/tls/certs/ca-bundle.crt
CApath: none
* SSL connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
* Server certificate:
* subject: CN=kakawanyifan.com
* start date: Mar 13 00:00:00 2022 GMT
* expire date: Mar 14 23:59:59 2023 GMT
* common name: kakawanyifan.com
* issuer: CN=Encryption Everywhere DV TLS CA - G1,OU=www.digicert.com,O=DigiCert Inc,C=US
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: kakawanyifan.com
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: Tengine
< Content-Type: text/html; charset=utf-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< Vary: Accept-Encoding
< Strict-Transport-Security: max-age=5184000
< Date: Sat, 09 Jul 2022 14:17:14 GMT
< Vary: Accept-Encoding
< x-oss-request-id: 62C98DEA8E9753363080AD93
< x-oss-cdn-auth: success
< ETag: "0036CC5761D566E799858B57C3A5DADF"
< Last-Modified: Sat, 09 Jul 2022 11:11:57 GMT
< x-oss-object-type: Normal
< x-oss-hash-crc64ecma: 6015530141356455589
< x-oss-storage-class: Standard
< Content-MD5: ADbMV2HVZueZhYtXw6Xa3w==
< x-oss-server-time: 68
< Ali-Swift-Global-Savetime: 1657376234
< Via: cache24.l2et15-1[133,134,200-0,M], cache26.l2et15-1[135,0], cache27.cn4056[0,0,200-0,H], cache69.cn4056[3,0]
< Age: 728
< X-Cache: HIT TCP_MEM_HIT dirn:0:985810031
< X-Swift-SaveTime: Sat, 09 Jul 2022 14:17:14 GMT
< X-Swift-CacheTime: 1111
< Timing-Allow-Origin: *
< EagleId: 088432d116573769624151871e

【部分运行结果略】

解释说明:在收到301的响应码之后,立即发起了新的请求,即在客户端完成了重定向。

发送表单信息

发送表单信息,需要依赖两个参数:

  • -X,设置HTTP动词,默认是GET。
  • --date,设置表单内容。

示例代码:

1
curl -X POST http://localhost:8080/web_demo_war/request --data 'ch=中文'

发送二进制文件

--data-binary,表明是二进制文件。

示例代码:

1
curl - X POST 'http://localhost:8080/web_demo_war/request' --data-binary '@/Users/kaka/Downloads/jpg.jpg'

--cookie:设置cookie。

例如:--cookie "name=xxx"

--header,设置头信息。

例如:--header "Content-Type:application/json"

进程

ps

ps:查看进程状态。
该命令有两种风格的选项:一种是上文的"UNIX/LINUX"风格,带有-的;还有一种是BSD风格的,不带-

常用选项:

  • -e,列出所有进程。
  • -f,显示完整格式的进程列表。

BSD风格的选项:

  • a,列出带有终端的所有用户的进程。
  • x,列出当前用户的所有进程,包括没有终端的进程。
  • u,面向用户友好的显示风格。

举例:

  1. ps -ef,示例代码:

    1
    ps -ef

    运行结果:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    UID        PID  PPID  C STIME TTY          TIME CMD
    root 1 0 0 00:43 ? 00:00:06 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
    root 2 0 0 00:43 ? 00:00:00 [kthreadd]
    root 4 2 0 00:43 ? 00:00:00 [kworker/0:0H]

    【部分运行结果略】

    root 31816 2 0 08:03 ? 00:00:00 [kworker/0:0]
    root 31836 1036 0 08:03 ? 00:00:00 sleep 60
    kaka 32009 29922 0 08:04 pts/0 00:00:00 ps -ef

    解释说明:

    • UID,用户ID
    • PID,进程ID
    • PPID,父进程ID
    • C,CPU用于计算执行优先级的因子,数值越小越优先。数值大,说明进程是CPU密集型运算,执行优先级会降低;数值小,说明进程是I/O密集型运算,执行优先级会提高
    • STIME:进程启动的时间
    • TTY:完整的终端名称。在CentOS中:
      • tty1是图形化终端
      • tty2-tty6是本地的字符界面终端
      • pts/0-255是远程终端
    • TIME:CPU时间
    • CMD:启动进程所用的命令和参数
  2. 在实际中,常和grep配合使用,用于快速找到相关进程。
    示例代码:

    1
    ps -ef|grep tomcat

    运行结果:

    1
    2
    kaka      4738     1  0 00:49 ?        00:01:14 /usr/bin/java -Djava.util.logging.config.file=/home/kaka/apache-tomcat-8.5.81/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /home/kaka/apache-tomcat-8.5.81/bin/bootstrap.jar:/home/kaka/apache-tomcat-8.5.81/bin/tomcat-juli.jar -Dcatalina.base=/home/kaka/apache-tomcat-8.5.81 -Dcatalina.home=/home/kaka/apache-tomcat-8.5.81 -Djava.io.tmpdir=/home/kaka/apache-tomcat-8.5.81/temp org.apache.catalina.startup.Bootstrap start
    kaka 5696 5616 0 08:31 pts/0 00:00:00 grep --color=auto tomcat
  3. ps axu,示例代码:

    1
    ps axu

    运行结果:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root 1 0.0 0.3 128824 7460 ? Ss 00:43 0:06 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
    root 2 0.0 0.0 0 0 ? S 00:43 0:00 [kthreadd]
    root 4 0.0 0.0 0 0 ? S< 00:43 0:00 [kworker/0:0H]

    【部分运行结果略】

    root 31328 0.0 0.0 0 0 ? S 08:01 0:00 [kworker/u64:0]
    root 31816 0.0 0.0 0 0 ? S 08:03 0:00 [kworker/0:0]
    root 32353 0.0 0.0 0 0 ? S 08:06 0:00 [kworker/u64:1]

    解释说明:

    • USER,该进程是由哪个用户产生的
    • PID,进程的ID号
    • %CPU,该进程占用CPU资源的百分比
    • %MEM,该进程占用物理内存的百分比
    • VSZ:该进程占用虚拟内存的大小,单位KB
    • RSS:该进程占用实际物理内存的大小,单位KB
    • TTY:该进程是在哪个终端中运行的。
    • STAT:进程状态。常见的状态有:R运行状态、S睡眠状态、T暂停状态、Z僵尸状态、s包含子进程、l多线程、+前台显示
    • START:该进程的启动时间
    • TIME:该进程占用CPU的运算时间
    • COMMAND:产生此进程的命令名

kill、killall

kill:根据进程号杀死进程。
操作对象:进程号
常用选项:

  • -9,强迫进程立即停止。

killall:根据进程名称杀死进程,支持通配符(在系统因负载过大而变得很慢时有用)
操作对象:进程名
常用选项:

  • -9,强迫进程立即停止。

举例,踢掉某个非法登录用户,步骤如下:

  1. 找到相关进程,示例代码:
    1
    ps -ef|grep sshd
    运行结果:
    1
    2
    3
    4
    5
    6
    7
    8
    root      1830     1  0 12:47 ?        00:00:00 /usr/sbin/sshd -D
    root 5559 1830 0 20:33 ? 00:00:00 sshd: kaka [priv]
    kaka 5614 5559 0 20:34 ? 00:00:00 sshd: kaka@pts/0
    root 7842 1830 0 20:39 ? 00:00:00 sshd: kaka [priv]
    kaka 7900 7842 0 20:40 ? 00:00:00 sshd: kaka@pts/1
    root 7983 1830 0 20:40 ? 00:00:00 sshd: kaka [priv]
    kaka 8061 7983 0 20:40 ? 00:00:00 sshd: kaka@pts/2
    root 8262 8167 0 20:41 pts/1 00:00:00 grep --color=auto sshd
  2. 假设kaka@pts/2是非法登录,KILL相关进程,示例代码:
    1
    kill 8061

pstree

pstree,查看进程树。
常用选项:

  • -p,显示进程的PID
  • -u,显示进程的所属用户

示例代码:

1
pstree -p

运行结果:

1
2
3
4
5
6
7
8
9
10
11
systemd(1)─┬─NetworkManager(1168)─┬─dhclient(7395)
│ ├─{NetworkManager}(1184)
│ └─{NetworkManager}(1188)
├─abrt-watch-log(974)
├─abrt-watch-log(985)
├─abrtd(961)
├─accounts-daemon(948)─┬─{accounts-daemon}(952)
│ └─{accounts-daemon}(960)
├─at-spi-bus-laun(3092)─┬─dbus-daemon(3097)───{dbus-daemon}(3098)

【部分运行结果略】

top

top,实时监控系统进程状态(动态显示)。

示例代码:

1
top

运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
top - 20:54:39 up  8:06,  3 users,  load average: 0.14, 0.06, 0.06
Tasks: 215 total, 1 running, 214 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.7 us, 1.0 sy, 0.0 ni, 98.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1877316 total, 347176 free, 802392 used, 727748 buff/cache
KiB Swap: 2064380 total, 2064380 free, 0 used. 908552 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1899 root 20 0 293428 37308 5368 S 1.3 2.0 5:35.54 X
3477 kaka 20 0 820056 16328 9248 S 1.0 0.9 5:06.70 prlcc
1303 root 20 0 313820 604 440 S 0.3 0.0 0:12.41 prltoolsd
1832 root 20 0 202724 5284 3640 S 0.3 0.3 0:34.22 cupsd
1834 root 20 0 583956 19768 6712 S 0.3 1.1 0:05.25 tuned
3340 kaka 20 0 799244 17584 9640 S 0.3 0.9 0:05.24 gsd-color
1 root 20 0 128824 7460 4216 S 0.0 0.4 0:07.56 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.03 kthreadd
4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
6 root 20 0 0 0 0 S 0.0 0.0 0:00.19 ksoftirqd/0

【部分运行结果略】

解释说明:

  • PID,进程ID
  • USER,该进程对应的用户
  • PR,优先级
  • VIRT,虚拟内存
  • RES,常驻内存
  • SHR,共享内存
  • S,进程的状态
  • %CPU,表示CPU的占用百分比
  • %MEM,表示内存的占用百分比
  • TIME+,执行的时间
  • COMMAND,进程的名称或者路径;

常用选项:

  • -d,后接秒数,指定每隔几秒更新(默认3秒)
  • -i,不显示任何闲置或者僵死进程。
  • -p,后接进程PID,监控指定的进程。

常用操作:

  • P,以CPU使用率排序(默认)
  • M,以内存的使用率排序
  • N,以PID排序
  • q,退出

netstat

netstat:显示网络状态和端口占用信息。

常用选项:

  • -a,查看所有正在监听和未监听的套接字(socket)
  • -n,不显示别名,能显示数字的全部转化成数字
  • -l,仅列出在监听的服务状态
  • -p,查看在调用的进程

常见用法:

  • netstat -anp | grep 进程号:查看该进程网络信息
  • netstat –nlp | grep 端口号:查看网络端口号占用情况

举例:

  1. 查看某个进程的网络信息。
    我们先找到相关进程(Tomcat),示例代码:

    1
    ps -ef|grep tomcat

    运行结果:

    1
    2
    kaka      4738     1  0 01:05 ?        00:01:22 /usr/bin/java -Djava.util.logging.config.file=/home/kaka/apache-tomcat-8.5.81/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /home/kaka/apache-tomcat-8.5.81/bin/bootstrap.jar:/home/kaka/apache-tomcat-8.5.81/bin/tomcat-juli.jar -Dcatalina.base=/home/kaka/apache-tomcat-8.5.81 -Dcatalina.home=/home/kaka/apache-tomcat-8.5.81 -Djava.io.tmpdir=/home/kaka/apache-tomcat-8.5.81/temp org.apache.catalina.startup.Bootstrap start
    kaka 17783 16432 0 09:35 pts/1 00:00:00 grep --color=auto tomcat

    查看该进程的网络信息,示例代码:

    1
    netstat -anp|grep 4738

    运行结果:

    1
    2
    3
    4
    5
    6
    7
    8
    (Not all processes could be identified, non-owned process info
    will not be shown, you would have to be root to see it all.)
    tcp6 0 0 127.0.0.1:8005 :::* LISTEN 4738/java
    tcp6 0 0 :::8080 :::* LISTEN 4738/java
    unix 3 [ ] STREAM CONNECTED 473836 3129/gnome-shell
    unix 2 [ ] STREAM CONNECTED 42120 4738/java
    unix 3 [ ] STREAM CONNECTED 473837 3158/ibus-daemon @/tmp/dbus-WsHjRWKu
    unix 2 [ ] STREAM CONNECTED 42123 4738/java
  2. 查看网络端口号占用情况,示例代码:

    1
    netstat -nlp|grep 8080

    运行结果:

    1
    2
    3
    (Not all processes could be identified, non-owned process info
    will not be shown, you would have to be root to see it all.)
    tcp6 0 0 :::8080 :::* LISTEN 4738/java

    查看相关进程

    1
    ls -lt /proc/4738
    • ls -lt /proc/4738,这个命令也印证了一切皆文件。

服务

区别

一个正在执行的程序或命令,被称为进程(process)。
启动之后一直存在,常驻内存的进程,被称作服务(service)。即服务是特殊的,生命周期很长的,特殊进程。

systemctl服务管理

启动服务、停止服务、重启服务和查看服务状态:

1
systemctl start | stop | restart | status 服务名

举例:

  1. 查看防火墙服务的状态,示例代码:
    1
    systemctl status firewalld
    运行结果:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ● firewalld.service - firewalld - dynamic firewall daemon
    Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
    Active: active (running) since Sun 2022-07-10 07:29:22 CST; 6 days ago
    Docs: man:firewalld(1)
    Main PID: 1027 (firewalld)
    Tasks: 2
    CGroup: /system.slice/firewalld.service
    └─1027 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid

    Jul 10 07:29:22 localhost.localdomain systemd[1]: Starting firewalld - dynamic firewall daemon...
    Jul 10 07:29:22 localhost.localdomain systemd[1]: Started firewalld - dynamic firewall daemon.
    Jul 10 07:29:22 localhost.localdomain firewalld[1027]: WARNING: AllowZoneDrifting is enabled. This is considered an insecure configuration option. It will be removed in a future release. Please c...bling it now.
    Hint: Some lines were ellipsized, use -l to show in full.
  2. 停止防火墙服务,示例代码:
    1
    systemctl stop firewalld
  3. 启动防火墙服务,示例代码:
    1
    systemctl start firewalld
  4. 重启防火墙服务,示例代码:
    1
    systemctl restart firewalld

特别的,我们可以通过/usr/lib/systemd/system,查看系统的服务(非所有)。示例代码:

1
ls /usr/lib/systemd/system

运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
abrt-ccpp.service                        firewalld.service                      multi-user.target.wants             rhel-import-state.service                      systemd-fsck-root.service
abrtd.service firstboot-graphical.service ndctl-monitor.service rhel-loadmodules.service systemd-fsck@.service
abrt-oops.service flatpak-system-helper.service netcf-transaction.service rhel-readonly.service systemd-halt.service
abrt-pstoreoops.service fprintd.service NetworkManager-dispatcher.service rngd.service systemd-hibernate-resume@.service
abrt-vmcore.service fstrim.service NetworkManager.service rpcbind.service systemd-hibernate.service

【部分运行结果略】

ebtables.service mdmon@.service rhel-autorelabel-mark.service systemd-ask-password-wall.service virtlogd.socket
emergency.service messagebus.service rhel-autorelabel.service systemd-backlight@.service virt-who.service
emergency.target microcode.service rhel-configure.service systemd-binfmt.service wacom-inputattach@.service
fcoe.service multipathd.service rhel-dmesg.service systemd-bootchart.service wpa_supplicant.service
final.target multi-user.target rhel-domainname.service systemd-firstboot.service zram.service

解释说明:.service,服务;.target,一组服务的集合。

systemctl设置服务自启

常见用法:

  • systemctl is-enabled 服务名,查看某一个服务的开机启动状态
  • systemctl disable 服务名,关闭指定服务的自动启动
  • systemctl enable 服务名,开启指定服务的自动启动
  • systemctl list-unit-files,查看所有服务的开机启动状态

举例:

  1. 查看防火墙服务的开机启动状态,示例代码:
    1
    systemctl is-enabled firewalld
    运行结果:
    1
    enabled
  2. 关闭防火墙服务的开机启动,示例代码:
    1
    systemctl disable firewalld
  3. 开启防火墙服务的开机启动,示例代码:
    1
    systemctl enable firewalld
  4. 查看所有服务的开机启动状态,示例代码:
    1
    systemctl list-unit-files
    运行结果:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    UNIT FILE                                     STATE   
    proc-sys-fs-binfmt_misc.automount static
    dev-hugepages.mount static
    dev-mqueue.mount static
    proc-fs-nfsd.mount static
    proc-sys-fs-binfmt_misc.mount static
    sys-fs-fuse-connections.mount static
    sys-kernel-config.mount static
    sys-kernel-debug.mount static
    tmp.mount disabled
    var-lib-nfs-rpc_pipefs.mount static
    brandbot.path disabled
    cups.path enabled
    systemd-ask-password-console.path static
    systemd-ask-password-plymouth.path static
    systemd-ask-password-wall.path static
    session-1.scope static
    session-4.scope static
    session-728.scope static
    abrt-ccpp.service enabled
    abrt-oops.service enabled

    【部分运行结果略】
  5. 查看网络服务的开机启动状态,示例代码:
    1
    systemctl is-enabled network
    运行结果:
    1
    2
    3
    network.service is not a native service, redirecting to /sbin/chkconfig.
    Executing /sbin/chkconfig network --level=5
    enabled

在CentOS-6中

在CentOS-6中,有所不同。

service服务管理

CentOS-6中,是以service进行服务管理。

启动服务、停止服务、重启服务和查看服务状态:

1
service 服务名 start | stop | restart | status

注意,在这里是先写服务名,再写具体的操作。而在systemctl中,是先写具体的操作,再写服务名。

举例:

  1. 查看网络服务的状态,示例代码:
    1
    service network status
    运行结果:
    1
    2
    3
    4
    Configured devices:
    lo eth0
    Currently active devices:
    lo eth0 virbr0
  2. 停止网络服务,示例代码:
    1
    service network stop
  3. 启动网络服务,示例代码:
    1
    service network start
  4. 重启网络服务,示例代码:
    1
    service network restart

我们可以和systemctl的比较一下,systemctl的内容更多。

示例代码

1
systemctl status network

运行结果:

1
2
3
4
5
6
7
8
9
10
11
● network.service - LSB: Bring up/down networking
Loaded: loaded (/etc/rc.d/init.d/network; bad; vendor preset: disabled)
Active: active (exited) since Sat 2022-07-16 14:43:35 CST; 26min ago
Docs: man:systemd-sysv-generator(8)
Tasks: 0

Jul 16 14:43:34 localhost.localdomain systemd[1]: Starting LSB: Bring up/down networking...
Jul 16 14:43:34 localhost.localdomain network[27641]: Bringing up loopback interface: [ OK ]
Jul 16 14:43:35 localhost.localdomain network[27641]: Bringing up interface eth0: Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/13)
Jul 16 14:43:35 localhost.localdomain network[27641]: [ OK ]
Jul 16 14:43:35 centos-linux.shared systemd[1]: Started LSB: Bring up/down networking.

chkconfig-设置服务自启

CentOS-6中,是chkconfig设置服务自启的。

常见用法:

  • chkconfig,查看所有服务器自启配置
  • chkconfig 服务名 off,关掉指定服务的自动启动
  • chkconfig 服务名 on,开启指定服务的自动启动
  • chkconfig 服务名 --list,查看服务开机启动状态

其实也有图形化的方式,设置启动项,setup命令。

示例代码:

1
setup

setup

系统运行级别

运行级别,其实这个在Windows中也有,例如:安全模式、带网络的安全模式等。

在Linux中,运行级别有七种:

  • 0:停机
  • 1:单用户(root权限,不能远程操作,所以只能在机房里)
  • 2:多用户,没有网络服务
  • 3:多用户,有网络服务
  • 4:保留级别
  • 5:图形界面
  • 6:重启

所以,默认的运行级别,不能设置为06

最常用的级别是35
在CentOS中,为35,设置了专用的名称。

  • multi-user.target,3。
  • graphical.target,5。

举例:

  1. 查看当前的运行级别,示例代码:
    1
    systemctl get-default
    运行结果:
    1
    graphical.target
  2. 修改当前的运行级别,示例代码:
    1
    systemctl set-default multi-user.target
    运行结果:
    1
    2
    Removed symlink /etc/systemd/system/default.target.
    Created symlink from /etc/systemd/system/default.target to /usr/lib/systemd/system/multi-user.target.

关机重启

shutdown:关机。
常用参数:

  • -r,重启。
  • 数字,表示多少分钟之后关机。
  • now,立即关机。

reboot:立即重启,等同于shutdown -r now

logout:注销。

sync:把内存的数据同步到磁盘。

Linux为了提高磁盘的读写效率,对磁盘采取了"预读迟写"操作方式。当用户保存文件时,Linux并不一定立即将保存数据写入物理磁盘中,而是将数据保存在缓冲区中,等缓冲区满时再写入磁盘,这种方式可以极大的提高磁盘写入数据的效率。但是,也带来了安全隐患,如果数据还未写入磁盘时,系统掉电或者其他严重问题出现,将导致数据丢失。使用sync可以立即将缓冲区的数据写入磁盘。

(关于该部分,我们在《MySQL从入门到实践:6.事务》redo-log刷盘策略部分也有讨论。)

软件包

RPM

概述

RPM,RedHat Package Manager,红帽软件包管理。

RPM包的名称格式,例如Apache-1.3.23-11.i386.rpm

  • Apache,软件名称
  • 1.3.23-11,软件的版本号
  • i386,软件所运行的硬件平台,i386指的是Intel32位处理器
  • rpm,文件扩展名,代表RPM包

查看是否安装过

常用选项:

  • -q,查询
  • -a,所有
  • -i,详细信息

常见用法:

  • rpm -qa | grep 关键词,查询所安装的所有rpm软件包。
  • rpm -qi 软件包,查询某个软件包的详细信息

举例:

  1. 查询名称有Java的软件包,示例代码:
    1
    rpm -qa | grep java
    运行结果:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    python-javapackages-3.4.1-11.el7.noarch
    javassist-3.16.1-10.el7.noarch
    javamail-1.4.6-8.el7.noarch
    java-1.8.0-openjdk-headless-1.8.0.332.b09-1.el7_9.x86_64
    java-1.7.0-openjdk-headless-1.7.0.261-2.6.22.2.el7_8.x86_64
    javapackages-tools-3.4.1-11.el7.noarch
    java-1.8.0-openjdk-1.8.0.332.b09-1.el7_9.x86_64
    tzdata-java-2022a-1.el7.noarch
    java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64
  2. 查看某个软件包的详细安装信息,示例代码:
    1
    rpm -qi java-1.8.0-openjdk-1.8.0.332.b09-1.el7_9.x86_64
    运行结果:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Name        : java-1.8.0-openjdk
    Epoch : 1
    Version : 1.8.0.332.b09
    Release : 1.el7_9
    Architecture: x86_64
    Install Date: Sat 02 Jul 2022 11:27:22 PM CST
    Group : Development/Languages
    Size : 661711
    License : ASL 1.1 and ASL 2.0 and BSD and BSD with advertising and GPL+ and GPLv2 and GPLv2 with exceptions and IJG and LGPLv2+ and MIT and MPLv2.0 and Public Domain and W3C and zlib
    Signature : RSA/SHA256, Thu 12 May 2022 09:37:45 PM CST, Key ID 24c6a8a7f4a80eb5
    Source RPM : java-1.8.0-openjdk-1.8.0.332.b09-1.el7_9.src.rpm
    Build Date : Tue 10 May 2022 10:45:38 PM CST
    Build Host : x86-02.bsys.centos.org
    Relocations : (not relocatable)
    Packager : CentOS BuildSystem <http://bugs.centos.org>
    Vendor : CentOS
    URL : http://openjdk.java.net/
    Summary : OpenJDK 8 Runtime Environment
    Description :
    The OpenJDK 8 runtime environment.

安装

常用选项:

  • -i,安装
  • -v,显示详细信息
  • -h,进度条
  • --nodeps,安装前不检查依赖

常见用法:rpm -ivh

卸载

常用选项:

  • -e,卸载
  • --nodeps,卸载软件时,不检查依赖。

YUM

概述

YUM,Yellow dog Updater,Modified,软件包管理器,基于RPM,能够从指定的服务器自动下载RPM包并安装,可以自动处理依赖性关系。类似于Java中的maven。

语法

1
yum 选项 参数

常用选项

  • -y,对所有提问都回答"yes"。

常见参数

  • install,安装rpm软件包
  • update,更新rpm软件包
  • check-update,检查是否有更新的rpm软件包
  • remove,删除指定的rpm软件包
  • list,显示软件包信息
  • clean,清理过期的缓存
  • deplist,显示软件包的所有依赖关系

更多软件的安装

关于更多软件的安装方法,散落在其他文章中。

  1. JDK:参考《ElasticSearch实战入门(6.X):1.工具、概念、集群和倒排索引》
  2. Tomcat:参考《基于Java的后端开发入门:13.Servlet、Filter和Listener》
  3. MySQL:参考《MySQL从入门到实践:1.概述和工具准备》
  4. ElasticSearch:参考《ElasticSearch实战入门(6.X):1.工具、概念、集群和倒排索引》
  5. Kibana:参考《ElasticSearch实战入门(6.X):1.工具、概念、集群和倒排索引》
  6. DataX:参考《离线数据同步工具DataX快速入门:1.操作方法》
  7. Zookeeper:参考《基于Java的后端开发入门:19.Dubbo和Zookeeper》
  8. Kafka:参考《消息队列(Kafka RabbitMQ):Kafka-1.初步认识》
  9. Kafka-Eagle:参考《消息队列(Kafka RabbitMQ):Kafka-5.监控、调优和避免消息丢失》
  10. Node.js:参考《基于JavaScript的前端开发入门:4.Node.js》
  11. Nginx:参考《NGINX入门与提高:1.安装、基础操作和配置》

更多的软件的安装方法,不再列举。

问题

在有些时候,我们安装软件会出现如下的报错:

1
2
3
4
5
Failed to set locale, defaulting to C
error: rpmdb: BDB0113 Thread/process 29534/140369042343168 failed: BDB1507 Thread died in Berkeley DB library
error: db5 error(-30973) from dbenv->failchk: BDB0087 DB_RUNRECOVERY: Fatal error, run database recovery
error: cannot open Packages index using db5 - (-30973)
error: cannot open Packages database in /var/lib/rpm

这个原因是因为yum命令有非正常的停止(被kill或其他原因)。
解决办法为重新构建。示例代码:

1
2
3
4
5
cd /var/lib/rpm
rm __db.* -rf #删除所有rpm库
rpm --rebuilddb #rpm的重新构建命令
yum clean all #用yum clean all清除
yum makecache #重新生成yum缓存

后台运行

引例

假设现在存在一个Java程序,每隔一秒钟,打印当前时间。示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
package com.kakawanyifan;

import java.time.Instant;

public class main {
public static void main(String[] args) throws InterruptedException {
while (true){
System.out.println(Instant.now());
Thread.sleep(1000);
}
}
}

我们将其打成Jar包,并在服务器上执行。

示例代码:

1
java -jar testJ.jar

运行结果:

1
2
3
4
5
6
7
2022-07-23T09:01:42.883Z
2022-07-23T09:01:43.971Z
2022-07-23T09:01:44.972Z
2022-07-23T09:01:45.974Z
2022-07-23T09:01:46.976Z

【部分运行结果略】

服务器上会一直输出内容,那么有没有办法让程序在后台运行,不输出内容呢?

& 后台运行

在命令之后加个&就可以了,在后台运行了。

示例代码:

1
java -jar testJ.jar &

运行结果:

1
2
3
4
5
2022-07-23T09:08:23.951Z
2022-07-23T09:08:24.954Z
2022-07-23T09:08:25.954Z
2022-07-23T09:08:26.956Z
2022-07-23T09:08:27.957Z

但是,这样处理还不够,因为这样做虽然程序是在后台运行了,但依然不停的输出到当前终端。因此,还应将log重定向到指定的文件。示例代码:

1
java -jar testJ.jar >> out.txt 2>&1 &

解释说明:2>&1是指将标准错误重定向到标准输出,于是标准错误和标准输出都重定向到指定的out.txt文件。

那现在程序在后台运行了,我们怎么找到它呢?
两种方法:

  1. jobs,查看当前有多少在后台运行,例如jobs -l
  2. ps

nohup 不挂起

在命令的末尾加个&符号后,程序可以在后台运行,但是一旦当前终端关闭(即退出当前帐户),该程序就会停止运行。
那假如说我们想要退出当前终端,但又想让程序在后台运行,该如何处理呢?

可以使用nohup,no hang up,不挂起,示例代码:

1
nohup java -jar testJ.jar &

这样程序既在后台运行,又不会挂起。但是程序的输出会默认重定向到nohup.out文件下。如果我们想要输出到指定文件,可另外指定输出文件:

1
nohup java -jar testJ.jar > myout.txt 2>&1 &

jar包的步骤:

  1. 点击Open Module Settings
    Open Module Settings
  2. 依次点击ArtifactsJARFrom modules with dependencies
    Artifacts JAR From modules with dependencies
  3. 注意此处,是src目录,而非src的下级目录
    src
  4. 如有引入外部的JAR包,还需要在此处lib目录,并将外部的包拖入该目录
    lib
  5. 依次点击BuildBuild Artifacts,打包。
    build

密钥登录

制作密钥对

本文以SecureCRT为例。

依次点击如下部分。

制作密钥对-1

点击Create Identity File...

制作密钥对-2

点击···,可以修改文件路径。

制作密钥对-3

配置服务器

将上一步得到的identity.pub上传至服务器。然后在服务器,执行如下操作:

  1. 建立.ssh目录,一般情况下,已经有这个目录。
    1
    2
    mkdir /root/.ssh
    chmod 700 /root/.ssh
  2. 将SSH2兼容格式的公钥转换成为Openssh兼容格式
    1
    2
    ssh-keygen -i -f Identity.pub >> /root/.ssh/authorized_keys2
    chmod 600 /root/.ssh/authorized_keys2
  3. 修改配置文件/etc/ssh/sshd_config
    1
    2
    3
    4
    5
    6
    RSAAuthentication yes
    PubkeyAuthentication yes
    # 请留意 root 用户能否通过 SSH 登录,默认为yes:
    PermitRootLogin yes
    # 当我们完成全部设置并以密钥方式登录成功后,可以禁用密码登录。这里我们先不禁用,先允许密码登陆
    PasswordAuthentication yes
    另外,关注如下部分:
    1
    2
    3
    # The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
    # but this is overridden so installations will only check .ssh/authorized_keys
    # AuthorizedKeysFile .ssh/authorized_keys
  4. 重启SSH服务。
    1
    service sshd restart

密钥登录

按照如下操作,选择密钥登录。

密钥登录-1

点击···,选择密钥文件。

密钥登录-2

与制作密钥对的操作类似,只是在Create Identity File...,我们直接选择密钥文件。

文章作者: Kaka Wan Yifan
文章链接: https://kakawanyifan.com/11002
版权声明: 本博客所有文章版权为文章作者所有,未经书面许可,任何机构和个人不得以任何形式转载、摘编或复制。

留言板