Linux基础命令
# 1.Linux 介绍
Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年10月5日首次发布,它主要受到Minix和Unix思想的启发,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。Linux有上百种不同的发行版,如基于社区开发的debian、archlinux,和基于商业开发的Red Hat Enterprise Linux、SUSE、Oracle Linux等.
基本思想
Linux的基本思想有两点:第一,一切都是文件;第二,每个文件都有确定的用途。其中第一条详细来讲就是系统中的所有都归结为一个文件,包括命令、硬件和软件设备、操作系统、进程等等对于操作系统内核而言,都被视为拥有各自特性或类型的文件。至于说Linux是基于Unix的,很大程度上也是因为这两者的基本思想十分相近。
优点
1.Linux由众多微内核组成,其源代码完全开源;
2.Linux继承了Unix的特性,具有非常强大的网络功能,其支持所有的因特网协议,包括TCP/IPv4、TCP/IPv6和链路层拓扑程序等,且可以利用Unix的网络特性开发出新的协议栈;
3.Linux系统工具链完整,简单操作就可以配置出合适的开发环境,可以简化开发过程,减少开发中仿真工具的障碍,使系统具有较强的移植性;
2.Linux基础命令
1.1 界面切换
- CTRL+ALT+F3 -F7 自由切换
1.2 mkdir
- mkdir用于创建目录
- mkdir [选项] [目录名]
-p
创建多级目录,如果目录名称不存在,就新建一个
mkdir test1 test2
mkdir test1/test2
1.3 ls
-
ls
命令用于显示指定工作目录下之内容(列出指定目录所含之文件及子目录),ls
命令的输出信息可以进行彩色加亮显示,以区分不同类型的文件 -
用法:
ls [选项] [目录]
-
参数
-a
显示所有文件及目录 (. 开头的隐藏文件也会列出)-l
除文件名称外,也将文件型态、权限、拥有者、文件大小等资讯详细列出-h
以容易理解的格式列出文件大小- -r 将文件以相反次序显示(原定依英文字母次序)
- -R 若目录下有文件,则以下之文件亦皆依序列出
- -t 将文件依建立时间之先后次序列出
- -A 同-a,但是布列出"."以及".."
ls
ls -a
ls -l
ls -al
1.3 pwd
pwd
命令以绝对路径的方式显示用户当前工作目录。命令将当前目录的全路径名称(从根目录)写入标准输出。全部目录使用/分隔。第一个/表示根目录,最后一个目录是当前目录。执行pwd命令可立刻得知您目前所在的工作目录的绝对路径名称。
pwd
1.4 cd
cd
命令用于切换当前工作目录。- 用法 : cd [目录]
.
代表当前目录,..
代表上一级目录,cd ~
用于切换至登录用户家目录。cd -
用于回到上一个目录。
cd ..
cd .
cd ~
cd -
1.5 touch
-
touch
命令用于创建一个空白的新文件,如果同名文件已存在,则修改其时间属性。 -
touch [选项] [文件名]
-
参数
- touch -r A B 把A文件的时间copy给A
touch test2
1.6 cp
-
cp
命令主要用于复制文件或目录。 -
用法:
cp [选项] [源文件] [目录]
-
-r
:若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件。(递归) -
-p
:除复制文件的内容外,还把修改时间和访问权限也复制到新文件中。(保持默认属性) -
案例
cp test1 test2
cp -rp test1 test2
1.7 mv
mv
命令用来为文件或目录改名、或将文件或目录移入其它位置,也可以当作剪切。- 用法:mv [选项] [源文件/源目录] [目录]
- 参数
- -f: 如果指定移动的源目录或文件与目标的目录或文件同名,不会询问,直接覆盖旧文件。(直接覆盖不询问)
- -n: 不要覆盖任何已存在的文件或目录。(不覆盖已存在的文件)
mv test1 test2
1.8 rm
rm
命令用于删除文件或者目录。- 用法:
rm [选项] [文件\目录]
- -i 删除前逐一询问确认。
- -f 即使原档案属性设为唯读,亦直接删除,无需逐一确认。
- -r 将目录及以下之档案亦逐一删除。
rm test1
rm -f test1
rm test1/test2
rm -r test1 #递归删除
rm -rf ./* #递归删除当前目录下所有文件
rm -rf / #危险命令 删除所有文件ovo
- 注意:rm -rf是一条危险的命令,代表递归删除某文件,如rm -rf /是递归删除根目录下的所有目录和文件,该命令不会询问,一旦执行系统将崩溃
1.9awk
awk
是一种处理文本文件的语言,是一个强大的文本分析工具。
相比较屏幕处理的优点,awk
在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息。 awk
也是一个非常棒的数据处理工具!相较于sed
常常作用于一整个行的处理, awk
则比较倾向于一行当中分成数个字段
来处理。
awk
处理过程: 依次对每一行进行处理,然后输出。
命令的基本格式是:awk ‘{print($1)}’
cat 1.txt|awk '{print($2)}' #打印出文本中每行的第二个字段
cat /etc/passwd |awk -F ":" '{print($1)}' #-F指定分隔符,以“:”为分隔符,打印出文本中每行第一个字段
cat /etc/passwd |awk -F ":" '{print($1,"+++",$3)}' #打印出第一个字段与第三个字段,并在其中间添加+++内容
cat /etc/passwd |awk -F ":" '{print($1"+++"$3)}' #对比差异
cat passwd | awk -F ":" '{print $NF}' #打印出文本中每行的最后一个字段
cat passwd | awk -F ":" '{print $(NF-1)}' #打印出文本中每行的倒数第二个字段。$(NF-1)为倒数第二,依此类推。
2.0 sed 命令
sed
是stream editor(流编辑器)的简称,是一款强大的,并且有些复杂的程序。
sed
本身是一个管线命令,可以将数据进行替换、删除、新增、提取特定行等功能,主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。sed按行来执行命令。
接下来的实验,我们要以/etc/passwd文件内容为例子。
拷贝文件cat /etc/passwd > 1.txt
我们以一个例子来介绍sed
命令,sed 's/:/+/g'
s代表搜索,g代表的则是全文。不加g的话则是替换每行第一个出现的。所以这条命令代表的将文件中所有的:替换为+
sed 's/:/+/g'
cat 1.txt |sed 's/:/+/3g' #代表的则是从第三次匹配开始替换,依此类推。
sed -i 's/:/+/g' 1.txt #参数-i,直接修改文件,并非打印出来。
以上这些命令中是以/做为该命令的定界符,如果需要修改或者匹配的字段带有/则不能再使用/做为该条命令的定界符,可以使用任意的定界符,不冲突就行。cat passwd |sed 's!:!/!g'
以!号做为定界也是一样的。
此外,在此命令中,搜索位置使用^
代表一行的开头,$
代表一行的结尾。sed
是以行为单位执行的。
我们用如下案例展示:
cat ip.txt |sed 's#^#http://#g'`在每行之前加上`http://`。
cat ip.txt |sed 's#$#:8080#g'`在每行末尾加上“:8080”
sed '/^$/d' 2.txt删除空白的行。
sed '/^s/'d 删除文件中所有开头是s的行
2.1grep
grep这个名字来自于短语“global regular expression print”,所以我们能看出 grep 程序和正则表达式有关联。
本质上,grep 程序会在文本文件中查找一个指定的正则表达式,并把匹配行输出到标准输出。
命令格式: grep [options] [pattern] [filename]
案例:
cat passwd |grep root # 只显示带有root关键字的行
grep -e root passwd # 匹配有root的行
grep -v root passwd # 忽略匹配到的行
cat passwd |grep -E "root|sshd" # 包含多个可能性的行
cat passwd |grep -E '^r' # 以r开头的行
cat passwd |grep -E 'n$' # 以n结尾的行
grep “root” /etc/passwd /etc/shadow # 查询多个文件
grep "passwd" /etc -rn # -r 为递归 -n 显示关键字出现在第几行 在多级目录中对文本进行递归查找
2.2find
find
命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则 find 命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。
这是一个超级复杂的命令,最简单的模式为:find 路径 -name [名字]
。
案例:
find / -size 1000k #从根目录查找大小为1000K的文件
find -name '1*' #在当前目录下查找文件名以1开始的文件
find / -name '1*' #从根目录查找文件名以1开始的文件
find / -user farmsec1 #从根目录查找属主为farmsec1的文件
find / -group farmsec #从根目录查找属组为farmsec的文件
find /etc -type f/d #按sock类型查找,f代表文件,d代表目录
find . -type f -mtime -7 #搜索7天内当前目录下修改过的文件(-7代表7天内,7代表前7天那一天,+7代表7天前)
find . -type f -mmin -10 #搜索10分钟内当前目录下修改过的文件
find . -atime -1 -type f #搜索当前目录下一天内被访问的文件(-1代表1天内,1代表前1天那一天,+1代表1天前)
find . -amin -10 -type f #搜索当前目录下10分钟内被访问的文件
find . -ctime -1 -type f #搜索当前目录下一天内状态被改变(列如权限)的文件(-1代表1天内,1代表前1天那一天,+1代表1天前)
find . -cmin -10 -type f #搜索当前目录下10分钟内状态被改变的文件
find . -perm 777 #搜索处当前文件下符合777权限的文件
- exec选项
find 搜索路径 [选项] 搜索内容 -exec 命令2{}\;
find . -type f -perm 644 -exec ls -l {} \;
find / -exec grep "Hello" {} \;
find / -name "*.tmp" -exec rm -f {} \; (危险)
find / -name "*" -ctime +2 -exec rm -f {} \;(危险,别敲)
2.3 ag 命令
ag
类似grep
和find
,但是执行效率比后两者高。
最基本的用法为ag -g <File Name>
,从当前目录寻找文件
ag -g <File Name> # 类似于 find . -name <File Name>
ag -i PATTERN # 忽略大小写搜索含PATTERN文本
ag -A [number] PATTERN #搜索含PATTERN文本,并显示匹配内容之后的n行文本,例如:ag -A 5 abc会显示搜索到的包含abc的行以及它之后5行的文本信息。
ag -B [number] PATTERN #搜索含PATTERN文本,并显示匹配内容之前的n行文本
ag -C [number] PATTERN #搜索含PATTERN文本,并同时显示匹配内容以及它前后各n行文本的内容。
ag --ignore-dir <Dir Name> #忽略某些文件目录进行搜索。
ag -w PATTERN #全匹配搜索,只搜索与所搜内容完全匹配的文本。
ag --java PATTERN #在java文件中搜索含PATTERN的文本。
ag --xml PATTERN #在XML文件中搜索含PATTERN的
2.4 stat命令
用于显示文件信息:
用法:stat [文件或目录]
stat /etc/passwd
2.5 split 命令
split
命令可以将一个大文件分割成很多个小文件,有时需要将文件分割成更小的片段,比如为提高可读性,生成日志等。
参数:
- -b 按文件大小进行切割
- -l 按行数来进行切割
- -d 为使用数字为生成文件的后缀
- -a 指定后缀的长度
案例:
split -b 30k messages # 按照每个文件30K大小切割messages文件。
split -l 300 messages # 将messages文件切割为每3行一份。
2.6sort 命令
sort
命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出。
cat 1.txt|sort #默认的排序方式,从首字母开始
cat 1.txt|sort -t #按照字典进行排序
cat 1.txt|sort -n #按照数字进行排序
2.7 uniq 命令
uniq
用于报告或忽略文件中的重复行,一般与sort命令结合使用。
要注意先排序,后去重。因为uniq命令只能消除相邻且相同的行。
cat 1.txt |sort -n |uniq #排序去重
cat 1.txt|sort -n |uniq -c #列出重复的次数
cat 1.txt |sort -n |uniq -d #列出有哪些行是重复的
如统计IP地址的访问数量并按照数量进行排序: cat access_log |awk '{print($1)}'|sort|uniq -c |sort -nr |more
针对访问量最大的IP分析其访问内容: cat access_log |grep 'IP地址'|head -n 100
2.8 nl命令
nl
命令用于显示文件内容行号。
案例:
cat /etc/passwd |nl
2.9 curl 命令
curl
命令是一个利用URL规则在命令行下工作的文件传输工具。它支持文件的上传和下载,所以是综合传输工具,但按传统,习惯称curl为下载工具。作为一款强力工具,curl支持包括HTTP、HTTPS、ftp等众多协议,还支持POST、cookies、认证、从指定偏移处下载部分文件、用户代理字符串、限速、文件大小、进度条等特征。
用法:curl [选项] [url]
参数:
- -i 显示头部信息
- -v 显示请求全过程解析
- -O 下载
案例:
curl www.farmsec.com
curl www.farmsec.com -i
curl www.farmsec.com -v
curl -O https://bootstrap.pypa.io/get-pip.py 下载
3.0 wget命令
wget命令:用来从指定的URL下载文件。wget非常稳定,它在带宽很窄的情况下和不稳定网络中有很强的适应性,如果是由于网络的原因下载失败,wget会不断的尝试,直到整个文件下载完毕。如果是服务器打断下载过程,它会再次联到服务器上从停止的地方继续下载。这对从那些限定了链接时间的服务器上下载大文件非常有用。
wget https://bootstrap.pypa.io/get-pip.py
wget https://bootstrap.pypa.io/get-pip.py -O 123.py #自定义文件名
-c:继续执行上次终端的任务;可以在下载中断后再次使用。
如果文件比较大时,加入参数-b
,进行后台下载,然后可使用使用tail -f wget-log
查看进度。
3.Linux常用命令总结
3.1Linux 的命令格式
-
inux命令的格式表现为:命令+选项+对象
-
COMMAND options arguments
-
具体说明:
COMMAND: 表示命令的名称, 如 ls 。
options:定义命令的执行特性,可以有长短两种选项:
- 长选项: 用 -- 引导,后面跟完整的单词,如 --help
- 短选项: 用 - 引导,后面跟单个的字符, 如 -a
- 多个短选项可以组合使用,例如: -h -l -a == -hla, 但是长选项不能组合使用,如 --help后面就不能再跟另外一个单词了。
options也可以有自己的参数,注意:选项与选项之间、选项与参数之间、参数与参数之间必须有空格。
arguments:表示命令的作用对象,如上述示例中farmsec 就是ls命令的作用对象。
在Linux中严格区分大小写。
3.2Linux 获取命令帮助的方式
- 使用
-h
,–help
和man
可以查看命令的帮助文件
ping -h
cp --help
man cp
3.3绝对路径与相对路径
-
例如:
/dev/somedir/..
、/etc/password
而相对路径则是从当前目录说起: 即
./
。例如在当前目录为根的情况下的./usr/bin
和usr/bin
是一个目录。 -
.就是当前目录 ..就是上级目录
3.4 Tab键的使用
tab键的两大作用:
- tab补全:只需输入文件或目录名以及命令的前几个字符,然后按TAB键,如无相重的,完整的文件名或者命令立即自动在命令行出现;如有相重的,再按一下TAB键,系统会列出当前目录下所有以这几个字符开头的名字。
- tab键查看:在命令行下,只需输入例如m,再连续按两次TAB键,系统将列出所有以m开头的命令,(包括自定义的Bshell命令函数),对查找某些记不清楚的命令特有用。熟练使用tab键可提高工作效率。
3.5 四个特殊的文件名
. #代表当前目录
.. #代表上一级目录
- #代表上一个工作的目录
~ #代表家目录(root为/root,其他用户在/home下)
4. 文本查看相关命令
4.1 cat 命令
-
cat
命令用于打开文件查看文件内容。 -
用法:
cat [选项] [文件]
- cat -A 查看所有内容
-
案例:
-
利用cat创建文件书写多行内容(EOF是告诉她啥时候结束 也可以换符号,把>换成>>便可以是追加,对于特殊符号 例如$ 需要\转义):
-
cat >123.txt <<EOF >EOF
-
-
利用cat清空文件内容:
-
cat >1.txt <<EOF >EOF
-
-
简单查看:
-
cat /etc/passwd
-
-
4.2 echo 命令
echo
命令用于输出指定内容。- 用法:
echo '[文本]'
echo '123'
- 用
>>
和>
也可以将输出内容写入到文件中。
> #为覆盖
>> #为追加
4.3 more 命令
-
more
命令类似cat
,不过会以一页一页的形式显示,更方便使用者逐页阅读,而最基本的指令就是,按空格键Space
就往下一页显示,按Enier
键显示文本的下一行内容,按b
键就会往回(back)一页显示,按q
键退出。 -
用法:
more [选项] [文件]
案例:
more /etc/passwd
4.4 less 命令
less
与more类似,用less命令显示文件时,用PageUp
键向上翻页,用PageDown
键向下翻页。要退出less程序按q
键。
用法:less [选项] [文件]
案例:
less /etc/passwd
4.5 head 命令
-
head
命令用于查看文件的开头的内容。在默认情况下,head命令显示文件的头10行内容 ,读取多个文件时会自动加上标题 -
法:head [选项] [文件]
参数:
-n<行数> 显示的行数
案例:显示passwd文件前两行
head -n 2 /etc/passwd
4.6 tail 命令
-
tail
文件中的尾部内容。tail命令默认在屏幕上显示指定文件的末尾10行,如果给定的文件不止一个,则在显示的每个文件前面加一个文件名标题 -
用法:
tail [选项] [文件]
- 参数:-n<行数> 显示的行数
- -f 循环读取 即可以实时监控文件的内容
案例:查看passwd文件尾部三行内容。
tail -n 3 /etc/passwd
- 参数:-n<行数> 显示的行数
-
使用管道操作符
|
可以把一个命令的标准输出传送到另一个命令的标准输入中,连续的|意味着第一个命令的输出为第二个命令的输入,第二个命令的输入为第一个命令的输出,依次类推。
案例:只显示passwd文本的第五行,实际就是头尾组合了一下。
head -n 5 /etc/passwd |tail -n 1
4.7 wc 命令
wc
命令用来计算数字。利用wc指令我们可以计算文件的Byte数、字数或是列数。- 用法:
wc [选项] [文件]
- 参数:
- -l 显示行数
- -c 显示Bytes数
- -w 显示字数
- -L 打印最长行的长度
- -m 统计字符数
- 案例:
wc -l /etc/passwd
wc -c /etc/passwd
wc -w /etc/passwd
4.8 du 命令
du
命令可查看文件使用空间- 用法:
du [选项] [文件]
- 参数:
- -h 以K,M,G为单位,提高信息的可读性。
- 案例:
du -h /etc/passwd
4.9 df 命令
df
命令用于显示磁盘分区上的可使用的磁盘空间。默认显示单位为KB。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。- 用法:
df [选项]
- 参数:
- -h 使用人类可读的格式
- 案例:
df -h
4.10 diff 命令
-
diff
命令用于比较文件的差异,比较的时候以后面的文件为基准。 -
diff -i
代表比较时忽略大小写 -
diff
以逐行的方式,比较文本文件的异同处。如果指定要比较目录,则 diff 会比较目录中相同文件名的文件,但不会比较其中子目录。 -
案例:
diff 1.txt 2.txt
diff命令所参考的不是第一个文件,而是第二个文件,它的输出信息有以下几种字符:
c: 表示必须做一些修改才能使两个文件相同
a: 表示必须添加一些内容才能使两个文件相同
d: 表示必须删除一些内容才能使两个文件相同
让我们用几个实验来学习diff的输出含义:
5. 输入/输出重定向
大多数系统命令从您的终端获取输入并将结果输出发送回您的终端。
通常用于标准输出的命令的输出可以很容易地转移到文件中。此功能称为输出重定向。
正如命令的输出可以重定向到文件一样,命令的输入也可以从文件重定向。
5.1 输出重定向
-
当我们执行命令时,命令的输出会显示在终端上。但有时,我们需要命令的输出保存在文件中,这时就需要
>
和>>
对命令输出进行重定向。>
符号,是将命令的输出存入文件,并覆盖文件原本的内容。
ls > 1.txt
cat /etc/passwd > 1.txt
>>
符号,表示将命令输出结果追加入文件,不会覆盖文件内容。
echo '1' >> 1.txt
echo '2' >> 2.txt
5.2 输入重定向
- 正如命令的输出可以可重定向到文件,命令的输入也可以重定向到文件。一般使用
<
和<<
,其中<<
可以引入多行命令的输入。
pwd>1.txt
ls < 1.txt
- <<,则更为常用一些,它将运算符解释为读取输入的指令,直到找到包含指定分隔符的行。直到包含分隔符的行的所有输入行都被输入到命令的标准输入中。命令形式一般如下:
command << delimiter
document
delimiter
- 其中
delimiter
代表用户定义的分隔符,两个分隔符之间,是输入的多行参数。 - 如:
wc -l << EOF
abcd
1234
EOF
## 其输出结果为2,统计了输入的行数。
6. Linux 的文件结构
在Linux系统中有一个重要的概念:一切都是文件。 其实这是UNIX哲学的一个体现,而Linux是重写UNIX而来,所以这个概念也就传承了下来。在UNIX系统中,把一切资源都看作是文件,包括硬件设备。
在Linux系统中文件后缀是没有作用的,后缀名只是为了能让自己能够更好的区别文件的作用。
Linux系统中的各类文件被Linux使用目录树进行管理, 所谓的目录树就是以根目录/
为主,向下呈现分支状的一种文件结构。
与Windows 系统不同,Linux 系统没有C盘、D盘、E盘那么多的盘符,只有一个根目录(/),所有的文件(资源)都存储在以根目录(/)为树根的树形目录结构中。
- 这样做最明显的好处是,开发者仅需要使用一套 API 和开发工具即可调取 Linux 系统中绝大部分的资源。举个简单的例子,Linux 中几乎所有读(读文件,读系统状态,读 socket,读PIPE)的操作都可以用read函数来进行;几乎所有更改(更改文件,更改系统参数,写 socket,写 PIPE)的操作都可以用write函数来进行。
- 不利之处在于,使用任何硬件设备都必须与根目录下某一目录执行挂载操作,否则无法使用。我们知道,本身Linux具有一个以根目录为树根的文件目录结构,每个设备也同样如此,它们是相互独立的。如果我们想通过Linux上的根目录找到设备文件的目录结构,就必须将这两个文件系统目录合二为一,这就是挂载的真正含义。
下面我们来逐一介绍Linux根目录下的各个目录:
/bin
目录下包含了用户命令文件,也就是shell命令。/boot
包含了系统启动过程中所需要的所有内容。/dev
目录是设备文件或者专有文件的存放位置。/etc
目录包含了系统的配置文件。/root
用户专有的家目录。一个用户对自己的家目录拥有绝对的控制权。/lib
目录里面存放着共享库和内核模块。在系统的启动阶段和运行根文件系统的各种命令时,都需要用到这些共享库,所以必须与根文件放在一起。/media
与/mnt
是常见的挂载点./opt
目录系统附加软件的存放地址/sbin
目录必备的系统软件存放处。用户系统维护的软件和某些只限root用户使用的命令存储在/sbin /usr/sbin以及/usr/local/sbin目录下。/srv
目录某些服务进程启动以后,他们需要读取的数据会放在srv目录中。/tmp
目录存放临时文件。任何程序都不用对/tmp目录下的任何文件或目录负责。/var
目录包含着系统中绝大多数的随时变化着的数据,比如系统日志。/var的某些内容是不能共享给其他系统的,典型的就是/var/logs /var/run。当然某些是可以共享的,如/var/spool/news。
7. VI 编辑器
vi编辑器:vi
是Linux系统的第一个全屏幕交互式编辑程序,它从诞生至今一直得到广大用户的青睐,历经数十年仍然是人们主要使用的文本编辑工具,它可以执行输出、删除、查找、替换、块操作等众多文本操作,而且用户可以根据自己的需要对其进行定制,这是其他编辑程序所没有的。 vi编辑器具有三种模式:一般模式
、编辑模式
、指令模式
。 这三种模式可以通过观察vi界面的左下角判断。
在命令行执行vi [文件名]
命令可进入vi编辑器并编辑文件,如果没有同名文件则创建。
-
从
一般模式
输入字母i
进入编辑模式
,特征是左下角有插入字样。 -
在
编辑模式
下,可以用方向键移动光标,同时写入字符。 -
编辑模式
下按ESC
回到一般模式
。 -
一般模式
下按:
进入命令模式
。特征是左下角有:
。 -
命令模式
下常用指令:-
w # 保存 write q # 退出 quit wq # 保存并退出 q! # 不保存强制退出 set nu # 显示行号 wq! # 强制保存并退出
-
-
在
一般模式
下可使用的指令:-
/farmsec # 搜索“farmsec”内容 gg # 光标立马回到第一行 2 # 光标向下跳2行,以此类推 G # 移动到最后一行 dd # 删除当前行 d2j # 删除当前行和下两行 yy # 复制一行 y2y # 复制2行 p (小写) # 粘贴到光标之后 P (大写) # 粘贴到光标之前
-
8.系统管理命令
1. top 命令
第1行:top - 19:31:16 up 21:10, 2 users, load average: 0.00, 0.00, 0.00
内容 | 含义 |
---|---|
19:31:16 | 表示当前时间 |
up 21:10 | 系统运行时间 格式为时:分 |
2 users | 当前登录用户数 |
load average: 0.00, 0.00, 0.00 | 系统负载,即任务队列的平均长度。 三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。 |
第2行:Tasks: 109 total, 1 running, 108 sleeping, 0 stopped, 0 zombie
第3行:%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.3 hi, 0.0 si, 0.0 st
第2、3行为进程和CPU的信息 当有多个CPU时,这些内容可能会超过两行,其参数如下:
内容 | 含义 |
---|---|
109 total | 进程总数 |
1 running | 正在运行的进程数 |
108 sleeping | 睡眠的进程数 |
0 stopped | 停止的进程数 |
0 zombie | 僵尸进程数 |
0.0 us | 用户空间占用CPU百分比 |
0.0 sy | 内核空间占用CPU百分比 |
0.0 ni | 用户进程空间内改变过优先级的进程占用CPU百分比 |
99.7 id | 空闲CPU百分比 |
0.0 wa | 等待输入输出的CPU时间百分比 |
0.3 hi | 硬中断(Hardware IRQ)占用CPU的百分比 |
0.0 si | 软中断(Software Interrupts)占用CPU的百分比 |
第4行:MiB Mem : 1775.3 total, 1369.3 free, 162.4 used, 243.6 buff/cache
第5行:MiB Swap: 1640.0 total, 1640.0 free, 0.0 used. 1466.1 avail Mem
为内存信息
内容 | 含义 |
---|---|
KiB Mem:1775.3 tota | 物理内存总量 |
1369.3 free | 空闲内存总量 |
162.4 used | 使用的物理内存总量 |
243.6 buff/cache | 用作内核缓存的内存量 |
MiB Swap:1640.0 total | 交换区总量 |
1640.0 free | 空闲交换区总量 |
0.0 used | 使用的交换区总量 |
1466.1 avail Mem | 代表可用于进程下一次分配的物理内存数量 |
第6行: PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
为进程信息
列名 | 含义 |
---|---|
PID | 进程id |
USER | 进程所有者的用户名 |
PR | 优先级 |
NI | nice值。负值表示高优先级,正值表示低优先级 |
VIRT | 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES |
RES | 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA |
SHR | 共享内存大小,单位kb |
S | 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程 |
%CPU | 上次更新到现在的CPU时间占用百分比 |
%MEM | 进程使用的物理内存百分比 |
TIME+ | 进程使用的CPU时间总计,单位1/100秒 |
COMMAND | 命令名/命令行 |
2.w命令
w
命令用于显示已经登陆系统的用户列表,并显示用户正在执行的指令。 执行这个命令可得知目前登入系统的用户有那些人,以及他们正在执行的程序。单独执行w命令会显示所有的用户,您也可指定用户名称,仅显示某位用户的相关信息。 案例:
3.last命令
last
命令用于显示用户最近登录信息。单独执行last命令,它会读取/var/log/wtmp的文件,并把该给文件的内容记录的登入系统的用户名单全部显示出来。
用法:last [选项]
案例:
last
last -5 #只显示5行
/var/log/wtmp文件
wtmp文件是二进制文件,该日志文件永久记录每个用户登录、注销及系统的启动、停机的事件。因此随着系统正常运行时间的增加,该文件的大小也会越来越大,增加的速度取决于系统用户登录的次数。该日志文件可以用来查看用户的登录记录,last命令就通过访问这个文件获得这些信息,并以反序从后向前。
4. ps 命令
ps
命令是最基本同时也是非常强大的进程查看命令,使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束
用法:ps [选项]
参数:
- -A 显示所有进程(同-e)
- -a 显示当前终端的所有进程
- -u 显示进程的用户信息
- -o 以用户自定义形式显示进程信息
- -f 显示程序间的关系
- -x 显示所有程序,不以终端机来区分
- -aux 显示所有包含其他使用者的行程
ps -aux|more
ps -aux|grep root|more
USER | PID | %CPU | %MEM | VSZ | RSS | TTY | STAT | START | TIME | COMMAND |
---|---|---|---|---|---|---|---|---|---|---|
行程拥有者 | 进程ID | CPU 使用率 | 内存使用率 | 进程使用的虚拟内存大小,以K为单位 | 驻留空间的大小。显示当前常驻内存的程序的K字节数。 | 终端的号码 | 进程状态 | 进程开始时间 | 执行的时间 | 所执行的指令 |
STAT进程状态包括下面的状态:
- D 不可中断 Uninterruptible sleep (usually IO)
- R 正在运行,或在队列中的进程
- S 处于休眠状态 T 停止或被追踪
- Z 僵尸进程
- W 进入内存交换(从内核2.6开始无效)
- X 死掉的进程
- < 高优先级
- N 低优先级 L 有些页被锁进内存
- s 包含子进程
- + 位于后台的进程组
- l 多线程,克隆线程
5. netstat 命令
nettstat
命令用来打印Linux中网络系统的状态信息,可让你得知整个Linux系统的网络情况。
用法:netstat [选项]
参数:
- -a或--all:显示所有连线中的Socket;
- -l或--listening:显示监控中的服务器的Socket;
- -n或--numeric:直接使用ip地址,而不通过域名服务器;
- -t或--tcp:显示TCP传输协议的连线状况;
- -p或--programs:显示正在使用Socket的程序识别码和程序名称;
案例:
netstat -an
netstat -anltp
Proto | Recv-Q | Send-Q | Local Address | Foreign Address | State | PID/Program name |
---|---|---|---|---|---|---|
协议 | 网络接收队列 | 网路发送队列 | 本地地址 | 外部地址 | 端口状态 | 进程ID/程序名 |
协议:主要有tcp协议与udp协议, 网络协议是通信计算机双方必须共同遵从的一组约定。如怎么样建立连接、怎么样互相识别等。只有遵守这个约定,计算机之间才能相互通信交流。具体的内容,我们将会在之后的章节中介绍。
recv-Q 表示网络接收队列 表示收到的数据已经在本地接收缓冲,但是还有多少没有被进程取走。 如果接收队列Recv-Q一直处于阻塞状态,可能是遭受了拒绝服务 denial-of-service 攻击。
send-Q 表示网路发送队列
对方没有收到的数据或者说没有Ack的,还是本地缓冲区。 如果发送队列Send-Q不能很快的清零,可能是有应用向外发送数据包过快,或者是对方接收数据包不够快。
本地地址与外部地址,分别以本地IP+端口,外部IP+端口的形式表达。
- IP地址是IP协议提供的一种统一的地址格式,目前,你只需知道它是由4组从0到255的数字组成,以0.0.0.0至255.255.255.255的形式表达的,可以表示计算机的网络位置(地址)的地址格式。更详细的内容我们将会在后续章节中介绍。
- 端口(port),可以认为是设备与外界通讯交流的出口。目前您只需理解,如果把IP地址比作一间房子,端口就是出入这间房子的门,计算机上的各类服务借由此“门”与外界通信。一个IP可以有65535(216)个端口。在一个计算机上,每个服务都会启用一个端口。
state(当前端口状态)有以下几种状态:
端口状态 | 意义 |
---|---|
LISTEN | 侦听来自远方的TCP端口的连接请求 |
SYN-SENT | 再发送连接请求后等待匹配的连接请求 |
SYN-RECEIVED | 再收到和发送一个连接请求后等待对方对连接请求的确认 |
ESTABLISHED | 代表一个打开的连接 |
FIN-WAIT-1 | 等待远程TCP连接中断请求,或先前的连接中断请求的确认 |
FIN-WAIT-2 | 从远程TCP等待连接中断请求 |
CLOSE-WAIT | 等待从本地用户发来的连接中断请求 |
CLOSING | 等待远程TCP对连接中断的确认 |
LAST-ACK | 等待原来的发向远程TCP的连接中断请求的确认 |
TIME-WAIT | 等待足够的时间以确保远程TCP接收到连接中断请求的确认 |
CLOSED | 没有任何连接状态 |
6.lsof命令
lsof
命令用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需要root用户执行。
在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。
COMMAND | PID TID TASKCMD | USER | FD | TYPE | DEVICE | SIZE/OFF | NODE | NAME |
---|---|---|---|---|---|---|---|---|
进程的名称 | 进程ID | 进程所有用户 | 文件描述符,应用程序通过文件描述符识别该文件 | 文件类型 | 指定磁盘的名称 | 文件的大小 | 索引节点(文件在磁盘上的标识) | 打开文件的确切名称 |
案例:
lsof 1.txt #查看哪些进程打开了1.txt文件
lsof -c sshd #查看sshd服务所打开的文件
lsof -i :22 #查看22端口有哪些进程在访问
lsof -p 1168 #查看1168进程号所打开的文件
lsof -u 0 #查看uid为0的用户打开的文件
lsof|grep /var/log/ #查看/var/log/下的文件被哪些进程打开
- 利用lsof命令恢复已经删除的文件
需要恢复已删除的文件前提条件是还有进程打开这个文件,比如遭到黑客入侵往往总是会删除一些日志、木马文件等,假设我们ssh的登录日志被删除了,我们使用lsof
查看,可以看到最后面有(deleted)这个状态。
lsof |grep /var/log/messages
这里pid对应的是699,所以我们需要查看699进程打开的文件描述。
cd /proc/699/fd
ll
找到被删除的文件然后复制出来 改名字 就算是恢复了
7.Kill 命令
kill
命令用于结束进程。
用法:kill [选项] pid
案例:
kill -9 123456 #彻底杀死进程号为123456的进程
8. which 命令
which用于查找并显示给定命令的绝对路径,可以看到某个系统命令是否存在 用法:which [命令] 案例:
which cd
9.rpm -Va 检查文件完整性
10. xargs 命令
xargs
是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具。它擅长将标准输入数据转换成命令行参数,xargs能够处理管道或者stdin并将其转换成特定命令的命令参数。xargs也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。 xargs的默认命令是echo,空格是默认定界符。这意味着通过管道传递给xargs的输入将会包含换行和空白,不过通过xargs的处理,换行和空白将被空格取代。xargs是构建单行命令的重要组件之一。
cat flag.txt|xargs 一行显示,但是是到序
cat flag.txt |xargs -n 3 #将内容排序,每行三个字段
ls * |xargs -n1 cat #将前面的结果传递作为子参数传递给后面的命令
cat 1.txt|xargs -n1 echo 'hello'
9.kali 启用root
- 这里以kali调试来举例
Root用户,也称为根用户,是Unix系统(如Linux、QNX等),及Android和iOS移动设备系统中的唯一的超级用户,因其可对根目录执行读写和执行操作而得名。其具有系统中的最高权限,如启动或停止一个进程,删除或增加用户,增加或者禁用硬件,添加文件或删除所有文件等等。
kali系统安装过后,默认未非root,具备管理员权限。这是出于系统安全考虑的设置,但不利于我们下一步学习掌握kali系统。因此需要将kali设置为以root用户管理。
两种方法可以实现root用户登录
- 修改配置文件
sudo -s
vi /etc/pam.d/gdm-autologin
vi /etc/pam.d/gdm-password
vi /etc/passwd
password
init 6
1.1 使用命令
sudo -s
,并输入密码。1.2 输入命令:
vi /etc/pam.d/gdm-autologin
,注释下图所示
1.3 输入命令
vi /etc/pam.d/gdm-password
,同上
1.4 输入命令
vi /etc/passwd
。将文本第一行改为下图格式。
输入
password
命令设置root用户密码。输入
init 6
重启计算机。(init 0
为关机)
- 通过安装包实现
apt-get install kali-root-login
命令安装软件包
安装完成后,输入命令passwd
修改root密码
init 6 重启后用root登录