概念性(了解即可)
终端开头字符串
- oscar 这是当前用户的名字。Linux 是一个多用户的操作系统,Windows 也可以。不过 Linux 的多用户管理更方便。我们一般建议每个使用 Linux 系统的用户都创建一个属于自己的账户,便于隐私管理。
- @ 这个符号我们应该不陌生,我们的电子邮件一般都是 name@domain.com 。这个 @ 就表示英语里的 at,是“在…里面;落户在…的;在其中”的意思。@ 前面是用户名,后面是所在的域;
- oscar-laptop 这是当前电脑/主机的名字。上面说了在 @ 后面的是一个域,所以 oscar@oscar-laptop 就表示oscar-laptop 这台电脑的 oscar 这个用户。oscar-laptop 这个名称在安装此 Linux 系统时可以任意指定,之后也 还是可以修改的;
- : 冒号。这是分隔符,没有什么特别的涵义;
- ~ 这是当前所在目录的名字,会随着用户进入不同目录而改变。~ 表示当前用户的家目录,有点类似 Windows系统的“我的文档”这个目录;
- :美元符号。表示普通用户,有权限的限制(比如不能修改重要的系统文件等)。因此我的账户 oscar 就是一个普通用户; #:井号。表示超级用户,也就是 root。表示你当前以 root 这个用户出现。root 拥有所有权限,是系统的大管家,想干什么就干什么。所以一般不推荐初学者登录为 root,因为一不小心可能会误删一些文件。
- sudo su 命令切换成 root,命令提示符就变成了 root@oscar-laptop:/home/oscar#。 要退出 root 身份模式,可以用 Ctrl + D 的组合键,或者你用 exit 命令也可以。
系统文件夹
- bin:英语 binary 的缩写,表示“二进制文件”(我们知道可执行文件是二进制的)。包含了会被所有用户使用的可执行程序;
- boot:英语 boot 表示“启动”,包含与 Linux 启动密切相关的文件;
- dev:英语 device 的缩写,表示“设备”,包含外设。它里面的子目录,每一个对应一个外设。比如代表我们的光盘驱动器的文件就会出现在这个目录下面;
- etc:etc 有点不能顾名思义了。因为 etc 是法语 et cetera 的缩写,翻成英语就是“and so on”,表示“…等等”,包含系统的配置文件。至于为什么在 /etc 下面存放配置文件, 按照原始的 Unix 说法(Linux 文件结构参考 Unix 的教学实现 MINIX),这下面放的都是一堆零零碎碎的东西, 就叫 etc 好了。哈哈 ,这其实是个历史遗留;
- home:英语 home 表示“家”,用户的私人目录。之前我们提过一些,在这个目录中,我们放置私人的文件,有点类似 Windows 中的 Documents 这个文件夹,也叫“我的文档”。Linux 中的每个用户(除了大管家用户,也就是超 级用户 root 外。root 因为太厉害,拥有所有权限,所以比较“任性”,跟普通户不住在一起)都在 home 目录下有自己的一个私人目录。比如我的用户名是 oscar,那么我的私人目录就是 /home/oscar;如果另一个用户叫john,那么他的私人目录就是 /home/john;
- lib:英语 library 的缩写,表示“库”,包含被程序所调用的库文件。例如 .so 结尾的文件,在 Windows 下这样的库文件是以 .dll 结尾的;
- media:英语 media 表示“媒体”。当一个可移动的外设(比如 USB 盘、SD 卡、DVD、光盘等等)插入电脑时,Linux 就可以让我们通过 media 的子目录来访问这些外设中的内容。
- mnt:英语 mount 的缩写,表示“挂载”。有点类似 media,但一般用于临时挂载一些装置;
- opt:英语 optional application software package 的缩写,表示“可选的应用软件包”,用于安装多数第三方软件和插件;
- root:英语“根”的意思。超级用户 root 的家目录/主目录。一般用户的家目录是位于 /home 下,不过 root 用户是个例外。之前的课程我们也提到过,root 是整个系统的超级用户,拥有一切权限,初学者请慎用此用户模式;
- sbin:英语 system binary 的缩写,表示“系统二进制文件”。比起 bin 目录多了一个前缀 system,所以包含的是系统级的重要可执行程序;
- srv:英语 service的缩写,表示“服务”。包含一些网络服务启动之后所需要取用的数据;
- tmp:英语 temporary 的缩写,表示“临时的”。普通用户和程序存放临时文件的地方;
- usr:英语 Unix Software Resource 的缩写,表示“Unix 操作系统软件资源”(也是个历史遗留的命名)。这个目录是最庞大的目录之一 。有点类似 Windows 中的 C:\Windows 和 C:\Program Files 这两个文件夹的集合。在这里面安装了大部分用户要调用的程序;
进程状态
Linux 中,进程有 5 种状态:
- 运行 (正在运行或在运行队列中等待)
- 中断 (休眠中, 受阻, 在等待某个条件的形成或接受到信号)
- 不可中断 (收到信号不唤醒和不可运行, 进程必须等待直到有中断发生)
- 僵死 (进程已终止, 但进程描述符存在, 直到父进程使用 wait4() 系统调用后释放)
- 停止 (进程收到 SIGSTOP, SIGSTP, SIGTIN, SIGTOU 信号后停止运行) ps 命令标识进程的 5 种状态码如下:
- D 不可中断 uninterruptible sleep (usually IO)
- R 运行 runnable (on run queue)
- S 中断 sleeping
- T 停止 traced or stopped
- Z 僵死 a defunct (“zombie”) process
命令参数
- 短参数:
最常用的参数形式就是一个短横线后接一个字母。例如:
command -p
;如果我们要一次加好几个短参数,可以用空格隔开,例如:command -p -a -T -c
;多个短参数也可以合并在一起,例如上面的命令等价于:command -paTc
请注意:参数的字母的大小写是有区别的,大写的 T 和小写的 t 通常表示不同意思。 - 长参数:
长参数没有短参数那么常用,但也是很有用的。短参数是以一个短横线开始,而长参数是以两个短横线开始的。例如:
command --parameter
;如果有多个长参数,是不能像多个短参数那样合并写的。而是只能以空格隔开,例如:command --parameter1 --parameter2
;当然我们也可以组合使用短参数和长参数,例如:command -paTc --parameter1 --parameter2
有时候,同一个意义的参数有短参数和长参数两种形式,效果是一样的,可以任选哪一种。 - 参数的值:
短参数赋值,通常是这样的:
command -p 10
;长参数赋值,通常是这样的:command --parameter=10
软硬链接
硬链接:
- 使链接的两个文件共享同样的文件内容
- 一旦文件 1 和文件 2 之间有了硬链接,那么你修改文件 1 或文件 2,其实修改的是相同的一块儿内容。只不过我们可以用两个文件名来获取到文件内容。
- 硬链接有一个缺陷:只能创建指向文件的硬链接,不能创建指向目录的硬链接。但软链接可以指向文件或目录。
- ln file1 file2 创建了file1的一个硬链接file2
- 以用 ls -i 命令查看一下(-i 参数可以显示文件的 inode)。我们可以看到 file1 和 file2 的 inode 是一样 软链接:
- 相当于windows快捷方式
- ln -s file1 file2 创建了 file1 的软链接 file2。
- ls -l 命令查看文件信息的时候,第二列的那个 1,表示拥有相同 inode 号的文件数。不难理解,因为 file2指向 file1,它们并没有指向同一块文件内容,所以它们的 inode 号不相同。
- 如果我们删除了 file2,没什么大不了,file1 不会受到影响。但是如果删除了 file1,那么 file2 会变成“死链接”,因为指向的文件不见了。
- 软链接可以指向目录,硬链接不行。
用户相关
- adduser 添加用户
- passwd ndd 修改ndd密码
- deluser 删除用户(单单用 deluser 命令,不加参数的话,只会删除用户,但是不会删除在 /home 目录中的用户家目录。如果你想要连此用户的家目录也一并删除,可以加上 --remove-home 这个参数,如下:
deluser --remove-home thomas
,不过,我们上面因为已经用 deluser thomas 来删除了 thomas 这个用户,你如果再运行 deluser --remove-home thomas,系统会提示“/usr/sbin/deluser: The userthomas’ does not exist.”,表示“/usr/sbin/deluser: thomas 这个用户不存在”。 所以我们只能手动去删除它的家目录了:
rm -rf /home/thomas/`)
群组相关
- addgroup friends 添加群组
- usermod 命令有好多参数,可以实现不同的功能。不过我们暂时只需要记得它的两个参数:
- -l:对用户重命名,但是 /home 目录中的用户家目录名不会改变,需要手动修改;
- -g:修改用户所在群组。此用户的家目录里的所有文件的所在群组会相应改变。
usermod -g friends ndd
将ndd假如friends群组 - -G:添加一个用户到多个群组
usermod -G friends,happy,funny ndd
将ndd添加到三个群组中 - -a(append) 添加群组时增加群组而不脱离之前的群组
usermod -aG good ndd
- groups:查看当用户群组
- delgroup happy:删除当前所在群组 注意:addgroup 和 delgroup 命令只是 Debian 一族(包括 Ubuntu)才有的命令。对于其它的 Linux 发行版,一般来说,添加用户和删除用户是用 groupadd 和 groupdel 命令。
标准输入,标准输出
- stdin :标准输入流。英语 standard input 的缩写(standart 是英语“标准”的意思,input 是英语“输入”的意思)。标准输入是指输入至程序的数据(通常是文件),程序要求以读(read)操作来传输数据。并非所有程序都要求输入,如 dir 或 ls 程序运行时不用任何输入。 除非重定向,输入是预期由键盘获取的, 标准输入的文件描述符为 0 (零)。
- stdout :标准输出流。英语 standard output 的缩写(output 是英语“输出”的意思)。标准输出是指程序输出的数据,程序要求数据传输使用写的运算。并非所有程序都要求输出,如 mv 或 ren 程序在成功完成时是没有输出的。 除非重导向,输出是预期显示在终端上的。 标准输出的文件描述符为 1 (一)。
- stderr :标准错误输出流。英语 standard error 的缩写(error 是英语“错误”的意思)。标准错误输出是另一个输出流,用于输出错误消息或诊断。它独立于标准输出,且标准输出和标准错误输出可以分别被重定向。标准错误输出的文件描述符为 2 (二)。
文件描述符 | 名字 | 解释 |
---|---|---|
0 | stdin | 标准输出 |
1 | stdout | 标准输出 |
2 | stderr | 标准错误输出 |
那什么是文件描述符呢? 文件描述符的英语是 File Descriptor,简称 fd。File 是英语“文件”的意思,而 Descriptor 是英语“描述符”的意思。文件描述符是计算机科学中的一个术语,要完全讲清楚可能要用单独的一课,我们就不深究了。文件描述符是一个用于表述指向文件的引用的抽象化概念。这定义本身也有点抽象,我们不需要太深入了解,大致只需要知道:
文件描述符在形式上是一个非负整数。 实际上,它是一个索引值,指向操作系统内核为每一个进程所维护的该进程打开文件的记录表。 当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。
使用手册
- man ls 显示ls使用手册
- apropos 命令:查找命令
- apt-get h 显示帮助文档
- whatis ls 查看ls命令作用(只显示man手册简述部分)
文件传输
-
wget [参数] [URL地址]
wget http://cdimage.debian.org/debian-cd/9.9.0/amd64/iso-cd/debian-9.9.0-amd64-netinst.iso
下载文件 -
wget -c cdimage.debian.org/debian-cd/9… 继续中断的下载
-
scp 复制文件:
- scp source_file destination_file (这两个文件都可以用如下方式来表示:
user@ip:file_name
)- source_file 表示源文件,就是被拷贝的文件;
- destination_file 表示目标文件,就是拷贝产生的文件。
- scp image.png oscar@89.231.45.67:/home/oscar/images/ 从自己电脑拷贝文件到另一台电脑
- scp oscar@89.231.45.67:/home/oscar/images/image.png file_changed_name.png 从另一台电脑拷贝文件到自己电脑
- scp -P 7821 oscar@89.231.45.67:/home/oscar/images/image.png .(表示从远程电脑(ip 地址是89.231.45.67,端口 7821)的用户 oscar 的 /home/oscar/images 目录下把 image.png拷贝到我的电脑中当前文件夹下,名字不变。此处用点号(.)表示当前目录。)
- scp source_file destination_file (这两个文件都可以用如下方式来表示:
-
连接到FTP服务器进行操作 ftp(sftp) -p ftp.fr.debian.org
- put:用于上传文件。put 是英语“放入”的意思。
- get:用于下载文件。get 是英语“获得”的意思。
链接成功会出现:
sftp -oPort 3592 oscar@89.231.45.67
指定端口链接ftp(默认端口22)
-
rsync: 同步备份
- rsync -arv Images/ backups/(将 Images 目录下的所有文件备份到 backups 目录下。)-arv 参数分别表示:
- -a:保留文件的所有信息,包括权限、修改日期等等。a 是 archive 的缩写,是“归档”的意思
- -r:递归调用,表示子目录的所有文件也都包括。r 是 recursive 的缩写,是“递归的”的意思;
- -v:冗余模式,输出详细操作信息。v 是 verbose 的缩写,是“冗余的”的意思。
- rsync 在同步时并不会删除目标目录的文件。例如你的源目录(被同步目录)中删除了一个文件,但是用rsync 同步时,它并不会删除同步目录中的相同文件。如果要使 rsync 也同步删除操作。那么可以这么做:加上 --delete 参数就可以了。delete 是英语“删除”的意思。
- rsync -arv --delete Images/ oscar@89.231.45.67:backups/ 备份到另一台电脑的目录
- rsync -arv Images/ backups/(将 Images 目录下的所有文件备份到 backups 目录下。)-arv 参数分别表示:
ifconfig
运行 ifconfig 命令,可以看到,显示有三个网络接口,分别是:
- eth0(eth0:对应有线连接(对应你的有线网卡),就是用网线来连接的上网(一般是 RJ45 网线,就是平时我们用的那种网线。见下图),如果你的电脑目前使用网线来上网,那就是在使用这个接口。eth 是 Ethernet 的缩写,表示“以太网”。有些电脑可能同时有好几条网线连着(有好几个有线接口),例如服务器,那么除了 eth0(第一块有线网卡),你还会看到例如 eth1、eth2等等。)
- lo(本地回环(Local Loopback 的缩写,对应一个虚拟网卡)。可以看到它的 IP 地址是 127.0.0.1,似曾相识是吗?对啊,之前我们在 /etc/hosts 文件中看到对应 localhost 的就是这个 IP。每台电脑都应该有这个接口,因为它对应着“连向自己的链接”。这也是被称之为“本地回环”的原因:所有经由这个接口发送的东西都会回到你自己的电脑。看起来好像并没有什么用,但有时为了某些缘故(可以百度或 Google 继续探究),我们需要连接自己。例如用来测试一个网络程序,但又不想让局域网或外网的用户能够查看,只能在此台主机上运行和查看所用的网络接口。比如把 HTTPD 服务器指定到回环地址,在浏览器输入127.0.0.1 就能看到你所架设的 Web 网站了。但只有你自己能看得到,局域网的其它主机或用户无从知道。)
- wlan0(对应 Wi-Fi 无线连接(对应你的无线网卡)。wlan 是 Wireless Local Area Network 的缩写,表示“无线局域网”。假如你有好几块无线网卡,那么会看到 wlan1、wlan2等等。)
概念性
- 重定向,是什么意思呢?简单来说,就是我们可以把本来要显示在终端的命令结果,输送到别的地方:到文件中或者作为其他命令的输入(命令的链接,或者叫命令管道)。
- 把两个命令连起来使用,一个命令的输出作为另一个命令的输入,这就构成了管道。管道的英语是 pipeline。
<,<<:从文件或键盘读取
- <:从文件中读取
事实上,虽然 cat < notes.csv 的运行结果和 cat notes.csv 一样,但是原理却不一样:
- cat notes.csv :这种情况下,cat 命令接受的输入是 notes.csv 这个文件名,那么它要先打开 notes.csv 文件,然后打印出文件内容。
- cat < notes.csv :这种情况下,cat 命令接受的输入直接是 notes.csv 这个文件的内容,cat 命令只负责将其内容打印。而打开文件并将文件内容传递给 cat 命令的工作则交给 Shell 程序(也就是控制终端的程序)来完成。
- << 符号的作用是将键盘的输入重定向为某个命令的输入,很多情况下都很有用。
sort -n << END
如上图所示,输入这条命令之后,按下回车,终端就进入了键盘输入模式。 看到那个 > 符号和其后闪动的光标了么?就是让你输入数据的。我们知道 sort -n 的作用是将数值按照从小到大进行排列。那么我们就输入一些数值吧(每输一个数值,用回车键来换行,接着输入下一个数值。输入 END 来结束输入,END 被称为结束字符串。当然了,你可以用其他字符串,比如 haha,input,不一定要用 END。我用 END 是因为 end 是“结束”的意思):
可以看到,sort -n 命令将我们输入的一串数值进行了由小到大的排序。 我们再试试其他命令与 << 符号的配合,这次我们用 wc 命令吧。wc 命令用于统计字符等,配合 -m 参数可以统计字符数。可以看到,“How many characters are there in this sentence ?”这句话中有49个字符。
wc -m << END
w 命令:
- USER:用户名(登录名),user 是英语“用户”的意思。
- TTY:此处的信息是“:0”,和旧版的 Ubuntu 上信息不一样,意思应该是指本地。旧版的 Ubuntu(17.10 之前的Ubuntu 版本)中会显示终端信息,类似 ttyX 之类。Linux 中默认提供六个命令行终端和一个图形终端:tty1 ~ tty7。新版的 Ubuntu 中有所改变,我们之前的课程也演示过了。目前在Ubuntu 中,tty2 ~ tty6 这 5 个是命令行终端(就是全屏、黑底白字的控制台),tty1 是图形终端(就是平时我们启动 Ubuntu 桌面版时默认登录的图形用户界面,也是全屏的)。Ubuntu 中可以通过 Ctrl + Alt + F1~F6 切换这 6 个终端。除了这 6 个基本的“大环境”终端,我们还可以在 tty1 中开很多不是全屏的终端,也就是我们平时用来输入命令行的图形终端(在 Ubuntu中默认可以用 Ctrl + Alt + T 快捷键来启动)。这些终端的名字是以 pts 开头的,pts 是 pseudo terminal slave 的缩写,表示“伪终端从属”。如果我新开一个图形终端,那么显示名称为 pts/0。如果我再开一个图形终端,那么它的名字就是 pts/1。依次类推。
- FROM:用户连接到的服务器的 IP 地址(或者主机名)。因为我们并没有登录远程服务器,只是在本地自己的电脑上测试,所以 FROM 那列显示的并不是实际的 IP 地址,而只是显示“:0”。from 是英语“从…”的意思。
- LOGIN@:用户连接系统的时间,login 是英语“登录”的意思。
- IDLE:用户有多久没活跃了(没运行任何命令)。idle 是英语“不活跃的,空闲的”的意思。
- WHAT:当下用户正运行的程序,what 是英语“什么”的意思。此处是 /usr/lib/gdm3/gdm-x-session 。gdm 是GNOME Display Manager 的缩写,就是 “GNOME 显示管理器”的意思。因为我们目前的 Ubuntu 18.04 默认使用 GNOME 桌面系统。session 是英语“会话”的意思。
top命令
- q:退出 top。
- h:显示帮助文档,也就是哪些按键可以使用。按下任意键返回,按 q 回到 top 命令的主界面。
- B:大写的 B,加粗某些信息。
- f:在进程列表中添加或删除某些列。按 q 回到 top 命令的主界面。
- F:改变进程列表排序所参照的列。默认情况下,是按照 %CPU 那一列来排序,按 q 回到 top 命令的主界面。
- u:依照用户来过滤显示。可以输入用户名,按回车。
- k:结束某个进程。会让你输入要结束的进程的 PID。
- s:改变刷新页面的时间。默认的,页面每隔 3 秒刷新一次。
Ctrl + Z,jobs,bg 和 fg 命令:控制进程的前后台切换
- Ctrl + Z:转到后台,并暂停运行
- bg 命令:使进程转到后台
bg 命令的作用是将命令转入后台运行。假如命令已经在后台,并且暂停着,那么 bg 命令会将其状态改为运行。不加任何参数,bg 命令会默认作用于最近的一个后台进程,也就是刚才被 Ctrl + Z 暂停的 top 进程。如果后面加%1,%2 这样的参数(不带 %,直接 1,2 这样也可以),则是作用于指定标号的进程。因为进程转入后台之后,会显示它在当前终端下的后台进程编号。例如目前 top 进程转入了后台,它的进程编号是 1(可以由 [1]+ 推断)。依次类推,bg %2 就是作用于编号为 2 的后台进程。我们输入 bg,然后回车。看到如下输出:
- jobs 命令:显示后台进程状态
jobs 命令的输出共分三列,我们逐列来说明:
- 显示后台进程标号:比如上例中 top 进程的标号是 1,grep 进程的标号是 2,如果还有其他后台进程,那么就会有 [3],[4]等等。这个标号和 PID(进程号)是不一样的。这个标号只是显示当前终端下的后台进程的一个编 号;
- 显示后台进程状态:比如 Stopped 是“停止的”的意思,Running 是“运行的”的意思。还有其他状态;
- 命令本身。
- fg 命令:使进程转到前台 用法也很简单,和 bg 一样,如果不加参数,那么 fg 命令作用于最近的一个后台进程;如果加参数,如 %2,那么 表示作用于本终端中第二个后台进程。
date命令
- date "+%H:%M:%S"
为了自定义 date 命令的输出,我们需要用到 + 号,后接其他的符号,表示不同的定制部分,这些信息最好都写在双引号间。
- date "+现在是%Y年"
at命令: 在指定时刻执行程序
- 在这种用法下,at 命令的使用顺序如下:
- 先用 at 命令后接想要程序执行的确定时刻
- 再输入你想要在以上指定时刻执行的命令
- at 还有第二种用法,就是在指定时间间隔之后执行程序。
at now +10 minutes: 10 分钟之后执行指定程序
- minutes:表示“分钟”;
- hours:表示“小时”;
- days:表示“天”;
- weeks:表示“星期”;
- months:表示“月”;
- years:表示“年”
- atq 和 atrm 命令:列出和删除正在等待执行的 at 任务
sleep命令
sleep 10 :暂停 10 秒; sleep 15m :暂停15分钟
- m:minute 的缩写,表示“分钟”;
- h:hour 的缩写,表示“小时”;
- d:day 的缩写,表示“天”
&& 和 || 符号
- &&:&& 号前的命令执行成功,才会执行后面的命令。
- ||:|| 号前的命令执行失败,才会执行后面的命令。
- 分号:不论分号前的命令执行成功与否,都执行分号后的命令。前后命令之间没有相关性。
netstat命令
netstat -uta: 列出所有开启的连接
- -u : 显示 UDP 连接(u 是 udp 的首字母)
- -t : 显示 TCP 连接(t 是 tcp 的首字母)
- -a : 不论连接的状态如何,都显示(a 是 all 的首字母)
- -n : 让端口信息以数字的形式显示 state(“状态”)那一列的信息,有好几种不同状态:
- ESTABLISHED:与远程电脑的连接已建立,establish 是英语“建立”的意思;
- TIME_WAIT : 连接正在等待网络上封包的处理,一旦处理完毕就开始关闭连接。time 是英语“时间”的意思,wait 是英语“等待”的意思;
- CLOSE_WAIT :远程服务器中止了连接(也许你太久没什么动作,处在不活跃状态)。close 是英语“关闭”的意思;
- CLOSED :连接没有被使用,关闭了;
- CLOSING :连接正在关闭,但有些数据还没有发送完毕;
- LISTEN :监听着可能进入的连接。此时连接还没有被使用。listen 是英语“听”的意思。
iptables命令
- iptables -L : 显示所有规则,可以看到三个区域:
- Chain INPUT : 对应控制“进入”的网络传输的规则,input 是英语“输入”的意思。
- Chain FORWARD : 对应控制“转发”的网络传输的规则,forward 是英语“转发”的意思。
- Chain OUTPUT : 对应控制“出去”的网络传输的规则,output 是英语“输出”的意思。
- 清除已有 iptables 规则(慎用):
- iptables -F
- iptables -X
- iptables -Z
- 开发指定的端口
# 允许本地回环接口(即运行本机访问本机)
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
# 允许已建立的或相关连的通行
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许所有本机向外的访问
iptables -A OUTPUT -j ACCEPT
# 允许访问 22 端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 允许访问 80 端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 允许 FTP 服务的 21 和 20 端口
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
# 如果有其它端口的话,规则也类似,稍微修改上述语句就行。
# 禁止其它未允许的规则访问(注意:如果 22 端口未加入允许规则,SSH 链接会直接断开。)
## 1). 用 DROP 方法
iptables -A INPUT -p tcp -j DROP
## 2). 用 REJECT 方法
iptables -A INPUT -j REJECT
iptables -A FORWARD -j REJECT
- 屏蔽IP
# 屏蔽单个 IP 的命令是
iptables -I INPUT -s 123.45.6.7 -j DROP
# 封整个段,即从 123.0.0.1 到 123.255.255.254 的命令
iptables -I INPUT -s 123.0.0.0/8 -j DROP
# 封 IP 段从 123.45.0.1 到 123.45.255.254 的命令
iptables -I INPUT -s 124.45.0.0/16 -j DROP
# 封 IP 段从 123.45.6.1 到 123.45.6.254 的命令是
iptables -I INPUT -s 123.45.6.0/24 -j DROP
- 查看已添加的 iptables 规则:
iptables -L -n
- 删除已添加的 iptables 规则:
# 将所有 iptables 以序号标记显示,执行:
iptables -L -n --line-numbers
# 要删除 INPUT 里序号为 8 的规则,执行:
iptables -D INPUT 8
- iptables 的开机启动及规则保存:
CentOS 上可能会存在安装好 iptables 后,iptables 并不开机自动启动,可以执行一下:
# 将其加入开机启动
chkconfig --level 345 iptables on
# 保存规则
service iptables save
Debian / Ubuntu 上 iptables 是不会一直保存规则的。需要按如下步骤进行,让网卡关闭时保存 iptables 规 则,启动时加载 iptables 规则:
- 如果当前用户不是 root,即使使用了 sudo,也会提示你没有权限,无法保存。所以执行本命令,你必须使用 root 用户;
- 可以使用 sudo su 转到 root 用户;
- 为了重启服务器后,规则自动加载,我们创建如下文件:
sudo nano /etc/network/if-pre-up.d/iptables
这个 iptables 文件里的初始内容是:
#!/bin/bash
iptables-save > /etc/iptables.rules
添加执行权限:
chmod +x /etc/network/if-pre-up.d/iptables
附上基本规则:
*filter
:INPUT ACCEPT [106:85568]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [188:168166]
:RH-Firewall-1-INPUT - [0:0]
# 允许本地回环接口(即运行本机访问本机)
-A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
# 允许已建立的或相关联的通行
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许所有本机向外的访问
-A OUTPUT -j ACCEPT
# 允许 PPTP 拨号到外网
-A INPUT -p tcp -m tcp --dport 1723 -j ACCEPT
# 仅特定主机访问 Rsync 数据同步服务
-A INPUT -s 8.8.8.8/32 -p tcp -m tcp --dport 873 -j ACCEPT
# 仅特定主机访问 WDCP 管理系统
-A INPUT -s 6.6.6.6/32 -p tcp -m tcp --dport 8080 -j ACCEPT
# 允许访问 SSH
-A INPUT -p tcp -m tcp --dport 1622 -j ACCEPT
# 允许访问 FTP
-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 20 -j ACCEPT
# 允许访问网站服务
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
# 禁止所有未经允许的连接
-A INPUT -p tcp -j DROP
#注意:如果 22 端口未加入允许规则,SSH 链接会直接断开。
#-A INPUT -j REJECT
#-A FORWARD -j REJECTCOMMIT
上面的步骤有点麻烦,可以使用以下方法直接载入:
- 用文本编辑器来创建文件 sudo nano /etc/iptables.test.rules ,复制上面的规则粘贴到文件中,保存文件;
- 加载规则,使之生效。注意,iptables 不需要重启,加载一次规则就可以。 sudo iptables-restore < /etc/ipt ables.test.rules ;
- 查看最新的配置,应该所有的设置都生效了。 sudo iptables -L -n ;
- 保存生效的配置,让系统重启的时候自动加载有效配置(iptables 提供了保存当前运行的规则功能) iptables-s ave > /etc/iptables.rules 。
实用性(牢牢记住)
查找命令
-
Tab 键不仅可以补全命令,还可以补全文件名、路径名,绝对让你效率倍增。例如,我输入 da 这两个字母,然后按两次 Tab 键(记得不是按一次 Tab 键,是按两次),它将为我展示所有可能的补全选项(如果选项过多终端会自动分页)
- 空格键:用于跳到下一页
- 回车键:用于跳到下一行
- q :用于退出列表
-
history列出使用过的命令
而且,history 列出的使用过的命令,是有编号的,如上图所示。如果要重新运行对应编号的命令,可以用 !编号这样的格式。例如在我的情况下, !30 就会再次运行 date 命令,因为在上面的截图中,我们可以看到编号 30 的那个命令 式 date。
快捷键
- Ctrl + L 用于清理终端的内容,就是清屏的作用。其实 clear 命令也有同样效果,但是你不觉得 Ctrl + L 的按键比输入 clear 这五个字母更快速吗?
- Ctrl + D 给终端传递 EOF (End Of File,文件结束符),在运行程序时很有用。有些程序我们需要在接收到EOF 输入时结束,那么这个快捷键就可以派上用场了。比如我们之前演示过,退出 root 用户身份,就可以用Ctrl + D。如果你在命令行提示符后什么也不输入的情况下直接按下这组快捷键,那么就会关闭当前的终端;
- Shift + PgUp 用于向上滚屏,与鼠标的滚轮向上滚屏是一个效果;
命令输入相关
- Ctrl + A 光标跳到一行命令的开头。一般来说,Home 键有相同的效果;
- Ctrl + E 光标跳到一行命令的结尾。一般来说,End 键有相同的效果。
- Ctrl + U 删除所有在光标左侧的命令字符;
- Ctrl + K 删除所有在光标右侧的命令字符;
- Ctrl + W 删除光标左侧的一个“单词”,这里的“单词”指的是用空格隔开的一个字符串。例如 -a 就是一个“单词”;
- Ctrl + Y 粘贴用 Ctrl + U、 Ctrl + K 或 Ctrl + W “删除”的字符串,有点像“剪切-粘贴”
常用命令
pwd
显示当前目录which
命令用于获取命令的可执行文件的位置。(which java
)ls
命令- 蓝色 --> 目录
- 绿色 --> 可执行文件
- 红色 --> 压缩文件
- 浅蓝色 --> 链接文件
- 灰色 --> 其他文件
命令相关
- ls -l 从左到右依次为:
- 文件权限
- 链接的数目
- 文件所有者的名称
- 文件所在群组
- 文件大小
- 最后一次修改时间
- 文件或目录的名称
命令拓展
ls命令
ls -a
:显示隐藏文件: 在 Linux 中,以点(.)开头的文件是隐藏文件,不过这里不包括开头的两个 . 和 … ,这两个的含义如下: . (一个点)表示当前目录。在当前情况下,就是 /home/oscar ; ..(两个点)表示上一级目录。因为当前目录是 /home/oscar,所以上一级目录就是 /home 。 ++ls -A
与ls -a
区别:不列出 . 和 … 这两个文件。++ls -l
: 命令列出一个显示文件和目录的详细信息列表:
- 每一个文件或目录都有对应的一行信息。在这些信息的最前面,有一个 total xxx 的,是表示当前目录所有文件的总大小是 total 后面的那个数字所表示的千字节(Kilo Byte =1024 Byte)数。
ls -lh
:我们可以再加一个参数 -h,h 是 human-readable 的缩写,表示“适合人阅读的”ls -lt
: 最后修改时间排序
cd命令
回到home目录:
- cd ~
- cd
du命令
- du -h 列出当前目录大小
- du -ah 显示目录和文件大小
- du -sh 目前目录总大小(s 是英语summarize 的首字母,表示“总结,概括”)
cat 命令
- cat 显示文件所有内容
- cat -n 显示文件内容并显示行数
- cat 两个文件 则会合并显示
less命令
- less 分页显示文件内容
- less常用快捷键:
- 空格键:文件内容读取下一个终端屏幕的行数,相当于前进一个屏幕(页)。很常用的快捷键。与键盘上的PageDown(下一页)效果一样;
- 回车键:文件内容读取下一行,也就是前进一行,与键盘上的向下键效果是一样的;
- d 键:前进半页(半个屏幕);
- b 键:后退一页,与键盘上的 PageUp(上一页)效果一样
- y 键:后退一行,与键盘上的向上键效果是一样的;
- u 键:后退半页(半个屏幕);
- q 键:停止读取文件,中止 less 命令。
- = 号:显示你在文件中的什么位置(会显示当前页面的内容是文件中第几行到第几行,整个文件所含行数,所含字符数,整个文件所含字符);
- /(斜杠):进入搜索模式,只要在斜杠后面输入你要搜索的文字,按下回车键,就会把所有符合的结果都标识出来。要在搜索所得结果中跳转,可以按 n 键(跳到下一个符合项目),N 键(shift 键 + n。跳到上一个符合项目)。当然了,正则表达式(Regular Expression)也是可以用在搜索内容中的。
head命令和tail命令
- head 显示文件的头10行
- head -n 5 指定显示的行数
- tail -f 实时主动文件的更新
- tail -n 5 显示文件的尾5行
- tail -f -s 4 每隔4s检查一次文件是否有更新
touch命令和mkdir命令
- touch *.log 创建一个文件
- touch 1.log 2.log 创建两个文件
- touch "new file" 如果文件名称有空格,使用引号
- mkdir 创建目录(使用方式和touch大同小异)
- mkdir -p /one/two/three 递归地创建目录结构
cp命令和mv命令
- cp new_file new_file_copy 第一个文件 new_file 是已经存在的文件,也就是被拷贝的文件;第二个文件 new_file_copy 是需要创建的文件,是new_file 的副本,内容一模一样。
- cp new_file one/ 复制new_file 到one文件夹下,名称和之前一致
- cp new_file one/new_file_copy 复制到one文件夹下,并修改文件名称为new_file_copy
- cp -r one one-copy 复制文件夹(要拷贝目录,只要在 cp 命令之后加上 -r 或者 -R 参数(大写和小写作用是一样的,都表示 recursive,也就是“递归 的”)。拷贝的时候,目录中的所有内容(子目录和文件)都会被拷贝。)
- cp *.txt folder 将通配符匹配到的所有文件复制到folder文件夹下
- mv new_file one 移动new_file文件/文件夹到one目录下
- mv new_file renamed_file 修改文件名称
rm命令
rm命令删除一个文件,多个文件和目录 - -i参数:向用户确认是否删除 - -f参数:不会询问是否删除,强制删除 - -r参数:递归的删除文件
chown(change 和 owner 的缩写)
- chown ndd file.txt: file文件修改为ndd拥有
- chgrp ndd file.txt:将file文件修改为ndd群组文件
- chown thomas:friends file.txt:这句命令就把 file.txt 这个文件的所有者改为 thomas,群组改为 friends 了。用法也很简单,就是在所有者和群组之间用冒号隔开。
- -R参数:递归设置文件夹下所有文件权限
chown -R oscar:oscar /home/thomas
:不但使 /home/thomas 这个目录的所有者和群组都变成 oscar,而且其子目录和子文件也都是如此
chmod(change mode)
- d:英语 directory 的缩写,表示“目录”。就是说这是一个目录;
- l:英语 link 的缩写,表示“链接”。就是说这是一个链接;
- r:英语 read 的缩写,表示“读”。就是说可以读这个文件;
- w:英语 write 的缩写,表示“写”。就是说可以写这个文件,表示可以修改和删除这个文件
- x:英语 execute 的缩写,表示“执行,运行”。就是说可以运行这个文件。
如果相应位置有字母,表示有相应权限;如果相应位置是一个短横 - ,则表示没有相应权限。
为什么我们看到这一排有好多个重复出现的 r、w 和 x 呢?那是因为访问权限是按照用户来划分的:
如上图,除开第一个表示文件或目录属性的符号(此处是 d,表示目录;如果是 l,则是链接;还有其它字母,我们暂时不深究;如果是短横 - ,那么是普通文件。),其它的 9 个符号被划分为三组,从左到右分别表示:
- 第一组 rwx 表示文件的所有者对于此文件的访问权限;
- 第二组 rwx 表示文件所属群组的其他用户对于此文件的访问权限;
- 第三组 rwx 表示除前两组之外的其他用户对于此文件的访问权限。
使用数字分配权限
权限 | 数字 |
---|---|
r | 4 |
w | 2 |
x | 1 |
权限 | 数字 | 计算 |
---|---|---|
--- | 0 | 0+0+0 |
r-- | 4 | 4+0+0 |
-w- | 2 | 0+2+0 |
--x | 1 | 0+0+1 |
rw- | 6 | 4+2+0 |
-wx | 3 | 0+2+1 |
r-x | 5 | 4+0+1 |
rwx | 7 | 4+2+1 |
所以,对于访问权限的三组(所有者的权限、群组用户的权限、其他用户的权限),我们只要分别做加法就可以了,然后把三个和连起来。 例如,640 分别表示:
- 文件的所有者有读和写的权限;
- 文件所在群组的其他用户具有读的权限;
- 除此之外的其他用户没有任何权限。
用字母分配权限
除了用数字,我们也可以用另一种方式来分配文件的访问权限:用字母。 原理是类似的,但是有时用字母的方式更加精巧,因为不需要一次性把三组权限都写出来。我们需要知道不同的字母代表什么:
- u:user 的缩写,是英语“用户”的意思。表示所有者;
- g:group 的缩写,是英语“群组”的意思。表示群组用户;
- o:other 的缩写,是英语“其他”的意思。表示其他用户;
- a:all 的缩写,是英语“所有”的意思。表示所有用户。
当然了,和这些字母配合的还有几个符号:
- +:加号,表示添加权限;
- -:减号,表示去除权限;
- =:等号,表示分配权限。
接下来,我们举例说明如何使用:
#文件 file.txt 的所有者增加读和运行的权限。
chmod u+rx file.txt
#文件 file.txt 的群组其他用户增加读的权限。
chmod g+r file.txt
#文件 file.txt 的其他用户移除读的权限。
chmod o-r file.txt
#文件 file.txt 的群组其他用户增加读的权限,其他用户移除读的权限。
chmod g+r o-r file.txt
#文件 file.txt 的群组其他用户和其他用户均移除读的权限。
chmod go-r file.txt
#文件 file.txt 的所有用户增加运行的权限。
chmod +x file.txt
#文件 file.txt 的所有者分配读,写和执行的权限;
#群组其他用户分配读的权限,不能写或执行;
#其他用户没有任何权限。
chmod u=rwx,g=r,o=- file.txt
-R 参数:递归地修改访问权限
chmod 配合 -R 参数可以递归地修改文件访问权限。
假如我想要只允许 ndd 这个用户能读、写、运行 /home/oscar 这个目录的所有文件(当然,root 不算,root 可以做任何事),该怎么做呢:chmod -R 700 /home/oscar
locate命令,快速查找
- locate renamed_file 搜索包含关键字的所有文件和目录。
- 刚创建不久的文件,由于它们还没被收录进文件数据库,因此 locate 命令就找不到其索引,自然就不会返回任何结果。Linux 系统一般每天会更新一次文件数据库。因此,只要你隔 24 小时再用 locate 查找,应该就能找到你刚创建的 文件了。
- 我们可以用 updatedb 命令强制系统立即更新文件数据库,但是 updatedb 命令只能由 root 用户执行。update 是英语“更新”的意思,db 是英语 database 的缩写,表示“数据库”。所以 updatedb 命令用于“更新数据库”。 因此我们可以运行:一旦执行成功,你再用 locate 查找刚才创建的文件,就可以找到了
find命令,深入查找
查找
- find "何处""何物""做什么"
- 何处:指定在哪个目录中查找。此目录的所有子目录也会被查找,与 locate 命令的查找所有文件数据库的所有记录不同,find 命令可以限定查找目录,比如我们可以只让 find 查找 /home 目录。默认地,假如我们没有给出"何处"这个参数,那么 find 命令会在当前目录及其子目录中查找;
- 何物:也就是要查找什么。我们可以根据文件的名字来查找,也可以根据其大小来查找,也可以根据其最近访问时间来查找等等,这个参数是必须的;
- 做什么:用 find 命令找到文件后,可以对每个文件做一定的操作,称为“后续处理”。默认地,假如不指定这个参数,那么 find 命令只会显示找到的文件,不会做其它事情。
-
find / -name "*.txt" 查出txt文件
-
find / -size +10M 查找大小大于10MB的文件
-
find / -size -50k 查找大小小于50K的文件
-
find / -name "*.jpg" -atime -7:7天里在目录中访问过 JPG 格式的图片(atime 是 access 和 time 的缩写,-atime 参数后面紧跟的 -7 表示 7 天之内,减号表示小于。)
-
find / -name 'new_file' -type d 我们可以用 -type 参数来指定查找的文件类型。type 是英语“类型”的意思。
- type d :只查找目录类型。d 是 directory 的首字母,表示“目录”;
- type f :只查找文件类型。f 是 file 的首字母,表示“文件”
操作查找结果
-
sudo find . -name "*.jpg" -printf "%p - %u\n"
- %p :文件名;
- -:就是一个短横;
- %u :文件的所有者,这里是我的用户名,所以是 oscar;
- \n :用于换行。
-
find -name "*.jpg" -delete 查找并删除文件
-
find -name "*.jpg" -exec chmod 600 {} ; 当前目录下所有查找到的 JPG 文件的访问权限都改为 600 就是说对于每个找到的 .jpg 结尾的文件,都进行 -exec 参数指定的操作:
- 这个操作不必用双引号括起来;
- {} 会用查找到的每个文件来替换;
- ; 是必须的结尾。
-
如果你对于没有确认提示不太放心,你可以将 -exec 参数换成 -ok 参数。 用法一样,只不过 -ok 参数会对每一个查找到的文件都做确认提示,输入 y 加回车表示对此文件进行此操作;输入n 加回车表示对此文件不进行此操作。
grep 命令:筛选数据(Globally search a Regular Expression and Print)
- grep hello 1.txt 在1.txt文件中搜索 hello 这个文本,而且显示所有包含hello的行。
- grep "he llo" 1.txt 查询带有空格的内容是使用双引号
- grep -i hello 1.txt 使用grep忽略大小写(i对应ignore)
- grep -n hello 1.txt 显示搜索到的文本所在行号(n对应line)
- grep -v hello 1.txt 显示搜索文本不在的行(v对应invert)
- grep -r hello 1/ 递归的在目录中查找所有文件中出现文本的行号(recursive)
- grep -E hello 1.txt 使用正则表达式进行查找(E 是 extended regular expression 的第一个字母,表示“扩展的正则表达式”))
- grep -o hello 1.txt 只输出匹配到的部分
sort 命令: 为文件排序
- sort name.txt sort 命令将 name.txt 文件中的行按照首字母的英文字典顺序进行了排列。
- sort -o name_sorted.txt name.txt: name.txt 经过 sort 命令排序之后的内容被储存在了新的文件 name_sorted.txt 中,而 name.txt 的内容是不变的。(o 是 output 的首字母,表示“输出”,就是将排序结果输出到文件中。)
- sort -r name.txt 倒序排列文件
- sort -R name.txt 随机排序文件
- sort -n name.txt 参数用于对数字进行排序,按从小到大排序。(如果不指定,则默认是将首位数字比较)
wc命令: 文件的统计(word count)
- wc name.txt
这三个数字,按顺序,分别表示:
- 行数(newline counts):newline 是英语“换行、换行符”的意思。统计行数其实就是统计换行符的数目。
- 单词数(word counts)
- 字节数(byte counts):byte 是英语“字节”的意思,等于 8 个二进制位(bit)。
- wc -l name.txt 只统计行数
- wc -w name.txt 统计单词数
- wc -c name.txt 统计字节数
- wc -m name.txt 统计字符数
- file name.txt 获取当前文件编码信息
- grep haha file.txt | wc -l 统计某个文件中haha字符串出现的数量
uniq 命令: 删除文件中的重复内容(必须相邻行才会删除)
- uniq repeat.txt uniq 命令并不会改变原文件的内容,只会把处理后的内容显示出来。
- uniq repeat.txt unique.txt 处理后的内容储存到一个新文件中
- uniq -c repeat.txt 参数用于显示重复的行数,如果是独一无二的行,那么数目就是 1。
- uniq -d repeat.txt -d 参数只显示重复的行的值。d 是 duplicated 的缩写,表示“重复的”
cut命令: 剪切文件的一部分内容
- cut -c 2-4 name.txt: name.txt 的每一行只保留第 2 至第 4 个字符
- 使用用分隔符来切割文件,我们可以这样做: 需要用到两个参数:
- -d 参数:d 是 delimiter 的缩写,是英语“分隔符”的意思。用于指定用什么分隔符(比如逗号、分号、双引号等等)。
- -f 参数:f 是 field 的缩写,是英语“区域”的意思。表示剪切下用分隔符分隔的哪一块或哪几块区域。(这个区域索引从1开始)
cut -d , -f 1 notes.csv
:使用逗号切割出第一部分
cut -d , -f 1,3 notes.csv
:使用逗号切割出第一二部分
cut -d , -f 2- notes.csv
:使用逗号切割第二部分以后所有的
>: 重定向到新的文件
- cut -d , -f 1 notes.csv > students.txt 将文件切割后的内容重定向到students.txt文件中,源文件保持不变 使用时要小心,因为 > 符号会把输出重定向到文件中。如果此文件不存在,则新建一个文件;如果此文件已经存在,那就会把文件内容覆盖掉(清除原有内容,然后写入文件),而且是不会征求用户确认的!
- Linux 中有一个俗称“黑洞”的文件,就是null 是英语“无,空”的意思。
/dev/null 文件是特殊文件,不是一个目录,此文件具有唯一的属性:它总是空的。它能使发送到 /dev/null 的任何数据作废,就好像这些数据掉进了无底的黑洞一般。
因此,假如我们不需要在终端显示刚才那个 cut 命令的结果,也不想存储到文件里,那么可以这么做:
cut -d , -f 1 notes.csv > /dev/null
>>: 重定向到文件末尾
command >> results.log
: >> 的作用与 > 是类似的,不过它不会像 > 那么危险(如果文件已经存在,> 符号会覆盖文件内容),而是将重定向的内容写入到文件末尾,起到追加的作用。如果文件不存在,文件也会被创建。
“2>,2>>,2>&1”:重定向错误输出
-
和 >> 符号只是将标准输出重定向到文件,并不能将标准错误输出重定向到文件。
cat not_exist_file.csv > results.txt 2> errors.log
:> results.txt
:将标准输出重定向到 results.txt 文件中2> errors.log
:将标准错误输出重定向到 errors.log 文件中。 也就是说:- 假如 not_exist_file.csv 这个文件确实存在,将其内容写入 results.txt 文件中。
- 假如 not_exist_file.csv 这个文件不存在,将错误信息写入 errors.log 文件中。
cat not_exist_file.csv > results.txt 2>> errors.log
: 追加错误信息到errors.log中- 2>&1: 将标准错误输出重定向到与标准输出相同的地方。
cat not_exist_file.csv > results.txt 2>&1
: 将 cat not_exist_file.csv 这个命令的所有输出(标准输出和标准错误输出)都重定向到results.txt 文件中。cat not_exist_file.csv >> results.txt 2>&1
: 追加日志
- 总结:
- 2> :将标准错误输出重定向到文件。如果文件已经存在,则覆盖文件内容;如果不存在,则创建文件。
- 2>> :将标准错误输出重定向到文件末尾。如果文件不存在,则创建文件。
- 2>&1 :将标准输出和标准错误输出重定向到同一个地方。
| :管道
cut -d , -f 1 notes.csv | sort > sorted_names.txt
将 sort 命令排序的结果重定向到 sorted_names.txt 文件中了。du | sort -nr | head
所以以上命令的作用是:- du :深入遍历当前目录下每个子目录,把所有文件的大小都做一个统计。
- sort -nr :sort 命令的 -n 参数是以数值(此处是文件大小)排序,默认是小的在前;
- -r 参数是倒序排列,有了 -r 参数,排序结果就变成大的数值在前了。
- head :列出前 10 行。
ps(Process Status):进程的静态列表
- ps -ef : 列出所有进程
- ps -efH:以乔木状列出所有进程(比上面的 -ef 多加了一个 H 参数,可以使 ps 命令按照乔木状列出进程。有的进程是某些进程的子进程。)
- ps -u 列出此用户运行的进程
命令参数:
a 显示所有进程
-a 显示同一终端下的所有程序
-A 显示所有进程
c 显示进程的真实名称
-N 反向选择
-e 等于“-A”
e 显示环境变量
f 显示程序间的关系
-H 显示树状结构
r 显示当前终端的进程
T 显示当前终端的所有程序
u 指定用户的所有进程
-au 显示较详细的资讯
-aux 显示所有包含其他使用者的行程
-C<命令> 列出指定命令的状况
--lines<行数> 每页显示的行数
--width<字符数> 每页显示的字符数
--help 显示帮助信息
--version 显示版本显示
kill 命令:结束一个进程
- Ctrl + C 这个组合快捷键还是需要知道的,因为它可以比较友好地中止终端中正在运行的程序(进程),这个组合键也只在终端中会这样执行,如果在普通的图形界面中,它就是拷贝的快捷键,与 Windows 下无异。
- 在终端中拷贝和粘贴,需要用 “Ctrl + Shift + C” 和 “Ctrl + Shift + V” 来执行。
- 同时用 kill 来结束好几个进程,只要用空格隔开它们的 PID:
kill 8461 8561 1706
- 有时候,kill 命令虽然作用于一个进程,但是它不终止,卡住了(因为 kill 命令会很友善地结束进程)。那怎么办呢?有没有比较简单粗暴的方式呢?
kill -9 7291
立即结束 PID 是 7291 的进程,非常“野蛮粗暴” kill all
结束多个进程:后面跟的是程序名kill all java
- halt 命令关闭系统,reboot 命令重启系统,poweroff 命令可以实现立即关机。
& 符号:在后台运行进程
我们可以用熟悉的 cp 命令做例子。例如,我运行 cp 命令来拷贝文件:emacs 的软件包。当然了,你可以用其他文件来测试。cp emacs-26.2.tar.gz emacs-26.2-copy.tar.gz &
- 上图中,因为命令最后加了 & 符号,运行时此进程就成为了后台进程。终端输出了一些信息:[1] :这是此终端的后台进程的标号。因为这是第一个后台进程,所以标号为 1。
- 2051 :这是进程号(PID),如果你想要结束这个后台进程,你可以用我们上一课学习的 kill 命令:
因为这个 emacs 的软件包不大,就几十 MB,所以几乎是瞬间就拷贝完毕了。可以用 ls 命令来看看:
虽然我们的进程是被放到后台了,在终端貌似看不到它的运行过程了。但是此进程还是与此终端相关联的,假如我们把终端关闭,那么这个进程也会结束。
nohup 命令:使进程与终端分离
& 符号虽然常用,但却有一个不可忽视的缺点:后台进程与终端相关联。 一旦终端关闭或者用户登出,进程就自动结束。 如果我们想让进程在以上情况下仍然继续在后台运行,那么我们须要用到 nohup 命令。当用户注销(logout)或者网络断开时,终端会收到 HUP(是 hangup 的缩写,英语“挂断”的意思)信号从而关闭其所有子进程;终端被关闭时也会关闭其子进程。我们可以用 nohup 命令使命令不受 HUP 信号影响。
- 使用 nohup 命令后,输出会被默认地追加写入到一个叫 nohup.out 的文件里。
nohup java -jar 100mw-calc.jar > /dev/null 2>&1 &
crontab 定时执行程序
- crontab 命令如何使用呢?
有三个参数要了解:
- -e:修改 crontab 文件
- -l:显示 crontab 文件
- -r:删除 crontab 文件
- crontab 中的每行指令的书写格式:
- m:minute 的缩写,表示“分钟”;
- h:hour 的缩写,表示“小时”;
- dom:day of month 的缩写,表示“一个月的哪一天”;
- mon:month 的缩写,表示“月份”;
- dow:day of week 的缩写,表示“星期几”;
- command:英语“命令”的意思,表示需要定时执行的命令。
路径最好用绝对路径,因为你并不能确定 cron 命令执行这些语句的时候是在哪个目录。不过 ~ 就是代表当前用户的家目录了。
tar 命令:将多个文件归档
tar 命令,gzip 和 bzip2 命令是这样使用的:
- 用 tar 将多个文件归档为一个总的文件,称为 archive。
- 用 gzip 或 bzip2 命令将 archive 压缩为更小的文件。
-cvf:创建一个 tar 归档 我们可以这样来创建一个 tar 归档: tar 命令的这三个参数分别表示:
- c:create 的缩写,表示“创建”。
- v:verbose 的缩写,表示“冗余”。会显示操作的细节。
- f:file 的缩写,表示“文件”。指定归档文件。
tar -cvf sorting.tar sorting/
将sorting目录下所有文件放到sorting.tar归档下tar -cvf archive.tar file1.txt file2.txt file3.txt
就会把 file1.txt,file2.txt,file3.txt 归档为 archive.tartar -tf sorting.tar
查看归档内容tar -rvf archive.tar file_extra.txt
追加文件到归档tar -xvf sorting.tar
解开归档(x 是 extract 的缩写,表示“提取,取出”。)tar -zcvf sorting.tar.gz sorting
归档,然后用 gzip 来压缩归档tar -zxvf sorting.tar.gz
解压tar -jcvf sorting.tar.bz2 sorting/
归档,然后用 bzip2 来压缩归档tar -jxvf sorting.tar.bz2
解压并归档
gzip和bzip2 命令:压缩归档
- .tar.gz:这是用 gzip 命令压缩后的文件后缀名。
- .tar.bz2:这是用 bzip2 命令压缩后的文件后缀名。
- gzip sorting.tar 压缩文件
- bzip2 sorting.tar 压缩文件,压缩率更高,耗时更长
- gunzip sorting.tar.gz 解压文件
- bunzip2 sorting.tar.bz2 解压文件
- zcat / bzcat,zmore / bzmore,zless / bzless :显示用 gzip / bzip2 压缩的文件的内容
- zcat sorting.tar.gz
- bzcat sorting.tar.bz2
zip / unzip 和 rar / unrar 命令:压缩 / 解压 zip 和 rar 文件
- unzip archive.zip 解压zip文件
- unzip -l archive.zip 查看解压文件内容
- zip -r sorting.zip sorting/ 压缩目录 **这里有一个 -r 参数(r 是 recursively 的缩写,表示“递归地”),须要加上。如果不加,则只会压缩空文件夹而已。加上 -r 参数,则会递归压缩目录和子目录中的所有文件。 **
- unrar e archive.rar 解压 .rar 格式的压缩文件
- unrar l archive.rar 查看文件列表
- rar a sorting.rar sorting/ 压缩目录文件