文章目录

1 帮助命令和快捷键

1.1 快捷键

在开始学习 Linux 命令之前,有这么一些快捷方式,是必须要提前掌握的,它将贯穿整个 Linux 使用生涯

  • 方向键↑ ↓:通过上下方向键↑ ↓来调取过往执行过的 Linux命令;
  • Tab:命令或参数仅需输入前几位就可以用 Tab 键补全;
  • Ctrl + R :用于查找使用过的命令(history 命令用于列出之前使用过的所有命令,然后输入 ! 命令加上编号( !2 )就可以直接执行该历史命令);
  • Ctrl + L:清除屏幕并将当前行移到页面顶部;
  • Ctrl + C:中止当前正在执行的命令;
  • Ctrl + U:从光标位置剪切到行首;
  • Ctrl + K:从光标位置剪切到行尾;
  • Ctrl + W:剪切光标左侧的一个单词;
  • Ctrl + Y:粘贴 Ctrl + U | K | Y 剪切的命令;
  • Ctrl + A:光标跳到命令行的开头;
  • Ctrl + E:光标跳到命令行的结尾;
  • Ctrl + D:关闭 Shell 会话

1.2 帮助命令

1.2.1 man帮助命令

安装更新

yum install -y man-pages --> 安装
mandb --> 更新

man命令没有内部与外部命令的区分
man查看关键词的man page(manual page) (手册页)查看lsmanpage(manual page)可以输入:man ls 就可以查看ls的manpage

$ man ls

man 手册种类:

  1. 可执行程序或 Shell 命令;
  2. 系统调用( Linux 内核提供的函数);
  3. 库调用(程序库中的函数);
  4. 文件(例如 /etc/passwd );
  5. 特殊文件(通常在 /dev 下);
  6. 游戏;
  7. 杂项( man(7) ,groff(7) );
  8. 系统管理命令(通常只能被 root 用户使用);
  9. 内核子程序

man + 数字 + 命令

输入 man + 数字 + 命令/函数,可以查到相关的命令和函数,若不加数字, man 默认从数字较小的手册中寻找相关命令和函数

man 3 rand  --> 表示在手册的第三部分查找 rand 函数
man ls    --> 查找 ls 用法手册

1.2.2 --help帮助命令

help只能用于内部命令,不能用于外部命令
查看关键词的快捷帮助而不是man page(手册页),可以使用--help查看ls的快速帮助,输入ls --help快速帮助信息就会打印到终端上

ls --help

1.2.3 info帮助命令

另外一个帮助命令,可以显示出更完整的最新的信息。 得到的信息比 man 还要多,info 来自自由软件基金会的 GNU 项目,是 GNU 的超文本帮助系统,能够更完整的显示出 GNU 信息。所以得到的信息当然更多

man info 就像两个集合,它们有一个交集部分,但与 man 相比,info 工具可显示更完整的GNU工具信息。若 man 页包含的某个工具的概要信息在info中也有介绍,那么 man 页中会有请参考 info 页更详细内容的字样。

查看lsinfo信息,可以输入:info ls,可以显示lsinfo信息。

info ls

2 查看命令

2.1 ls命令

ls 查看指定目录下的内容

2.1.1 ls -l 命令

查看当前目录内容的详细信息

2.1.2 ls -a 命令

查看当前目录中的所有文件(包括隐藏文件)
具体的ll命令可以查看此处ll查询结果的详细分析

2.2 cat/more/less 查看命令

2.2.1 cat

cat filename cat用来查看文本文件中的内容

$ls
main.c Makefile
$cat main.c
the content of main.c

cat后不加任何文件名,则cat进程就会一直运行,不能自行退出,这时按下Ctrl + Z即可结束该进程。

2.2.2 more

more filenamemorecat的作用差不多,只是当文件内容多于一屏时,按下空格可以滚到下一屏继续阅读,但是不可以回退

$ more main.c
content of main.c
...
press space to continue

2.2.3 less

less filename
less的功能比more更强大,当文件内容多于一屏时,按j可以向下滚动,按k可以向上滚动。

$ less main.c
content of main.c 
...
press j to down 
press k to up 

【快捷操作】

  • 空格键:前进一页(一个屏幕);
  • b 键:后退一页;
  • 回车键:前进一行;
  • y 键:后退一行;
  • 上下键:回退或前进一行;
  • d 键:前进半页;
  • u 键:后退半页;
  • q 键:停止读取文件,中止 less 命令;
  • = 键:显示当前页面的内容是文件中的第几行到第几行以及一些其它关于本页内容的详细信息;
  • h 键:显示帮助文档;
  • / 键:进入搜索模式后,按 n 键跳到一个符合项目,按 N 键跳到上一个符合项目,同时也可以输入正则表达式匹配

2.3 查看Linux版本

cat /etc/redhat-release

3 mkdir创建目录命令

3.1 创建单个目录

在当前目录下创建一个名为akaedu的目录

$ mkdir akaedu

3.2 创建多层目录

在当前目录下创建目录a, 再在a目录下创建b

$ mkdir -p a/b

4 cd 切换目录

4.1 改变活动目录

假设当前目录下有一个a目录,要切换到a目录下可以输入

$ ls
main.c Makefile akaedu a
$pwd
/home/ymqqqqdx/
$cd a
$pwd
/home/ymqqqqdx/a

4.2 绝对路径

假设要切换到用户主目录下的a目录,可以使用绝对路径

$ pwd
/
$ cd /home/ymqqqqdx/a
$ pwd
/home/ymqqqqdx/a

4.3 主目录

每一个用户都有一个对应的主目录,其绝对路径为/home/usrname
要切换到主目录时,只需输入cd,即可回到用户主目录。另外~代表当前用户的主目录,~/a即代表主目录下的a目录

$pwd
/home/ymqqqqdx/a/b/c/d
$cd
$pwd
/home/ymqqqqdx/
$cd ~/a
/home/ymqqqqdx/a

4.4 …(上层目录)和.(当前目录)

..代表上层目录 .代表当前目录,若要运行当前目录下的a.out程序,即可输入./a.out运行程序。

$pwd
/home/ymqqqqdx/a/b/c/d
$cd ..
$pwd
/home/ymqqqqdx/a/b/c
$./a.out
hello world!

5 删除命令

5.1 删除目录

5.1.1 rmdir用来删除空目录

$pwd
/home/ymqqqqdx/
$ls
a main.c Makefile
$rmdir a
$ls
main.c Makefile

5.1.2 删除目录

删除a目录
rm -r a,若目录非空,会提示是否删除,若不需要提示,输入rm -rf a就可以直接删除a目录不需要确认。

$ls
main.c Makefile a
$rm -rf a
$ls
main.c Makefile

5.2 删除文件

5.2.1 删除常规文件

删除1.c文件,rm 1.c

$ls
main.c Makefile 1.c
$rm 1.c
$ls
main.c Makefile

5.2.2 删除非常规文件

此处非常规文件是指root用户都删不了的文件,需要借助chattrlsattr命令
lsattr命令是显示chattr命令设置的文件属性,当确定了属性后,用chattr修改

lsattr /etc/resolv.conf
会显示如下属性
----i-------- /etc/resolv.conf

chattr参数说明:

  • + :在原有参数设定基础上,追加参数。
  • - :在原有参数设定基础上,移除参数。
  • = :更新为指定参数设定。
  • A:文件或目录的 atime (access time)不可被修改(modified), 可以有效预防例如手提电脑磁盘I/O错误的发生。
  • S:硬盘I/O同步选项,功能类似sync。
  • a:即append,设定该参数后,只能向文件中添加数据,而不能删除,多用于服务器日志文件安全,只有root才能设定这个属性。
  • c:即compresse,设定文件是否经压缩后再存储。读取时需要经过自动解压操作。
  • d:即no dump,设定文件不能成为dump程序的备份目标。
  • i:设定文件不能被删除、改名、设定链接关系,同时不能写入或新增内容。i参数对于文件系统的安全设置有很大帮助。
  • j:即journal,设定此参数使得当通过mount参数:data=ordered 或者data=writeback 挂载的文件系统,文件在写入时会先被记录(在journal中)。如果filesystem被设定参数为data=journal,则该参数自动失效。
  • s:保密性地删除文件或目录,即硬盘空间被全部收回。
  • u:与s相反,当设定为u时,数据内容其实还存在磁盘中,可以用于undeletion

各参数选项中常用到的是a和i,所以补充关于权限:i和a的说明:

  • i:不可修改权限 例:chattr u+i filename 则filename文件就不可修改,无论任何人,如果需要修改需要先删除i权限,用chattr -i filename就可以了。查看文件是否设置了i权限用lsattr filename
  • a:只追加权限, 对于日志系统很好用,这个权限让目标文件只能追加,不能删除,而且不能通过编辑器追加。可以使用chattr +a设置追加权限。

注意:chattr不能直接使用,需要如下处理

cd /usr/bin
cp chattr chattr.new
chmod u+x chattr.new
chattr.new -i chattr
rm -rf chattr.new
chmod u+x chattr

6 touch命令

touch命令:创建空文件
创建一个空文件,touch foo.c,这样就在当前目录创建了foo.c文件。
touch的另外一个作用是更新当前文件修改时间,若已经存在foo.c文件,输入touch foo.c后,用ls -l可以看到文件修改时间已更新为当前时间

$ls
main.c Makefile
$touch foo.c
main.c Makefile foo.c
$ls –l
-rw-r--r-- 1 ymqqqqdx ymqqqqdx 0 2011-08-27 01:04 foo.c
-rw-r--r-- 1 ymqqqqdx ymqqqqdx 0 2011-08-27 00:31 main.c
-rw-r--r-- 1 ymqqqqdx ymqqqqdx 0 2011-08-27 00:31 Makefile
$touch main.c
$ls –l
-rw-r--r-- 1 ymqqqqdx ymqqqqdx 0 2011-08-27 01:04 foo.c
-rw-r--r-- 1 ymqqqqdx ymqqqqdx 0 2011-08-27 01:06 main.c
-rw-r--r-- 1 ymqqqqdx ymqqqqdx 0 2011-08-27 00:31 Makefile

7 复制和链接

7.1 cp复制命令

7.1.1 复制单个文件

cp filename newfilename,复制filenamenewfilename

$ls
main.c Makefile
$cp main.c new.c
$ls
main.c Makefile new.c
$cp main.c ~/new.c
$ls ~/
new.c ...

7.1.2 复制文件夹

cp -r a/ b/,复制a目录为b目录。

$ls
main.c Makefile a
$cp -r a b
$ls
main.c Makefile a b

7.2 scp远程复制

scpsecure copy 的缩写, scp linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。
scp 是加密的,rcp 是不加密的,scprcp 的加强版。

scp [可选参数] file_source file_target 
参数说明:

-1: 强制scp命令使用协议ssh1
-2: 强制scp命令使用协议ssh2
-4: 强制scp命令只使用IPv4寻址
-6: 强制scp命令只使用IPv6寻址
-B: 使用批处理模式(传输过程中不询问传输口令或短语)
-C: 允许压缩。(将-C标志传递给ssh,从而打开压缩功能)
-p:保留原文件的修改时间,访问时间和访问权限。
-q: 不显示传输进度条。
-r: 递归复制整个目录。
-v:详细方式显示输出。scp和ssh(1)会显示出整个过程的调试信息。这些信息用于调试连接,验证和配置问题。
-c cipher: 以cipher将数据传输进行加密,这个选项将直接传递给ssh。
-F ssh_config: 指定一个替代的ssh配置文件,此参数直接传递给ssh。
-i identity_file: 从指定文件中读取传输时使用的密钥文件,此参数直接传递给ssh。
-l limit: 限定用户所能使用的带宽,以Kbit/s为单位。
-o ssh_option: 如果习惯于使用ssh_config(5)中的参数传递方式,
-P port:注意是大写的P, port是指定数据传输用到的端口号
-S program: 指定加密传输时所使用的程序。此程序必须能够理解ssh(1)的选项

7.2.1 本地复制远程

# 复制文件
scp local_file remote_username@remote_ip:remote_folder 
或者 
scp local_file remote_username@remote_ip:remote_file 
或者 
scp local_file remote_ip:remote_folder 
或者 
scp local_file remote_ip:remote_file 
# 复制文件夹
scp -r local_folder remote_username@remote_ip:remote_folder 

应用实例:

#复制文件
scp /home/space/music/1.mp3  root@www.test.com:/home/root/test/music 
#复制文件夹
scp -r /home/space/music/ www.test.com:/home/root/test/ 

7.2.2 远程复制本地

远程复制到本地,只要将从本地复制到远程的命令的后2个参数调换顺序即可,如下实例
应用实例:

#复制文件
scp root@www.test.com:/home/root/test/music /home/space/music/1.mp3 
#复制文件夹
scp -r www.test.com:/home/root/test/ /home/space/music/

7.3 rsync

rsync命令主要用于远程同步文件。它可以同步两个目录,不管它们是否处于同一台电脑。它应该是最常用于增量备份的命令了。它就是智能版的 scp 命令。

软件安装:yum install rsync
基础用法

rsync -arv Images/ backups/ # 将Images 目录下的所有文件备份到 backups 目录下
rsync -arv Images/ root@192.x.x.x:backups/ # 同步到服务器的backups目录下

常用参数:

  • -a:保留文件的所有信息,包括权限,修改日期等;
  • -r: 递归调用,表示子目录的所有文件也都包括;
  • -v: 冗余模式,输出详细操作信息。

默认地, rsync在同步时并不会删除目标目录的文件,例如你在源目录中删除一个文件,但是用 rsync 同步时,它并不会删除同步目录中的相同文件。如果向删除也可以这么做: rsync -arv --delete Images/ backups/

7.4 链接

ln英文 Link 的缩写,表示创建链接。
学习创建链接之前,首先要理解链接是什么,我们先来看看 Linux 的文件是如何存储的:

Linux 文件的存储方式分为3个部分,文件名文件内容以及权限,其中文件名的列表是存储在硬盘的其它地方和文件内容是分开存放的,每个文件名通过 inode 标识绑定到文件内容。

Linux 下有两种链接类型:硬链接软链接

  • 硬链接不会创建inode,它跟源文件是同一个文件,inode也跟源文件是同一个,因此它是不能跨文件系统的;
  • 软链接会新建一个新的文件和inode,它类似于指针指向源文件,所以它是可以跨文件系统的

7.4.1 硬链接

使链接的两个文件共享同样文件内容,就是同样的 inode ,一旦文件1文件2之间有了硬链接,那么修改任何一个文件,修改的都是同一块内容,它的缺点是,只能创建指向文件的硬链接,不能创建指向目录的(其实也可以,但比较复杂)而软链接都可以,因此软链接使用更加广泛。

ln file1 file2  --> 创建 file2 为 file1 的硬链接

在这里插入图片描述

如果我们用 rm file1 来删除 file1 ,对 file2 没有什么影响,对于硬链接来说,删除任意一方的文件,共同指向的文件内容并不会从硬盘上删除。只有同时删除了 file1 file2 后,它们共同指向的文件内容才会消失。

7.4.2 软链接

软链接就类似 windows 下快捷方式。

ln -s file1 file2

在这里插入图片描述

执行 ls -l 命名查看当前目录下文件的具体信息

total 0
-rw-r--r-- 1 root root 0 Jan 14 06:29 file1
lrwxrwxrwx 1 root root 5 Jan 14 06:42 file2 -> file1  # 表示file2 指向 file1

其实 file2 只是 file1 的一个快捷方式,它指向的是 file1 ,所以显示的是 file1 的内容,但其实 file2 的 inode 与 file1 并不相同。如果我们删除了 file2 的话, file1 是不会受影响的,但如果删除 file1 的话, file2 就会变成死链接,因为指向的文件不见了

8 打包/解包

8.1 tar命令

常用参数:

  • -cvf:表示 create(创建)+ verbose(细节)+ file(文件),创建归档文件并显示操作细节;
  • -tf:显示归档里的内容,并不解开归档;
  • -rvf:追加文件到归档, tar -rvf archive.tar file.txt ;
  • -xvf:解开归档, tar -xvf archive.tar 。

8.1.1 打包

将a目录用gzip打包,tar zcvf a.tar.gz a
将a目录用bzip2打包,tar jcvf a.tar.bz2 a

$ls
	main.c Makefile
$tar -zcvf foo.tar.gz main.c
$ls
main.c Makefile foo.tar.gz
$tar -jcvf foo.tar.bz2 main.c
$ls
main.c Makefile foo.tar.gz foo.tar.bz2

8.1.2 解包

解压gzip包,tar zxvf a.tar.gz
解压bzip2包,tar jxvf a.tar.bz2

$ls
foo.tar.gz foo.tar.bz2
$tar -zxvf foo.tar.gz
$ls
main.c foo.tar.gz
$rm main.c
$tar -jxvf foo.tar.bz2
$ls
main.c foo.tar.gz foo.tar.bz2

8.2 gzip / gunzip

压缩/解压归档,默认用 gzip 命令,压缩后的文件后缀名为 .tar.gz

gzip archive.tar # 压缩
gunzip archive.tar.gz # 解压

8.3 zcat、zless、zmore

使用 cat less more 可以查看文件内容,但是压缩文件的内容是不能使用这些命令进行查看的,而要使用 zcat、zless、zmore 进行查看。

zcat archive.tar.gz

9 文件的权限

Linux系统中使用的Ext文件系统中,支持文件的权限,用ls -l查看当前目录的文件权限。

$ls –l
-rwxr-xr-x 1 ymqqqqdx ymqqqqdx 7438 2011-09-02 15:08 a.out
drwxr-xr-x 2 ymqqqqdx ymqqqqdx 4096 2011-09-03 09:33 backup/
-rw-r--r-- 1 ymqqqqdx ymqqqqdx 3681 2011-09-02 17:49 chess.c

由图中我们可以看出这两个文件的权限是不一样的:
最前边的一位,可以看出backup/的前边有一个d,这代表它是一个目录a.outchess.c为一个-,这说是它们是普通文件
后边有三位代表文件所有者的权限,分别为可读可写可执行,这说明a.out为一个可执行文件,chess.c为一个不可执行文件。
随后的三位表示同组用户所拥有的权限,最后的三位表示其它用户所拥有的权限。

9.1 文字设定法

可以使用chmod who +|-|= 文件名来改变权限。
who可以是下述字母中的任一个或者它们的组合: u表示文件或目录的所有者; g 表示同组用户;o表示其它用户;
a 表示所有用户mode的常用权限为以下几个:r可读 , w 可写, x 可执行

$ls –l
-rwxr-xr-x 1 ymqqqqdx ymqqqqdx 7438 2011-09-02 15:08 a.out
drwxr-xr-x 2 ymqqqqdx ymqqqqdx 4096 2011-09-03 09:33 backup/
-rw-r--r-- 1 ymqqqqdx ymqqqqdx 3681 2011-09-02 17:49 chess.c
$chmod -x a.out
$ls –l
-rw-r--r-- 1 ymqqqqdx ymqqqqdx 7438 2011-09-02 15:08 a.out
drwxr-xr-x 2 ymqqqqdx ymqqqqdx 4096 2011-09-03 09:33 backup/
-rw-r--r-- 1 ymqqqqdx ymqqqqdx 3681 2011-09-02 17:49 chess.c

9.2 数字设定法

chmod后边可以加上数字,000即代表不可读不可写不可执行
011则代表不可读,可写,可执行。用二进制进行转换011为3,所以用chmod 333 a.out就可以将a.out的变为–rx-rx-rx权限。

$ls –l
-rwxr-xr-x 1 ymqqqqdx ymqqqqdx 7438 2011-09-02 15:08 a.out
drwxr-xr-x 2 ymqqqqdx ymqqqqdx 4096 2011-09-03 09:33 backup/
-rw-r--r-- 1 ymqqqqdx ymqqqqdx 3681 2011-09-02 17:49 chess.c
$chmod 333 a.out
$ls –l
--wx-wx-wx 1 ymqqqqdx ymqqqqdx 7438 2011-09-02 15:08 a.out
drwxr-xr-x 2 ymqqqqdx ymqqqqdx 4096 2011-09-03 09:33 backup/
-rw-r--r-- 1 ymqqqqdx ymqqqqdx 3681 2011-09-02 17:49 chess.c

9.3 chown更改某个文件或目录的所有者

更改某个文件或目录的所有者,这个命令是很常用的,例如root用户把自己的一个文件拷贝给用户akaedu,为了能让用户akaedu存取这个文件,root用户应该把这个文件的所有者设为akaedu,否则,akaedu无法存取这个文件。
例如把一个文件改为akaedu用户所有

$ls –l
-rwxr-xr-x 1 ymqqqqdx ymqqqqdx 7438 2011-09-02 15:08 a.out
drwxr-xr-x 2 ymqqqqdx ymqqqqdx 4096 2011-09-03 09:33 backup/
-rw-r--r-- 1 ymqqqqdx ymqqqqdx 3681 2011-09-02 17:49 chess.c
$chown akaedu chess.c
$ls –l
-rwxr-xr-x 1 ymqqqqdx ymqqqqdx 7438 2011-09-02 15:08 a.out
drwxr-xr-x 2 ymqqqqdx ymqqqqdx 4096 2011-09-03 09:33 backup/
-rw-r--r-- 1 akaedu ymqqqqdx 3681 2011-09-02 17:49 chess.c

9.4 chgrp,chown,chmod

  • chgrp : 改变档案所属群组
    chgrp [-R] dirname/filename ...
    -R :进行递归(recursive)的持续变更,亦即连同次目录下的所有档案、目录都更新成为这个群组之意。常常用在变更某一目录内所有的档案之情况
  • chown : 改变档案拥有者
    chown [-R] 账号名称:组名 档案或目录
    -R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有档案都变更
  • chmod : 改变档案的权限, SUID, SGID, SBIT等等的特性
    chmod [-R] xyz 档案或目录
    选项与参数:
    xyz : 权限属性,为 rwx 属性数值的相加。
    -R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有档案都会变更

还有一个改变权限的方法,基本上就九个权限分别是(1)user (2)group (3)others三种身份啦,那么我们就可以藉由u, g, o来代表三种身份的权限,此外, a 则代表 all 亦即全部的身份,那么读写的权限就可以写成r, w, x,也就是可以使用底下的方式来看
在这里插入图片描述
用字母来分配权限:

  • u user 的缩写,用户的意思,表示所有者。
  • ggroup 的缩写,群组的意思,表示群组用户。
  • oother 的缩写,其它的意思,表示其它用户。
  • aall 的缩写,所有的意思,表示所有用户。
  • + :加号,表示添加权限。
  • - :减号,表示去除权限。
  • = :等于号,表示分配权

点击了解更多ll命令详解

10 查找命令

10.1 find命令

用于查找文件,它会去遍历你的实际硬盘进行查找,而且它允许我们对每个找到的文件进行后续操作,功能非常强大。

find <何处> <何物> <做什么>
何处:指定在哪个目录查找,此目录的所有子目录也会被查找。
何物:查找什么,可以根据文件的名字来查找,也可以根据其大小来查找,还可以根据其最近访问时间来查找。
做什么:找到文件后,可以进行后续处理,如果不指定这个参数,find 命令只会显示找到的文件。

根据文件名查找

find -name "file.txt" --> 当前目录以及子目录下通过名称查找文件
find . -name "syslog" --> 当前目录以及子目录下通过名称查找文件
find / -name "syslog" --> 整个硬盘下查找syslog
find /var/log -name "syslog" --> 在指定的目录/var/log下查找syslog文件
find /var/log -name "syslog*" --> 查找syslog1、syslog2 ... 等文件,通配符表示所有
find /var/log -name "*syslog*" --> 查找包含syslog的文件 

根据文件大小查找

find /var -size +10M --> /var 目录下查找文件大小超过 10M 的文件
find /var -size -50k --> /var 目录下查找文件大小小于 50k 的文件
find /var -size +1G --> /var 目录下查找文件大小查过 1G 的文件
find /var -size 1M --> /var 目录下查找文件大小等于 1M 的文件

根据文件最近访问时间查找

find -name "*.txt" -atime -7  -->7天内访问过的.txt结尾的文件

仅查找目录或文件

find . -name "file" -type f  --> 只查找当前目录下的file文件
find . -name "file" -type d  --> 只查找当前目录下的file目录

操作查找结果

find -name "*.txt" -printf "%p - %u\n" --> 找出所有后缀为txt的文件,并按照 %p - %u\n 格式打印,其中%p=文件名,%u=文件所有者
find -name "*.jpg" -delete --> 删除当前目录以及子目录下所有.jpg为后缀的文件,不会有删除提示,因此要慎用
find -name "*.c" -exec chmod 600 {} \; --> 对每个.c结尾的文件,都进行 -exec 参数指定的操作,{} 会被查找到的文件替代,\; 是必须的结尾
find -name "*.c" -ok chmod 600 {} \; --> 和上面的功能一直,会多一个确认提示

10.2 grep

在指定文件中搜索特定内容,并将含有这些内容的行输出到标准输出。若不指定文件名,则从标准输入读取。

常用参数:

  • -i: 忽略大小写, grep -i path /etc/profile
  • -n: 显示行号,grep -n path /etc/profile
  • -v: 只显示搜索文本不在的那些行,grep -v path /etc/profile
  • -r: 递归查找, grep -r hello /etcLinux 中还有一个 rgrep 命令,作用相当于 grep -r
$grep 'printf' ./ -R
./chess.c:30: printf("\n ");
./chess.c:32: printf(" %d", i + 1);
./chess.c:33: printf("\n");
./chess.c:35: printf(" -");
./chess.c:36: printf("\n");
./chess.c:39: printf("%d ", i + 1);
./chess.c:42: printf(" %d", chessboard[i][j]);
./chess.c:44: printf("\n");
./chess.c:115: printf("current: p1: %d, p2: %d.\n", p1, p2);
./chess.c:126: printf("Welcome!\n");
./chess.c:127: printf("Input link this, 3 3\n");
./chess.c:131: printf("Player %d: ", who);
./chess.c:140: printf("Board full!\n");
./chess.c:143: printf("Current step: %d\n", step);
./chess.c:146: printf("out of range or place 
occupied!\n"

进行范围时间段内日志查询

grep '11:07 18:29:20' catalina.out
grep '11:07 18:31:11' catalina.out

11 mount/umount 挂载U盘

新版本的Linux发行版大多支持自动挂载U盘分区,默认的挂载位置为/media/卷名,但是如果发生问题不能自动挂载,所以要介绍U盘的手动挂载。

$ls /dev/sd\*
/dev/sda /dev/sda2 /dev/sda5 /dev/sda7 /dev/sda9 /dev/sda1 /dev/sda3 /dev/sda6 /dev/sda8

插入U盘后

$ls /dev/sd\*
/dev/sda /dev/sda2 /dev/sda5 /dev/sda7 /dev/sda9 /dev/sda1 /dev/sda3 /dev/sda6 /dev/sda8 /dev/sdb /dev/sdb1

我们发现这里多了一个sdb 和一个sdb1,这就是我们的U盘。

$mount /dev/sdb1 /mnt
$cd /mnt
$ls
file1 file2 .. .

这样就将U盘挂载到了/mnt目录下,对/mnt目录的操作就可以读写U盘上的文件

12 df/du磁盘空间占用命令

12.1 df

df用来检查文件系统的磁盘空间占用情况,可以利用该命令来获取硬盘被占用了多少空间,日前还剩下多少空间等信息。

$df
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/sda8 15480816 3693868 11000568 26% /
none 1024060 332 1023728 1% /dev 
none 1028300 1460 1026840 1% /dev/shm 
none 1028300 104 1028196 1% /var/run 
none 1028300 0 1028300 0% /var/lock 
none 1028300 0 1028300 0% /lib/init/rw 
/dev/sda9 15472768 11540932 3145860 79% /home 
/dev/sda1 52428796 15280160 37148636 30% 
/media/7CE619AAE6196624 
/dev/sda2 62915580 2578292 60337288 5% /media/New Volume 
/dev/sda5 101448700 55005980 46442720 55% /media/Entertainment 
/dev/sda6 62918652 519376 62399276 1% /media/New Volume 

12.2 du

du用来统计目录或文件所占用磁盘空间的大小,du意为disk usage
使用du -s可显示当前目录所占用的空间总大小。

$du –s
1697668 .

13 监视后台进程的工作命令

13.1 w

w:帮助我们快速了解系统中目前有哪些用户登录着,以及他们在干什么。

[root@lion ~]# w
 06:31:53 up 25 days,  9:53,  1 user,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    118.31.243.53    05:56    1.00s  0.02s  0.00s w
 
06:31:53:表示当前时间
up 25 days, 9:53:表示系统已经正常运行了“25天9小时53分钟”
1 user:表示一个用户
load average: 0.00, 0.01, 0.05:表示系统的负载,3个值分别表示“1分钟的平均负载”,“5分钟的平均负载”,“15分钟的平均负载”

参数说明:

  • USER:表示登录的用于
  • TTY:登录的终端名称为pts/0
  • FROM:连接到服务器的ip地址
  • LOGIN@:登录时间
  • IDLE:用户有多久没有活跃了
  • JCPU:该终端所有相关的进程使用的 CPU 时间,每当进程结束就停止计时,开始新的进程则会重新计时
  • PCPU:表示 CPU 执行当前程序所消耗的时间,当前进程就是在 WHAT 列里显示的程序
  • WHAT:表示当下用户正运行的程序是什么,这里运行的是 w

13.2 ps

用于显示当前系统中的进程, ps 命令显示的进程列表不会随时间而更新,是静态的,是运行 ps 命令那个时刻的状态或者说是一个进程快照。

[root@lion ~]# ps
  PID TTY          TIME CMD
 1793 pts/0    00:00:00 bash
 4756 pts/0    00:00:00 ps

 PID:进程号,每个进程都有唯一的进程号
 TTY:进程运行所在的终端
 TIME:进程运行时间
 CMD:产生这个进程的程序名,如果在进程列表中看到有好几行都是同样的程序名,那么就是同样的程序产生了不止一个进程

常用参数:

  • -ef:列出所有进程;
  • -efH: 以乔木状列举出所有进程;
  • -u: 列出此用户运行的进程;
  • -aux: 通过 CPU 和内存使用来过滤进程 ps -aux | less ;
  • -aux --sort -pcpu:按 CPU 使用降序排列, -aux --sort -pmem 表示按内存使用降序排列;
  • -axjf:以树形结构显示进程, ps -axjf 它和 pstree 效果类似。
  • -a:显示终端上的所有进程,包括其他用户的进程
  • -x:显示没有控制终端的进程

13.3 top

top获取进程的动态列表

top - 07:20:07 up 25 days, 10:41,  1 user,  load average: 0.30, 0.10, 0.07
Tasks:  67 total,   1 running,  66 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.7 us,  0.3 sy,  0.0 ni, 99.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1882072 total,   552148 free,   101048 used,  1228876 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  1594080 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                                       
  956 root      10 -10  133964  15848  10240 S  0.7  0.8 263:13.01 AliYunDun                                                                                                     
    1 root      20   0   51644   3664   2400 S  0.0  0.2   3:23.63 systemd                                                                                                       
    2 root      20   0       0      0      0 S  0.0  0.0   0:00.05 kthreadd                                                                                                      
    4 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kworker/0:0H    
  • top - 07:20:07 up 25 days, 10:41, 1 user, load average: 0.30, 0.10, 0.07 相当 w 命令的第一行的信息。
  • 展示的这些进程是按照使用处理器 %CPU 的使用率来排序的。

14 ifconfig 查看或设置网络命令

14.1 查看网络设置

直接输入ifconfig即可查看网络的IP,网关和子网掩码

$ifconfig
eth0 
Link encap:以太网 
硬件地址 00:26:9e:27:21:1e 
inet 地址:192.168.0.4 
广播:192.168.0.255 
掩码:255.255.255.0 
inet6 地址: fe80::226:9eff:fe27:211e/64 
Scope:Link UP BROADCAST RUNNING MULTICAST 
MTU:1500 跃点数:1 接收数据包:5456 错误:0 丢弃:0 过载:0 帧数:0 
发送数据包:1380 错误:0 丢弃:0 过载:0 载波:0 碰撞:0 发送队列长度:1000 
接收字节:1139542 (1.1 MB) 发送字节:244972 (244.9 KB) 
中断:17

14.2 设置网卡参数

ifconfig eth0 192.168.0.1 netmask 255.255.255.0
设置IP地址和子网掩码。

$ifconfig eth0 192.168.0.1 netmask 255.255.255.0

15 端口监控

15.1 netstat监控

netstat是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息.Netstat用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。
netstat -a可以显示所有的socket
netstat -tunlp | grep “5789” 查看5789端口的的连接。

$netstat -tunlp| grep "5789"
unix 3 [ ] 流 已连接 5789 /var/run/acpid.socket

15.2 lsof

lsof -i:端口号 用于查看某一端口的占用情况,比如查看8000端口使用情况,lsof -i:8000

# lsof -i:8000
COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
lwfs    22065 root    6u  IPv4 4395053      0t0  TCP *:irdmi (LISTEN)

16 环境变量

16.1 查找环境变量

在我们的当前目录下有一个可执行文件,它的作用是打印出hello world!,我们执行一下:

$ls
hello.c hello
$hello
hello: 找不到命令
$./hello
hello world!

想一下,为什么我们执行ls的时候就可以执行,而要执行hello的时候就必须要加上./呢?
我们先用which命令看一下ls这个文件在哪里存放:

$which ls
/bin/ls

在我们没有告诉系统完整路径时,系统会在一个名为PATH的的环境变量所存的路径下去找这个文件,我们用env打印当前的环境变量看一下:

$env
...
DESKTOPSESSION=gnome
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
QTIMMODULE=xim
PWD=/home/ymqqqqdx 
XMODIFIERS=@im=ibus
...

我们找到PATH项可以看到/bin在这个环境变量中,所以我们输入ls后,系统会到这个目录下去寻找。

16.2 更改环境变量

如果我们要把hello所在的目录也添加到PATH里面,是不是直接输入hello就可以直接运行我们这个程序了呢?
下面我们来试一下:

pwd
/home/ymqqqqdx
export PATH=/home/ymqqqqdxhello
hello world!
ls
ls: 找不到命令

这是怎么了?怎么连ls都找不到了呢?
我们上面把PATH设置为了/home/ymqqqqdx/,而这个目录下没有ls,所以系统就报错了。不要急,我们重新启动一下终端就好了。
正确的做法是这样的:

$export PATH=$PATH:/home/ymqqqqdxhello
hello world!
ls
hello.c hello

16.3 修改终端启动脚本

由上面的例子我们可以看出,我们做的修改在关闭终端后没有保存,怎么才能将我们做的修改保存起来呢?
修改~/.bashrc

$gedit ~/.bashrc

此时我们用gedit打开了这个文件,到这个文件的最下方,添加我们上面输入的export PATH=$PATH:/home/ymqqqqdx,然后保存退出。
这时我们重启一下终端,终端就会按着这个脚本顺序执行,把我们的路径添加到了环境变量之中。

17 软件安装与卸载和自启动

17.1 yum命令

yum      install       softwarename        安装
yum      repolist                          列出设定yum源的信息
yum      remove        softwarename        只删除软件包而保留配置文件和数据文件
yum      erase         softwarename        要删除软件和它所有的文件
yum      list          softwarename      查看软件源中是否有此软件
yum      list all                         列出所有软件名称
yum      list installed                    列出已经安装的软件名称
yum      list available               列出可以用yum安装的软件名称
yum      clean all                        清空yum缓存
yum      search         softwarename    根据软件信息搜索软件名字
yum      whatprovides   filename       在yum源中查找包含filename文件的软件包
yum      update                           更新软件
yum      history                          查看系统软件改变历史
yum      reinstall       softwarename     重新安装
yum      info            softwarename     查看软件信息
yum      groups list                      查看软件组信息
yum      groups info     softwaregroup    查看软件组内包含的软件
yum      groups install  softwaregroup    安装组件
yum      makecache   生成缓存

17.2 rpm命令

17.2.1 rpm安装

rpm -ivh   # 安装一个包
rpm -Uvh #升级一个包
rpm -e #移走一个包

##安装参数
–force #即使覆盖属于其它包的文件也强迫安装
–nodeps #如果该RPM包的安装依赖其它包,即使其它包没装,也强迫安装。

rpm -q < rpm package name> #查询一个包是否被安装
rpm -qi < rpm package name> #得到被安装的包的信息
rpm -ql < rpm package name>  列出该包中有哪些文件
rpm -qf  #列出服务器上的一个文件属于哪一个RPM包
rpm -qil < rpm package name>  #可综合好几个参数一起用
rpm -qa  #列出所有被安装的rpm package
rpm -qilp < rpm package name>  #列出一个未被安装进系统的RPM包文件中包含有哪些文件

17.2.3 rpm卸载

rpm -qa | grep 包名
这个命令是为了把包名相关的包都列出来
rpm -e 文件名
这个命令就是你想卸载的软件,后面是包名称,最后的版本号是不用打的
例如:

# rpm -qa | grep mysql
mod_auth_mysql-2.6.1-2.2
php-mysql-5.3.9-3.15
mysql-devel-5.1.77-1.CenOS 5.2
mysql-5.0.77-1.CenOS 5.2
mysqlclient10-5.0.77-1.CentOS 5.2
libdbi-dbd-mysql-0.6.5-10.CentOS 5.2
# rpm -e mysqlclient

17.3 软件自动启动

察看mysql是否在自动启动列表中
chkconfig -list

把MySQL添加到你系统的启动服务组里面去
chkconfig -add mysql

把MySQL从启动服务组里面删除。
chkconfig -del mysql

18 用户相关命令

18.1 用户

18.1.1 基本命令

用户是能够获取系统资源的权限的集合

linux用户组的分类:

  • 管理员root : 具有使用系统所有权限的用户,其UID 为0
  • 普通用户 : 即一般用户,其使用系统的权限受限,其UID500-60000之间
  • 系统用户 : 保障系统运行的用户,一般不提供密码登录系统,其UID1-499之间

与用户有关的文件/etc/passwd/etc/shadow
/etc/passwd文件:
其格式:account:password:UID:GID:GECOS:diretory:shell

  • account: 用户名或帐号
  • password :用户密码占位符
  • UID :用户的ID号
  • GID :用户所在组的ID号
  • GECOS : 用户的详细信息(如姓名,年龄,电话等)
  • diretory :用户所的家目录
  • shell :用户所在的编程环境

/etc/shadow
其格式:account:password:最近更改密码的日期:密码不可更该的天数:密码需要重新更改的天数:密码更改前的警告期限:密码过期的宽限时间:帐号失效日期:保留

18.1.2 限制root用户登录

  1. 创建新用户test,执行命令:useradd test
  2. 设置test密码,执行命令:passwd test
  3. 禁用root用户直接通过ssh登录,执行命令:vi /etc/ssh/sshd_config
    查找 #PermitRootLogin yes ,将#去掉,末尾Yes改为No 并wq保存
  4. 重启sshd服务,执行命令:systemctl restart sshd
  5. 配置只允许test切换到root,其他用户不允许。
    • 创建新用户,执行命令:useradd new_test
    • 设置new_test密码,执行命令:passwd new_test
    • 把test添加到wheel组,执行命令:usermod -G wheel test
    • 设置只允许wheel组的人可以su到root,修改文件:vi /etc/pam.d/su
      #auth required pam_wheel.so use_uid注释#号去掉,保存。
      修改文件:vi /etc/login.defs,在末尾添加:SU_WHEEL_ONLY yes

18.1.3 切换用户命令

su,su -,su -l和sudo都是在Linux系统中用于管理用户权限的命令,但它们之间存在一些区别:

  • su:这个命令用于切换到其他用户,例如root用户。当使用su命令时,使用root用户密码,会切换到目标用户,并继承该用户的工作环境
  • su -su -l:与su类似,这个命令也是用于切换到其他用户。但与su不同的是,su -会切换到目标用户的家目录,即改变到目标用户的环境。使用 su - 命令时,需要输入目标用户的密码才能完成身份切换
    su -l 命令与 su - 是等效的。在某些系统中,可以使用 su -l 来实现相同的效果
  • sudosudo是一种权限管理机制,依赖于/etc/sudoers文件,该文件定义了授权给哪个用户可以以管理员的身份执行哪些管理命令。与su不同,sudo不会切换用户身份,而是让用户以其他用户(通常是root用户)的权限执行命令。这意味着,使用sudo命令的用户不需要知道root密码就可以执行需要root权限的命令。当使用该命令需要输入当前用户密码

18.2 用户组

用户组分类;

  • 普通用户组 : 可以加入多个用户
  • 系统组 : 一般加入一些系统用户
  • 私有组(也称基本组) : 当创建用户时,如果没有为其指明所属组,则就为其定义一个私有的用户组,起名称与用户名同名.
    :私有组可以变成普通用户组,当把其他用户加入到该组中,则其就变成了普通组

组是权限的容器
如普通用户 a,b,c 所属组grp,则它们会继承组grp的权限

18.2.1 用户组文件

与组有关的文件:/etc/group/etc/gshadow
/etc/group文件: 其格式:group_name:passwoerd:GID:user_list

  • group_name : 组名
  • passwoerd : 组密码
  • GID : 组的ID号
  • user_list : 以group_name为附加组的用户列表

18.2.2 用户组命令

修改用户及用户组的命令:useradd,usermod, groupdd,userdel

18.2.2.1 增加用户

useradd [options] username
options:
-d :指定用户家目录,默认是/home/username
-s :指定用户所在的shell环境
-G:指定用户的附加组
-c<备注>:修改用户帐号的备注文字
-d<登入目录>:修改用户登入时的目录;
-e<有效期限>:修改帐号的有效期限;
-f<缓冲天数>:修改在密码过期后多少天即关闭该帐号;
-g<群组>:修改用户所属的群组;
-G<群组>;修改用户所属的附加群组;
-l<帐号名称>:修改用户帐号名称,使用格式:usermod -l new_name old_name;
-L:锁定用户密码,使密码无效;
-s:修改用户登入后所使用的shell;
-u:修改用户ID;
-U:解除密码锁定。

例如增加一用户wendy UID为1888 家目录/home/oracle,shell为/bin/sh

useradd –u 1888 –d /home/oracle –s /bin/sh wendy
18.2.2.2 修改用户

usermod [options] username
options:
-u :UID
-g :GID
-d :指定用户家目录,默认是/home/username
-m 与-b 一起用表示把用户家目录的内容也移走
-s :指定用户所在的shell环境
-G:指定用户的附加组

例如修改用户wendy UID为1000 家目录/oracle,shell为/bin/bash

usermod –u 1000 –d  /oracle –s /bin/bash -m wendy
18.2.2.3 增加用户组

groupadd [options] groupname
options
-g :GID

例如增加用户组grp UID为1001

groupadd –g 1001 grp
18.2.2.4 删除用户

userdel [options]username
options
-r :连同家目录一起删除

例如删除用户wendy及家目录

userdel -r wendy

18.3 新增用户组和用户操作

添加用户组:test,用户:test,设置密码

添加用户组
groupadd test
添加用户
useradd test -g test -p password # -g 指定组 -p 密码
添加目录拥有权限
chown test:test  -R test/ # -R 处理指定目录以及其子目录下的所有文件

19 Linux命令行生成随机密码的十种方法

  1. 使用SHA算法来加密日期,并输出结果的前32个字符:
date +%s | sha256sum | base64 | head -c 32 ; echo
  1. 使用内嵌的/dev/urandom,并过滤掉那些日常不怎么使用的字符。这里也只输出结果的前32个字符:
< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c${1:-32};echo;
  1. 使用openssl的随机函数。如果你的系统也许没有安装openssl,你可以尝试其它九种方法或自己安装openssl。
openssl rand -base64 32
  1. 这种方法类似于之前的urandom,但它是反向工作的。Bash的功能是非常强大的
tr -cd '[:alnum:]' < /dev/urandom | fold -w30 | head -n1
  1. 这种方法使用string命令,它从一个文件中输出可打印的字符串:
strings /dev/urandom | grep -o '[[:alnum:]]' | head -n 30 | tr -d '\n'; echo
  1. 这是使用urandom的一个更简单的版本:
< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c6
  1. 这种方法使用非常有用的dd命令:
dd if=/dev/urandom bs=1 count=32 2>/dev/null | base64 -w 0 | rev | cut -b 2- | rev
  1. 你甚至可以生成一个只用左手便可以输入的密码:
</dev/urandom tr -dc '12345!@#$%qwertQWERTasdfgASDFGzxcvbZXCVB' | head -c8; echo ""
  1. 如果每次都使用上述某种方法,那更好的办法是将它保存为函数。如果这样做了,那么在首次运行命令之后,你便可以在任何时间只使用randpw就可以生成随机密码。或许你可以把它保存到你的~/.bashrc文件里面。
randpw(){ < /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c${1:-16};echo;}
  1. 最后这种生成随机密码的方法是最简单的。它同样也可以在安装了Cygwin的Windows下面运行。在Mac OS X下或许也可以运行。实际上如果你使用它生成的全部字符串作为密码,那这个密码就足够随机 了。
date | md5sum

20 Linux命令行管理网络

20.1 curl & wget

使用curlwget命令,不用离开终端就可以下载文件。如你用curl,键入curl -O后面跟一个文件路径。wget则不需要任何选项。下载的文件在当前目录。

curl -O website.com/file
wget website.com/file

20.1.1 wget

wget可以使我们直接从终端控制台下载文件,只需要给出文件的HTTP或FTP地址。

wget [参数][URL地址]

wget http://www.minjieren.com/wordpress-3.1-zh_CN.zip

wget 非常稳定,如果是由于网络原因下载失败, wget 会不断尝试,直到整个文件下载完毕。

常用参数

  • -c 继续中断的下载。

20.2 ping

ping发送ECHO_REQUEST包到你指定的地址。这样你可以很方便确认你的电脑和Internet或是一个指定的IP地址是不是通的。使用 -c 开关,可以指定发送ECHO_REQUEST包的个数。

ping -c 4 google.com

20.3 tracepath & traceroute

tracepath命令和traceroute命令功能类似,但不需要 root权限。并且Ubuntu预装了这个命令,traceroute命令没有预装的。tracepath追踪出到指定的目的地址的网络路径,并给出在路 径上的每一跳(hop)。如果你的网络有问题或是慢了,tracepath可以查出网络在哪里断了或是慢了。

tracepath example.com

20.4 mtr

mtr命令把ping命令和tracepath命令合成了一个。mtr会持续发包,并显示每一跳ping所用的时间。也会显示过程中的任何问题,在下面的示例中,可以看到在第6跳丢了超过20%的包。

mtr howtogeek.com

键入q或是CTRL + C来退出命令。

20.5 host

host命令用来做DNS查询。如果命令参数是域名,命令会输出关联的IP;如果命令参数是IP,命令则输出关联的域名。

host howtogeek.com
host 208.43.115.82

20.6 whois

whois命令输出指定站点的whois记录,可以查看到更多如谁注册和持有这个站点这样的信息

whois example.com

20.7 ifplugstatus

ifplugstatus命令可以告诉你是否有网线插到在网络接口上。这个命令Ubuntu没有预装,通过下面的命令来安装:

sudo apt-get install ifplugd

这个命令可以查看所有网络接口的状态,或是指定网络接口的状态:

ifplugstatus
ifplugstatus eth0

命令输出Link beat detected(检测到连接心跳)表示有网线插着,如没有则会输出unplugged(未插入)。

20.8 ifconfig

查看 ip 网络相关信息,如果命令不存在的话, 执行命令 yum install net-tools 安装
ifconfig用于输出网络接口配置、调优和debug的各种选项。可以快捷地查看IP地址和其它网络接口的信息。键入ifconfig查看所有启用的网络接口的状态,包括它们的名字。可以指定网络接口的名字来只显示这一个接口的信息。

[root@lion ~]# ifconfig

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.31.24.78  netmask 255.255.240.0  broadcast 172.31.31.255
        ether 00:16:3e:04:9c:cd  txqueuelen 1000  (Ethernet)
        RX packets 1592318  bytes 183722250 (175.2 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1539361  bytes 154044090 (146.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
        loop  txqueuelen 1000  (Local Loopback)
        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

参数解析:

  • eth0:对应有线连接(对应你的有线网卡),就是用网线来连接的上网。 eth Ethernet 的缩写,表示“以太网”。有些电脑可能同时有好几条网线连着,例如服务器,那么除了 eht0 ,你还会看到 eth1 、 eth2 等。
  • lo:表示本地回环( Local Loopback 的缩写,对应一个虚拟网卡)可以看到它的 ip 地址是 127.0.0.1 。每台电脑都应该有这个接口,因为它对应着“连向自己的链接”。这也是被称之为本地回环的原因。所有经由这个接口发送的东西都会回到你自己的电脑。看起来好像并没有什么用,但有时为了某些缘故,我们需要连接自己。例如用来测试一个网络程序,但又不想让局域网或外网的用户查看,只能在此台主机上运行和查看所有的网络接口。例如在我们启动一个前端工程时,在浏览器输入 127.0.0.1:3000 启动项目就能查看到自己的 web 网站,并且它只有你能看到。
  • wlan0:表示无线局域网(上面案例并未展示)

20.9 ifdown & ifup

ifdownifup命令和运行ifconfig upifconfig down的功能一样。给定网络接口的名字可以只禁用或启用这一个接口。需要root权限,所以在Ubuntu上需要使用sudo来运行。

sudo ifdown eth0
sudo ifup eth0

在Linux桌面系统上运行这2个命令,很可能会输出出错信息。Linux桌面通过使用网络管理器(NetworkManager)来管理你的网络接口。不过在没有安装网络管理器的服务器版上,这2个命令仍然可用。
如果确实要在命令行上配置网络管理器,用nmcli命令。

20.10 dhclient

dhclient命令可以释放你的电脑的IP地址并从DHCP服务器上获得一个新的。需要root权限,所以在Ubuntu上需要sudo。无选项运行命令获取新IP,或指定 -r 开关来释放当前的IP地址。

sudo dhclient -r
sudo dhclient

20.11 netstat

netstat命令可以显示网络接口的很多统计信息,包括打开的socket和路由表。无选项运行命令显示打开的socket。

这条命令还有很多功能。比如,netstat -p命令可以显示打开的socket对应的程序。

netstat -s则显示所有端口的详细统计信息。

20.12 tcpdump

tcpdump 是一个常用的网络抓包工具,用于捕获和分析网络数据包。它可以运行在大多数类 Unix 操作系统上,如 Linux、macOS、FreeBSD 等。tcpdump 命令提供了丰富的功能,可以捕获网络通信中的数据包,并以可读的方式显示这些数据包的内容。以下是 tcpdump 命令的基本用法和一些常用选项:

tcpdump [options] [expression]
其中:
options:用于指定 tcpdump 的一些选项,例如捕获的网络接口、抓包数量限制、过滤条件等。
expression:用于指定要过滤捕获的数据包的条件,例如来源或目的IP地址、端口号、协议类型等。
以下是一些常用的 tcpdump 选项:

  • -i <interface>:指定要监听的网络接口,如 eth0、wlan0 等。
  • -c <count>:指定抓包的数量限制,达到指定数量后 tcpdump 将自动退出。
  • -n:禁用域名解析,以 IP 地址的形式显示主机名。
  • -s <size>:指定抓取数据包时的最大长度。
  • -A:以 ASCII 码形式显示数据包内容。
  • -X:以十六进制和 ASCII 混合形式显示数据包内容。
  • -vvv:增加详细的输出信息。

以下是一些常用的 tcpdump 表达式示例:

  • host <ip>:捕获指定主机的数据包。
  • port <port>:捕获指定端口的数据包。
  • tcp:仅捕获 TCP 协议的数据包。
  • udp:仅捕获 UDP 协议的数据包。
  • icmp:仅捕获 ICMP 协议的数据包。
  • src <ip>:捕获指定源 IP 地址的数据包。
  • dst <ip>:捕获指定目标 IP 地址的数据包。

使用 tcpdump 可以帮助网络管理员和开发人员分析网络流量,排查网络问题,以及进行安全审计等工作。但请注意,tcpdump 需要以 root 权限运行,否则可能无法访问网络接口。因此,必要时可能需要使用 sudo 命令来执行 tcpdump

Logo

更多推荐