概述
命令格式
1 | 命令主体 选项 操作对象 |
一个命令可以有多个选项,多个操作对象。
在上一章《1.简介、目录和VIM》,我们讨论了VIM
打开文件的四种常用方式,其实就是命令格式的体现。
vim 文件路径
:打开指定的文件。vim +数字 文件路径
:打开指定的文件,并且将光标移动到指定行。vim +/关键词 文件路径
:打开指定的文件,并且高亮显示关键词。vim 文件路径1 文件路径2 文件路径3
:同时打开多个文件(这种不常用)。
如果操作对象名称的开头有-
?
我们可以在前面加上./
,这样带-
的操作对象不会被解析为选项。
例如,文件名为-123.txt
,示例代码:
1 | vim ./-123.txt |
如果操作对象名称中有空格呢?
我们可以为其加上转义\
,或者用单引号
或双引号
括起来。
例如,文件名为 123.txt
,示例代码:
1 | vim \ 123.txt |
帮助
获取帮助信息有两种方法:
man
help
man
,示例代码:
1 | man ls |
help
,示例代码:
1 | help cd |
这两种存在区别,但是在讨论区别之前,我们先讨论一下Linux中的命令分类:
- 内建命令:是shell程序的一部分,写在bash的源码builtins里的。例如:
history
、cd
、exit
。 - 外部命令:外部命令是在bash之外安装的,通常在
/bin
、/usr/bin
、/sbin
和/usr/sbin
中。例如:ls
、vi
。
我们可以用type
来区分是内建命令还是外部命令。
举例:
-
内建命令,示例代码:
1
type exit
运行结果:
1
exit is a shell builtin
解释说明:
is a shell builtin
,说明是内建命令。 -
外部命令,示例代码:
1
type vim
运行结果:
1
vim is /usr/bin/vim
解释说明:
is /usr/bin/vim
,说明是外部命令。 -
别名,示例代码:
1
type ls
运行结果:
1
ls is aliased to `ls --color=auto'
解释说明:该命令为其他命令的别名。
help
只用于查看内建命令的帮助信息。
快捷操作
- 上下箭头
在命令行输入之前执行过的命令,我们可以按回车执行,也可以进行修改后再执行。 tab
对命令进行补齐,这个在输入文件名的时候特别方便。
文件目录
pwd
pwd
:查看当前工作目录的绝对路径。
示例代码:
1 | pwd |
运行结果:
1 | /home/kaka |
ls
ls
:查看目录。
操作对象:需要查看的目录,默认当前目录。
常用选项:
-a
:显示当前目录所有的文件和目录,包括隐藏的。-l
:以列表的方式显示信息。-h
:较易阅读的方式表示文件大小(默认以字节为单位),需要和-l
配合使用。
举例:
-
ls -al
:显示当前所有的文件和目录,包括隐藏的;以列表的形式。示例代码:1
ls -al
运行结果:
1
2
3
4
5
6
7
8total 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
,属于隐藏文件。 -
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
【部分运行结果略】 -
查看指定目录,示例代码:
1
ls -l apache-tomcat-8.5.81
运行结果:
1
2
3
4
5
6
7
8
9
10total 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
ll
,ls
的一个别名。
我们可以通过type
查看一下,示例代码:
1 | type ll |
运行结果:
1 | ll is aliased to `ls -l --color=auto' |
cd
cd
:切换到指定目录,操作对象为路径。
路径表示方法
~
:用户的Home目录。..
:上一级目录。- 绝对路径(相对根目录),以
/
开头。 - 相对路径(相对当前目录),不以
/
开头。
不仅仅在cd
中是如此,只要是路径,都是如此。
mkdir
mkdir
:创建目录。
常用选项:
-p
:创建多级目录
举例:
- 创建一个目录,示例代码:
1
mkdir dir
- 创建多级目录,示例代码:运行结果:
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 |
touch
touch
:创建空文件。
cp
cp
:拷贝文件到指定路径。
该命令需要两个操作对象,第一个是源,第二个是目标。
常用选项:
-r
:递归复制整个文件夹
举例:
-
将
A New Day Has Come-新的一天已经来临.txt
拷贝到dir1
目录下。示例代码:1
cp A\ New\ Day\ Has\ Come-新的一天已经来临.txt dir1/
-
将
dir2
整个目录拷贝到dir1
。示例代码:1
2cp -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
的子目录。 -
将
dir3
整个目录的所有内容,拷贝到dir4
。
dir3
的目录结构如下:1
2
3
4
5
6dir3/
├── 1
├── 2
├── 3
└── dir3_1
└── 3_1拷贝,注意,是
dir3/*
,有通配符。示例代码:1
2cp -r dir3/* dir4/
tree dir4/运行结果:
1
2
3
4
5
6dir4/
├── 1
├── 2
├── 3
└── dir3_1
└── 3_1解释说明:不包括
dir3
目录本身。
rm
rm
:移除(删除)文件或目录。
常用选项:
-r
:递归删除整个文件夹。-f
:强制删除不提示。
mv
mv
:移动文件与目录,也可以用来重命名。
与cp
一样,该命令也需要两个操作对象,第一个是源,第二个是目标。
举例:
- 将
11.txt
重命名为123.txt
,示例代码:1
mv 11.txt 123.txt
- 将
12.txt
移动到dir1/
目录下:1
mv 12.txt dir1/
basename
basename
,取路径里的文件名称。
基本语法:basename [string / pathname] [suffix]
suffix
为后缀,如果suffix
被指定了,会将suffix
去掉。
举例:
- 取文件名,示例代码:运行结果:
1
basename /home/kaka/apache-tomcat-8.5.81/conf/server.xml
1
server.xml
- 取文件名,同时去除后缀。示例代码:运行结果:
1
basename /home/kaka/apache-tomcat-8.5.81/conf/server.xml .xml
1
server
dirname
dirname
,取路径里的目录部分。
基本语法:dirname 文件绝对路径
举例:
- 取绝对路径中的目录部分,示例代码:运行结果:
1
dirname /home/kaka/apache-tomcat-8.5.81/conf/server.xml
1
/home/kaka/apache-tomcat-8.5.81/conf
- 取相对路径中的目录部分,示例代码:运行结果:
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 | 1 A New Day Has Come |
more
more
:分页查看文本文件的内容。
通过more
打开文件后,可以进行一些操作:
- 空格键(
Space
):向下朝一页 Enter
:向下翻一行Ctrl
+f
:向下滚动一屏Ctrl
+b
:向上滚动一屏=
:打印当前行的行号(在底部命令行打印):
+f
:打印文件名和当前行的行号(在底部命令行打印)q
:退出
less
less
:分页查看文本文件的内容。与more
类似,但是比more
更强大,在查看文件内容时,并不是一次将整个文件加载,而是根据内容需要加载,对于查看大型文件具有较高的效率。
通过less
打开文件后,同样可以进行一些操作:
- 空格键(
Space
):向下朝一页 Enter
:向下翻一行f
:向下滚动一屏b
:向上滚动一屏=
:显示当前页面是第几行到第几行/
:搜索n
:向下查找N
:向上(反向向下)查找
q
:退出
>和>>
功能:输出重定向,可以将内容重定向至文件。如果文件不存在,会自动创建。
语法:
- 覆盖:
>
- 追加:
>>
举例:
- 将
ll
输出的内容,写入到a.txt
中。示例代码:运行结果:1
2ll > a.txt
cat a.txt1
2
3
4
5
6
7
8
9
10
11
12
13
14total 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 - 将
ll
输出的内容,追加到A New Day Has Come.txt
。示例代码:运行结果:1
2ll >> A\ New\ Day\ Has\ Come.txt
cat A\ New\ Day\ Has\ Come.txt1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17A 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 - 将文件
111.txt
的内容覆盖到222.txt
。示例代码:1
cat 111.txt > 222.txt
- 将当前日历信息写到
cal.txt
。示例代码:运行结果:1
2cal > cal.txt
cat cal.txt1
2
3
4
5
6
7
8July 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
head
:打印文件的开头部分内容,默认10行。
常用选项:
-数字
、-n 数字
:打印前指定的行。
打印前5行,示例代码:
1 | head -5 A\ New\ Day\ Has\ Come.txt |
运行结果:
1 | A New Day Has Come |
tail
tail
:输出文件中尾部的内容,默认10行。
常用选项:
-数字
、-n 数字
:打印结尾指定的行-f
:实时追踪该文档的所有更新,通常用于观察日志。
示例代码:
1 | tail -5f Milan\ Milan\ 米兰米兰.txt |
运行结果:
1 | 愿你远离污染 |
split
用法:
1 | split [参数] [要分割的文件名] [分割后的文件名前缀] |
参数:
-b
,指定切割文件大小,单位b、k、m。-l
,指定每多少行切割一次,用于文本文件分割。-C
,与-b
类似,但尽量维持每行完整性。-a
,指定后缀名的长度,默认为2位。-d
,使用数字而不是字母作为后缀名。–version
,显示版本信息。
示例代码:
1 | 把 wm6.dmg 这个文件以 wm6.dmg. 开头,按1024m大小进行分割 |
如何需要合并文件,可以用上文的cat
方法。
把files_name_1
、files_name_2
、files_name_3
这三个文件进行合并,合并成一个叫files_name
的文件,示例代码:
1 | cat files_name_1 files_name_2 files_name_3 > files_name |
ln -s
ln -s
:创建软连接。
注意!一般都是建立软连接!即一般在ln
加上选项-s
。
该命令需要两个操作对象,第一个是源,第二个是连接名。
示例代码:
1 | ln -s apache-tomcat-8.5.81/logs/ tomcat-logs |
运行结果:
1 |
|
特别的,当我们使用pwd
查看目录时,看到的是软链接所在目录。示例代码:
1 | cd tomcat-logs/ |
运行结果:
1 | /home/kaka/tomcat-logs |
history
history
:查看已经执行过的命令。
示例代码:
1 | history |
运行结果:
1 |
|
上述的history
命令没有显示执行时间。
显示执行时间有两种方法:
- 先执行
HISTTIMEFORMAT="%F %T "
,然后执行history
。
该方法只在当前会话有效。 - 修改
/etc/profile
,添加如下内容,再执行source /etc/profile
该方法长期有效。1
2HISTTIMEFORMAT="%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 |
cal
cal
:查看日历。
举例:
- 查看当前月份的日历,示例代码:运行结果:
1
cal
1
2
3
4
5
6
7
8July 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 - 查看指定年的日历,示例代码:
1
cal 2022
搜索查找
find
find
:从指定目录向下遍历符合条件的各个文件、子目录。
注意!该命令,操作对象在前,选项在后。语法如下:
1 | find 查找范围 选项 |
常用选项:
-name 文件名
:按文件名查找。-size 文件大小
:按文件大小查找。+文件大小
:大于-文件大小
:小于文件大小
:等于
-user 用户名
:按所属用户查找。
举例:
-
查找文件名为
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
如果想模糊匹配,可以利用通配符
*
-
查找大于
10M
的文件,示例代码:1
find ~ -size +10M
运行结果:
1
2/home/kaka/Desktop/apache-tomcat-8.5.81.tar
/home/kaka/apache-tomcat-8.5.81.tar -
查找小于
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
是小写的。 -
查找等于
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 | 1:A New Day Has Come |
wc
wc
:统计文件内容信息(包含行数、单词数、字节数)
常用参数:
-l
:统计行数-w
:统计单词数-c
:统计字节数
举例:
- 统计行数,示例代码:运行结果:
1
wc -l Milan\ Milan\ 米兰米兰.txt
1
34 Milan Milan 米兰米兰.txt
- 统计单词数,示例代码:运行结果:
1
wc -w Milan\ Milan\ 米兰米兰.txt
1
121 Milan Milan 米兰米兰.txt
- 统计字节数,示例代码:运行结果:
1
wc -c Milan\ Milan\ 米兰米兰.txt
1
1113 Milan Milan 米兰米兰.txt
- 统计行数、字数和字节数,示例代码:运行结果:
1
wc Milan\ Milan\ 米兰米兰.txt
1
34 121 1113 Milan Milan 米兰米兰.txt
- 和
grep
结合,可以统计含有关键字的行数,例如可以用于分析日志中出现"ERROR"的行数。
在这里,我们以Milan
为例,示例代码:运行结果:1
grep Milan Milan\ Milan\ 米兰米兰.txt | wc -l
1
10
压缩和解压
gzip gunzip
gzip
:压缩文件,压缩后不会保留源文件。gunzip
:解压
举例:
- 压缩文件,示例代码:运行结果:
1
2gzip A\ New\ Day\ Has\ Come.txt
ll1
2
3
4
5
6
【部分运行结果略】
-rw-rw-r--. 1 kaka kaka 1354 Jul 4 13:02 A New Day Has Come.txt.gz
【部分运行结果略】 - 同时压缩两个文件。示例代码:运行结果:
1
2gzip 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
命令后面跟着两个操作对象的时候,两个操作对象都会被压缩。这一点不同于cp
、mv
等命令(第一个是源,第二个是目标)。
zip unzip
基本用法
zip
:压缩。unzip
:解压。
zip
和gzip
的比较:
- 操作对象:
zip
至少需要两个操作对象,第一个操作对象是压缩文件的名字,之后的操作对象是被压缩文件。
gzip
可以只有一个操作对象,如果有多个操作对象,多个操作都会被压缩。 - 是否保留源文件:
zip
保留源文件。
gzip
不保留源文件。
举例:
- 如果只有一个操作对象的,会报错。示例代码:运行结果:
1
zip A\ New\ Day\ Has\ Come.txt
1
2
3
4
5zip 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) - 两个操作对象,第一个是压缩文件,第二个是被压缩文件。示例代码:运行结果:
1
zip new.zip A\ New\ Day\ Has\ Come.txt
1
updating: A New Day Has Come.txt (deflated 66%)
- 三个操作对象,第一个是压缩文件,之后的都是被压缩文件。示例代码:运行结果:
1
zip n.zip A\ New\ Day\ Has\ Come.txt Milan\ Milan\ 米兰米兰.txt
1
2adding: A New Day Has Come.txt (deflated 66%)
adding: Milan Milan 米兰米兰.txt (deflated 48%) - 如果被压缩对象是一个目录,加上
-r
。示例代码:1
zip k.zip -r kafka_2.13-3.4.0
unzip
命令只需要一个操作对象,被解压文件。
示例代码:
1 | unzip tomcat.zip |
运行结果:
1 | Archive: tomcat.zip |
选项
zip
的常用选项:
-r
:递归压缩,即压缩目录。
unizp
的常用选项:
-d 目录
:指定解压后文件的存放目录
举例:
-
利用
-r
,压缩目录,示例代码:1
zip -r tomcat.zip apache-tomcat-8.5.81
运行结果:
1
2
3
4
5
6
7
8
9adding: 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%) -
解压文件到指定目录,示例代码:
1
unzip -d tomcat_un tomcat.zip
运行结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17Archive: 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/LICENSEapache-tomcat-8.5.81
是tomcat_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
tar -cvzf a.tar A\ New\ Day\ Has\ Come.txt Milan\ Milan\ 米兰米兰.txt
-
压缩文件夹,示例代码:
1
tar -cvzf d.tar dir1/
-
将
tar
包解压到当前目录,示例代码:1
tar -xvzf a.tar
-
将
tar
包解压到指定目录,示例代码:1
tar -xvzf d.tar -C zhiDing/
注意:
- 需要基于参数
-C
- 指定解压到的那个目录,事先要存在,否则会报错。
- 需要基于参数
用户、组和权限
用户管理
添加用户
命令:useradd
。
操作对象:用户名
常用选项:
-c
,指定一段注释性描述。-d
,指定用户主目录(默认会在home目录下创建一个和用户名相同的目录)。-g
,添加用户时指定用户所属的用户组。
举例:
-
添加用户,示例代码:
1
useradd u1
-
给新创建的用户指定主目录,示例代码:
1
2useradd -d /home/uu/ u2
ll /home/运行结果:
1
2
3
4drwx------. 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 -
新增用户
u1
,同时指定组g1
,示例代码:1
useradd -g g1 u1
在Linux中,每一个用户都必须有一个其所属的组。如果没有指定组,会自动会生成一个与用户名同名的工作组。
删除用户
userdel
:删除用户。
操作对象:需要被删除的用户名。
参数:
-r
:同时删除用户主目录,以及邮箱信息等。
举例:
- 删除用户
u1
,示例代码:1
userdel u1
- 删除用户
u2
以及u2
的主目录,示例代码:1
userdel -r u2
有些资料建议删除用户的时候,不要加上-r
,因为会把用户的主目录也删除。
我建议,加上-r
,做好用户管理,不给以后留下"坑"。但在删除之前将用户目录中的内容备份。
修改用户
usermod
,修改已有用户的信息。
操作对象:用户名
常用选项:
-c
,指定一段注释性描述。-d
,指定用户主目录(默认会在home目录下创建一个和用户名相同的目录)。-g
,添加用户时指定用户所属的用户组。
修改用户u1
到ut
组,示例代码:
1 | usermod -g ut u1 |
密码管理
用户账号刚创建时没有密码,被系统锁定,无法使用,必须为其指定密码后才可以使用(此时由root用户指定密码)。
passwd
指定用户密码或者修改用户密码。
操作对象:被修改密码的用户(如不写,则默认当前用户)。
常用选项:
-l
:锁定密码,即禁用账号。-u
:密码解锁。-d
:删除密码,使账号无密码,也无法登录。-f
:强迫用户下次登录时修改密码。
用户信息
whoami
:查看当前系统当前账号的用户名。who
:查看当前所有登录系统的用户信息。id
:查询用户信息。
举例:
- 查看
kaka
用户的信息,示例代码:运行结果:1
id kaka
1
uid=1000(kaka) gid=1000(kaka) groups=1000(kaka),10(wheel)
- 查询
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
groups
1
root
- 查看指定用户所在的组,示例代码:运行结果:
1
groups u1
1
u1 : u1
权限管理
访问者类型
如果要讨论权限,就必须先梳理清楚Linux中的访问者类型:
- 所有者
默认是文件的创建者,谁创建了该文件,就是该文件的所有者。 - 所属组
默认所有者所在的组,就是所属组。 - 其他
除文件的所有者和所属组的用户外的其它用户.
权限
示例代码:
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位表示其他用户拥有该文件的权限。
我们看到权限写的是r
、w
、x
,解释一下:
r
:read- 对文件而言,具有读取文件内容的权限。
- 对目录来说,具有浏览该目录信息的权限。
w
:write- 对文件而言,具有修改文件内容的权限。注意,是可以修改文件内容,不代表可以删除该文件,删除文件的条件是对该文件所在的目录有写权限。
- 对目录来说具有删除、移动目录内文件的权限。
x
:execute- 对文件而言,具有执行文件的权限。
- 对目录来说,具有进入目录的权限。
-
:不具有该权限。
在上例中,我们看到权限部分写的是-rwxr-x---
:
- 第0位,
-
:普通文件。 - 第1-3位,
rwx
:对于所有者,可读,可写,可执行。 - 第4-6位,
r-x
:对于所属组,可读,可执行,不可写。 - 第7-9位,
---
:对于其他,不可读,不可写,不可执行。
修改权限
只有文件的拥有者和root用户才可以修改文件的权限。
chmod
,修改文件或者目录的权限。
常用选项:
-R
:如果是目录,则使其下所有子文件或目录都生效。
有两种方式:
- 通过
=
、+
、-
- 通过数字
通过=、+、-
规则:
u
,所有者g
:所属组o
;其他a
:所有用户(u
、g
、o
的总和)(默认为所有用户)
举例:
- 对于所有者赋予
r
、w
和x
,对于所属组赋予r
和x
,对于其他用户赋予x
。示例代码:运行结果:1
2chmod u=rwx,g=rx,o=x startup.sh
ll startup.sh1
-rwxr-x--x. 1 kaka kaka 1904 Jun 9 05:30 startup.sh
- 为所属组,增加
w
的权限。示例代码:运行结果:1
2chmod g+w startup.sh
ll startup.sh1
-rwxrwx--x. 1 kaka kaka 1904 Jun 9 05:30 startup.sh
- 为所有人,去除
x
的权限。示例代码:运行结果:1
2chmod a-x startup.sh
ll startup.sh1
-rw-rw----. 1 kaka kaka 1904 Jun 9 05:30 startup.sh
通过数字变更权限
规则:
r
=4w
=2x
=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 | chmod 777 startup.sh |
运行结果:
1 | -rwxrwxrwx. 1 kaka kaka 1904 Jun 9 05:30 startup.sh |
修改所有者
只有root用户才可以修改文件所有者。
chown
,修改文件的所有者。
常用选项:
-R
:如果是目录,则使其下所有子文件或目录都生效。
举例:
- 修改目录
u1
机器所有的子文件或目录,所有者为root
。
查看原始的所有者,示例代码:运行结果:1
ll u1
修改所有者为root,示例代码:1
drwx------ 2 u1 u1 4096 Jul 7 14:32 u1
运行结果:1
2chown root -R u1
ll1
drwx------ 2 root u1 4096 Jul 7 14:32 u1
- 修改所有者的同时,修改所属组。
修改目录u1
的所有者为uu
,所属组为root
。示例代码:运行结果:1
2chown uu:root u1
ll1
drwx------ 2 uu root 4096 Jul 7 14:32 u1
修改所属组
chgrp
,修改文件或目录的所属组
常用选项:
-R
:如果是目录,则使其下所有子文件或目录都生效。
配置文件
最后,我们讨论三个配置文件:
/etc/passwd
/etc/shadow
/etc/group
定时任务
命令
crontab
,时程表。
常用选项:
-u
:指定用户的时程表,默认当前用户。-e
:编辑时程表-l
:查看时程表-r
:删除时程表
开始
步骤:
- 编辑时程表,
crontab –e
- 添加如下内容:
1
* * * * * date >> /tmp/d.txt
- 保存并退出
我们可以通过tail -10f /tmp/d.log
查看一下,每分钟都会执行一次。
1 | tail -100f /tmp/d.log |
Linux中的cron
解释一下调度文件的* * * * *
,从左到右,分别是:
- 分钟,取值
- 小时,取值
- 日期:取值
- 月份:取值
- 星期:取值,和都代表星期天
还有一些特殊字符。
特殊字符 | 含义 | 示例 |
---|---|---|
* |
所有可能的值 | 在月域中,* 表示每个月;在星期域中,* 表示星期的每一天。 |
, |
列出枚举值 | 在分钟域中,5,20 表示分别在5分钟和20分钟触发一次。 |
- |
范围 | 在分钟域中,5-20 表示从5分钟到20分钟之间每隔一分钟触发一次。 |
/ |
指定数值的增量 | 在分钟域中,0/15 表示从第0分钟开始,每15分钟,3/20 表示从第3分钟开始,每20分钟。 |
举例
- 每天6时0分,执行
sh start.sh
:1
0 6 * * * sh start.sh
- 在12月, 每天的6点12点,每隔3个小时,在0分钟执行一次
/usr/bin/backup
:1
0 6-12/3 * 12 * /usr/bin/backup
- 周一到周五每天17时,执行
sh stop.sh
1
0 17 * * 1-5 sh stop.sh
- 每天的0时20分、2时20分、4时20分等,执行
echo "haha"
:1
20 0-23/2 * * * echo "haha"
- 每两个小时重启一次服务mysqld
1
0 */2 * * * systemctl restart mysqld.service
- 每天7时50分,开启ssh服务:
1
50 7 * * * /sbin/service sshd start
- 每天22时50分,关闭ssh服务:
1
50 22 * * * /sbin/service sshd stop
- 每小时的第一分执行
ll
:1
1 * * * * ll
- 每周一至周五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
du -sh
1
108M
- 查看指定目录,示例代码:运行结果:
1
du -sh apache-tomcat-8.5.81
1
17M apache-tomcat-8.5.81
ls -lh
除了du
,还有一个命令也可以查看文件和目录占用的磁盘空间,ls -lh
。但是在统计口径上,存在区别。ls -lh
不会统计子目录的大小。
例如:
du -sh
,示例代码:
示例代码:运行结果:1
du -sh
1
108M .
ls -lh
,示例代码:运行结果:1
ls -lh
1
2
3
4
5
6
7
8
9
10
11total 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 | Filesystem Size Used Avail Use% Mounted on |
解释说明:
Mounted on:/boot
,这是引导分区。- 所属的文件系统是在
/dev
设备目录下。
- 所属的文件系统是在
Filesystem:tmpfs
,基于内存的文件系统Mounted on:/dev/shm
:shm
的含义是Shared-Memory,共享内容。Mounted on:/run
:运行时
Filesystem:devtmpfs
:Linux内核启动时候的挂载点
free
free
,看内存的使用情况。
常用选项:
-h
: 以较易阅读的方式表示磁盘空间占用
示例代码:
1 | free -h |
运行结果:
1 | total used free shared buff/cache available |
lsblk
lsblk
:查看设备挂载情况。
常用选项:
-f
:查看详细的设备挂载情况。
示例代码:
1 | lsblk |
运行结果:
1 | NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT |
网络
ifconfig
ifconfig
:显示所有网络接口的配置信息。
示例代码:
1 | ifconfig |
运行结果:
1 | eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 |
hosts
hosts文件位于/etc/hosts
,我们可以通过VIM
修改该文件。
ping
ping
:测试主机之间网络连通性。
示例代码:
1 | ping kakawanyifan.com |
运行结果:
1 | PING kakawanyifan.com (218.91.183.91) 56(84) bytes of data. |
如果
ping
不通,不一定是网络问题,可能是目标机器禁ping
了。
telnet
telnet
:测试目标机器的端口是否开启。
举例:
- 测试
kakawanyifan.com
的443是否开启
示例代码:运行结果:1
telnet kakawanyifan.com 443
解释说明:1
2
3Trying 218.91.183.91...
Connected to kakawanyifan.com.
Escape character is '^]'.Connected to kakawanyifan.com.
,说明开启了。 - 测试
kakawanyifan.com
的3306是否开启
示例代码:运行结果:1
telnet kakawanyifan.com 3306
解释说明:一直在1
Trying 218.91.183.91...
Trying 218.91.183.91...
,说明没有开启。
curl
curl
:发送网络请求,打印返回。
简单使用
示例代码:
1 | curl kakawanyifan.com |
运行结果:
1 | <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> |
自动跳转
-L
,自动跳转到新的网址。
示例代码:
1 | curl -L kakawanyifan.com |
查看头信息
-i
,查看响应的头信息,也查看响应体。
-I
,只查看响应的头信息。
举例:
-i
,示例代码:运行结果:1
curl -i kakawanyifan.com
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19HTTP/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>-I
,示例代码:运行结果:1
curl -I kakawanyifan.com
1
2
3
4
5
6
7
8
9
10HTTP/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 | * About to connect() to kakawanyifan.com port 80 (#0) |
解释说明:在收到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。
例如:--cookie "name=xxx"
。
header
--header
,设置头信息。
例如:--header "Content-Type:application/json"
。
进程
ps
ps
:查看进程状态。
该命令有两种风格的选项:一种是上文的"UNIX/LINUX"风格,带有-
的;还有一种是BSD风格的,不带-
。
常用选项:
-e
,列出所有进程。-f
,显示完整格式的进程列表。
BSD风格的选项:
a
,列出带有终端的所有用户的进程。x
,列出当前用户的所有进程,包括没有终端的进程。u
,面向用户友好的显示风格。
举例:
-
ps -ef
,示例代码:1
ps -ef
运行结果:
1
2
3
4
5
6
7
8
9
10UID 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
,用户IDPID
,进程IDPPID
,父进程IDC
,CPU用于计算执行优先级的因子,数值越小越优先。数值大,说明进程是CPU密集型运算,执行优先级会降低;数值小,说明进程是I/O密集型运算,执行优先级会提高STIME
:进程启动的时间TTY
:完整的终端名称。在CentOS中:tty1
是图形化终端tty2
-tty6
是本地的字符界面终端pts/0-255
是远程终端
TIME
:CPU时间CMD
:启动进程所用的命令和参数
-
在实际中,常和
grep
配合使用,用于快速找到相关进程。
示例代码:1
ps -ef|grep tomcat
运行结果:
1
2kaka 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 -
ps axu
,示例代码:1
ps axu
运行结果:
1
2
3
4
5
6
7
8
9
10USER 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
:该进程占用虚拟内存的大小,单位KBRSS
:该进程占用实际物理内存的大小,单位KBTTY
:该进程是在哪个终端中运行的。STAT
:进程状态。常见的状态有:R
运行状态、S
睡眠状态、T
暂停状态、Z
僵尸状态、s
包含子进程、l
多线程、+
前台显示START
:该进程的启动时间TIME
:该进程占用CPU的运算时间COMMAND
:产生此进程的命令名
kill、killall
kill
:根据进程号杀死进程。
操作对象:进程号
常用选项:
-9
,强迫进程立即停止。
killall
:根据进程名称杀死进程,支持通配符(在系统因负载过大而变得很慢时有用)
操作对象:进程名
常用选项:
-9
,强迫进程立即停止。
举例,踢掉某个非法登录用户,步骤如下:
- 找到相关进程,示例代码:运行结果:
1
ps -ef|grep sshd
1
2
3
4
5
6
7
8root 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 - 假设
kaka@pts/2
是非法登录,KILL相关进程,示例代码:1
kill 8061
pstree
pstree
,查看进程树。
常用选项:
-p
,显示进程的PID-u
,显示进程的所属用户
示例代码:
1 | pstree -p |
运行结果:
1 | systemd(1)─┬─NetworkManager(1168)─┬─dhclient(7395) |
top
top
,实时监控系统进程状态(动态显示)。
示例代码:
1 | top |
运行结果:
1 | top - 20:54:39 up 8:06, 3 users, load average: 0.14, 0.06, 0.06 |
解释说明:
PID
,进程IDUSER
,该进程对应的用户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 端口号
:查看网络端口号占用情况
举例:
-
查看某个进程的网络信息。
我们先找到相关进程(Tomcat),示例代码:1
ps -ef|grep tomcat
运行结果:
1
2kaka 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 -
查看网络端口号占用情况,示例代码:
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
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. - 停止防火墙服务,示例代码:
1
systemctl stop firewalld
- 启动防火墙服务,示例代码:
1
systemctl start firewalld
- 重启防火墙服务,示例代码:
1
systemctl restart firewalld
特别的,我们可以通过/usr/lib/systemd/system
,查看系统的服务(非所有)。示例代码:
1 | ls /usr/lib/systemd/system |
运行结果:
1 | abrt-ccpp.service firewalld.service multi-user.target.wants rhel-import-state.service systemd-fsck-root.service |
解释说明:.service
,服务;.target
,一组服务的集合。
systemctl设置服务自启
常见用法:
systemctl is-enabled 服务名
,查看某一个服务的开机启动状态systemctl disable 服务名
,关闭指定服务的自动启动systemctl enable 服务名
,开启指定服务的自动启动systemctl list-unit-files
,查看所有服务的开机启动状态
举例:
- 查看防火墙服务的开机启动状态,示例代码:运行结果:
1
systemctl is-enabled firewalld
1
enabled
- 关闭防火墙服务的开机启动,示例代码:
1
systemctl disable firewalld
- 开启防火墙服务的开机启动,示例代码:
1
systemctl enable firewalld
- 查看所有服务的开机启动状态,示例代码:运行结果:
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
23UNIT 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
【部分运行结果略】 - 查看网络服务的开机启动状态,示例代码:运行结果:
1
systemctl is-enabled network
1
2
3network.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
service network status
1
2
3
4Configured devices:
lo eth0
Currently active devices:
lo eth0 virbr0 - 停止网络服务,示例代码:
1
service network stop
- 启动网络服务,示例代码:
1
service network start
- 重启网络服务,示例代码:
1
service network restart
我们可以和systemctl
的比较一下,systemctl
的内容更多。
示例代码
1 | systemctl status network |
运行结果:
1 | ● network.service - LSB: Bring up/down networking |
chkconfig-设置服务自启
在CentOS-6
中,是chkconfig
设置服务自启的。
常见用法:
chkconfig
,查看所有服务器自启配置chkconfig 服务名 off
,关掉指定服务的自动启动chkconfig 服务名 on
,开启指定服务的自动启动chkconfig 服务名 --list
,查看服务开机启动状态
系统运行级别
运行级别,其实这个在Windows中也有,例如:安全模式、带网络的安全模式等。
在Linux中,运行级别有七种:
0
:停机1
:单用户(root权限,不能远程操作,所以只能在机房里)2
:多用户,没有网络服务3
:多用户,有网络服务4
:保留级别5
:图形界面6
:重启
所以,默认的运行级别,不能设置为0
和6
。
最常用的级别是3
和5
。
在CentOS中,为3
和5
,设置了专用的名称。
multi-user.target
,3。graphical.target
,5。
举例:
- 查看当前的运行级别,示例代码:运行结果:
1
systemctl get-default
1
graphical.target
- 修改当前的运行级别,示例代码:运行结果:
1
systemctl set-default multi-user.target
1
2Removed 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
:把内存的数据同步到磁盘。
软件包
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 软件包
,查询某个软件包的详细信息
举例:
- 查询名称有Java的软件包,示例代码:运行结果:
1
rpm -qa | grep java
1
2
3
4
5
6
7
8
9python-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 - 查看某个软件包的详细安装信息,示例代码:运行结果:
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
20Name : 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
,显示软件包的所有依赖关系
更多软件的安装
关于更多软件的安装方法,散落在其他文章中。
- JDK:参考《ElasticSearch实战入门(6.X):1.工具、概念、集群和倒排索引》
- Tomcat:参考《基于Java的后端开发入门:13.Servlet、Filter和Listener》
- MySQL:参考《MySQL从入门到实践:1.概述和工具准备》
- ElasticSearch:参考《ElasticSearch实战入门(6.X):1.工具、概念、集群和倒排索引》
- Kibana:参考《ElasticSearch实战入门(6.X):1.工具、概念、集群和倒排索引》
- DataX:参考《离线数据同步工具DataX快速入门:1.操作方法》
- Zookeeper:参考《基于Java的后端开发入门:19.Dubbo和Zookeeper》
- Kafka:参考《消息队列(Kafka RabbitMQ):Kafka-1.初步认识》
- Kafka-Eagle:参考《消息队列(Kafka RabbitMQ):Kafka-5.监控、调优和避免消息丢失》
- Node.js:参考《基于JavaScript的前端开发入门:4.Node.js》
- Nginx:参考《NGINX入门与提高:1.安装、基础操作和配置》
更多的软件的安装方法,不再列举。
问题
在有些时候,我们安装软件会出现如下的报错:
1 | Failed to set locale, defaulting to C |
这个原因是因为yum
命令有非正常的停止(被kill或其他原因)。
解决办法为重新构建。示例代码:
1 | cd /var/lib/rpm |
后台运行
引例
假设现在存在一个Java程序,每隔一秒钟,打印当前时间。示例代码:
1 | package com.kakawanyifan; |
我们将其打成Jar包,并在服务器上执行。
示例代码:
1 | java -jar testJ.jar |
运行结果:
1 | 2022-07-23T09:01:42.883Z |
服务器上会一直输出内容,那么有没有办法让程序在后台运行,不输出内容呢?
& 后台运行
在命令之后加个&
就可以了,在后台运行了。
示例代码:
1 | java -jar testJ.jar & |
运行结果:
1 | 2022-07-23T09:08:23.951Z |
但是,这样处理还不够,因为这样做虽然程序是在后台运行了,但依然不停的输出到当前终端。因此,还应将log重定向到指定的文件。示例代码:
1 | java -jar testJ.jar >> out.txt 2>&1 & |
解释说明:2>&1
是指将标准错误重定向到标准输出,于是标准错误和标准输出都重定向到指定的out.txt
文件。
那现在程序在后台运行了,我们怎么找到它呢?
两种方法:
jobs
,查看当前有多少在后台运行,例如jobs -l
。ps
。
nohup 不挂起
在命令的末尾加个&符号后,程序可以在后台运行,但是一旦当前终端关闭(即退出当前帐户),该程序就会停止运行。
那假如说我们想要退出当前终端,但又想让程序在后台运行,该如何处理呢?
可以使用nohup
,no hang up,不挂起,示例代码:
1 | nohup java -jar testJ.jar & |
这样程序既在后台运行,又不会挂起。但是程序的输出会默认重定向到nohup.out
文件下。如果我们想要输出到指定文件,可另外指定输出文件:
1 | nohup java -jar testJ.jar > myout.txt 2>&1 & |
密钥登录
制作密钥对
本文以SecureCRT为例。
依次点击如下部分。
点击Create Identity File...
。
点击···
,可以修改文件路径。
配置服务器
将上一步得到的identity.pub
上传至服务器。然后在服务器,执行如下操作:
- 建立
.ssh
目录,一般情况下,已经有这个目录。1
2mkdir /root/.ssh
chmod 700 /root/.ssh - 将SSH2兼容格式的公钥转换成为Openssh兼容格式
1
2ssh-keygen -i -f Identity.pub >> /root/.ssh/authorized_keys2
chmod 600 /root/.ssh/authorized_keys2 - 修改配置文件
/etc/ssh/sshd_config
。另外,关注如下部分:1
2
3
4
5
6RSAAuthentication yes
PubkeyAuthentication yes
# 请留意 root 用户能否通过 SSH 登录,默认为yes:
PermitRootLogin yes
# 当我们完成全部设置并以密钥方式登录成功后,可以禁用密码登录。这里我们先不禁用,先允许密码登陆
PasswordAuthentication yes1
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 - 重启SSH服务。
1
service sshd restart
密钥登录
按照如下操作,选择密钥登录。
点击···
,选择密钥文件。
与制作密钥对的操作类似,只是在Create Identity File...
,我们直接选择密钥文件。