Ubuntu Server 第二章 命令行基础

第二章 命令行基础

说明,此笔记来源于苑老师的Ubuntu Server入门到精通

在企业Linux Server 坏境中,经常是没有图形环境,只有一个终端窗口(黑乎乎的命令行和闪动的提示符)。Linux的前身是Unix,保留着很多Unix下的使用习惯,所以大多数命令也适用于其他UNIX系统,比如我比较熟悉的思科路由器底层。

先来认识下Shell(壳),Shell本身就是一个程序,这段程序能够运行其它程序,硬件的驱动硬件(加载驱动)、进程管理、分配硬件资源(内存管理)都是由内核来完成, 出于权限、安全等问题,不允许直接操控内核,如果有学过编程的朋友,发现shell的功能和命令解释器非常类似。本质上来说,确实是,解释用户输入的命令到内核,我们还可以使用shell命令写成shell脚本。

shell有很多种,最常用的是bash(Ubuntu 默认 Shell),还有安全行业的 web shell 、SQL shell 等,bash的前身是贝尔实验室开发UNIX时使用的Bourne shell ,一般终端(shell)打开的提示符格式是"用户@主机名:~"," "表示用户家目录和非root账号。如果是这样"~#"表示用户叫目录和root账号。

基本Shell命令

 cat #合并显示多个文件内容
 echo a>a & echo b>b #如果完全零基础的朋友,不用理解,跟着做。
 cat a b #发现同时显示的a 和 b
 cat a #只显示了a
 cat #光标闪动,输入什么,返回什么

从上面这个实验中,可以引出一个概念,输入和输出,cat是一段程序,输入给cat一些内容,得到一些输出结果。其实计算机本质上就是一个根据用户的输入,通过计算、解释给用户的一种机器。计算机的程序也是在做类似的事,一个程序调用内存的运行起来后,它要接受一些人为或者其它程序输入的内容,程序运行起来之后叫做进程,Linux为每一个进程配备了输入流与输出流,注意输入和输出可以是文件、设备、终端、甚至另一个进程的I/O,Linux为每个进程分配了默认的输入和输出称为stdin/stdout。比如上面使用的cat命令的stdin/stdout就都是终端。除了上面两个标准流,还有第三个标准流stderr(错误输出),进程出现错误时便会使用stderr。两个快捷键:

  • "Ctrl +D":结束当前输入
  • "Ctrl+C":无论当前情况强制结束
ls #列出目录里的内容,指定目录显示指定目录的内容,一般目录、文件、链接 显示的文字颜色不一样,注意Linux对大小写敏感,Win下大写文件名与小写文件名是同一个目录,下面是这个命令的一些参数,不用刻意记忆,只需要不断使用便能熟悉。另外"ll == ls -la",其它发行版可能没有
-l #显示详细内容(权限、inode编号、属主、属组、大小、修改时间mtime)
-a #包括隐藏的所有内容,Linux下文件名以"."开头的文件使用"ls"无法查看
-d #只显示目录自身信息
-i #显示inode信息
-S # 按文件大小排序
-r #倒序排列
-t #按修改时间排序
-h #以可阅读的方式显示
drwxr-xr-x  2 xiaowu xiaowu 4.0K Apr 24 20:09  Test #举例说明一行内容
"d"文件类型是目录 "rwx"属主权限可读可写可执行 "r-x"属组权限可读可执行 "r-x"其它用户可读可执行  第二列  文件硬链接或子目录数  属主于"xiaowu" 属助与"xiaowu" 4k大小   "Apr 24 20:09"修改时间  "Test"文件名

这里解释下inode编号,文件储存在硬盘上,硬盘的最小单位叫做”扇区“(Sector),每个扇区储存512字节(0.5KB),多个扇区助成的”块“(常见的是4K),是文件存取的最小单位,操作系统读取硬盘的时,为了提高效率,一次性连续读取一个块,文件数据储存在”块“中,文件的元信息(文件创建者、创建日期等)储存在inode中,每个inode都对应一个号码,操作系统通过识别不同的inode来识别文件,读取文件时,是先根据inode找到inode信息,通过inode信息,找到”块“,读取数据。

cp #拷贝
cp file1 file2 #file1 拷贝至新的名称file2,参数可以是完整的相对路径和绝对路径,可拷贝多个文件到一个目录
-R/r #拷贝目录及其中的全部内容
-L #硬链接拷贝,使用该选项时,新的文件与旧的文件inode编号相同
-s #软连接拷贝,使用该选项是,新的文件链接至源文件
-S #目标名称添加后缀
-u #源比目标新是才拷贝

可能你学到这里已经有点头晕,当你命令只记得开头字母时,可是使用”TAB“进行自动补全。

mv #移动,mv有点类似,cp到另一个路径之后,删除源文件效果也就和mv相同了
mv file1 file2 #如果同以目录下,效果就是重命名
mv file1 file2 /dir #移动多个文件到同一个目录下
"-f" #强制移动、覆盖目标


touch file#创建空文件,若文件名已存在,修改文件mtime,不修改内容

rm filename #删除
-rf #强制和递归
-i #删除前提醒
-d #删除空目录
介绍下万恶之源"rm -rf /"

echo #将命令参数显示在stdout(标准输出),如果想输出"""符号,请加"\”进行转义
\n #换行符,这里还有其余一些转义符,自行了解
-n 显示结束不换行
-e 解释反斜线字符
echo $USER #echo可以获取坏境变量中的数值,"$"后面还可以使用更多

目录结构命令

Linux的目录结构和windows有很大区别,windows由下至上至盘符(不同分区)结束。Linux下目录是大于分区。

借用实验楼它们家的图,这个图做的非常简单明了,也推荐使用他们家的课程学习。

tree / #tree命令能够直观的展示目录结构

FHS(文件系统层次结构标准)是一个标准,不同发行版遵守着这个标准,使类Unix系统使用体验类似。这里我们需要引入两个概念相对路径和绝对路径

pwd #pwd可以查看当前所在的目录
-P 物理路径 #如果处于软连接目录下,使用此参数将直接显示链接真实位置
-L 逻辑路径 #显示和不加参数一样
cd ../ #进入该及目录的上机目录,相对路径,"."在目录中代表着当前目录,".."在目录中代表着上一级目录
cd /home/xiaowu/ #从根(/)开始进入指定目录,绝对路径
mkdir filename #创建目录,可指定路径 "-p"可创建多层目录

rmdir #删除空目录,"-p"可删除多层目录

echo * #"*"匹配任何字符串,特殊语句通配符,在这里是通配符,有接触正则的朋友请区分,在文本工具中(awk、sed)叫做正则
ls a* #匹配以当前目录"a"开头的文件和文件夹
grep #grep是一个文字搜索工具,它会从输入流中搜索符合正则表达式的,并把结果打印到标准输出
-i #忽略大小写
-v #反向匹配
-n #显示行号
-r #递归目录及子目录中所有文件
-c #显示输入流中包含关键字的行数
grep xiaowu -n /etc/passwd #查找"/etc/passwd"文件下包含"xiaowu"的并显示该行的行数
grep -f a.txt b.txt #a.txt中多个关键字同时匹配
grep a[123] a.txt #匹配的结果将是a1、a2、a3……
grep -E '1|2|3' a.txt #匹配的结果是1或者2或者3
more filename #每次查看一页,使用空格键翻页
less filename #直译为少一点,是more的增强版,和cat的区别在于他是每次显示一页的内容
v #进入编辑模式,终端下方有快捷键说明
Z/B #向前/向后翻页
g/G #直接跳到第一行/最后一行(或者第n行)
/word #向前搜索关键词
?word #向后搜索关键词
n/N #正向/反向搜索关键词,这个键是和上一条命令配合使用
q #退出
grep root /etc/passwd | less #可以结合管道符使用

head -n filename #默认查看文件前面10行内容,可指定
tail -n filename #默认查看文件尾10行内容,可指定,参数"-f"可实时查看内容=='tailf'

前面介绍了很多命令工具,我们说Linux中只有两种对象,文件和进程。而进程也只是运行中的文件,那其实只有一种对象,那就是文件。而这就是Linux中“万物皆文件”。

diff filea fileb #diff是一个文本比较工具,在配置文件比对的时候很有用,注意:可以对文件夹使用,只会比对相同文件名的文件
diff 1.txt 2.txt #示例,使用"-u"参数 同一格式输出,使用"-y"参数并排输出,配合"-W"指定宽度,另外还有"-w"忽略空格,"-i"忽略大小写
1c1
< aaaaaaa
---
> aaaaaab
"1c1"表示"c-change:内容不同";还有"d-delete 文件一比文件二多";"a-add 文件二文件一多"

下面介绍一个查看文件格式的工具,熟悉Windows的朋友都知道Windows是一文件名后缀来区分文件格式的,一旦更改文件后缀就无法执行原有的功能。Linux使用“file"来识别文件格式,通过识别文件头部的特殊标识依次匹配测试集,匹配到结果就停止执行并返回结果。测试集依次是:

  • filesystem:匹配系统头文件 ,这个文件定义了linux下的文件特征
  • magic:匹配文件头部魔术值,-l参数查看
  • language:匹配文件起始字符类型,ASCII、UTF-8……
file filename #可以是文件,也可是是一串文件列表
-b #显示摘要信息,不显示文件名
-i #mime类型
stat filename #查看文件的时间属性

Linux下有着大量的文件,找到想要的文件就是一个问题。Linux提供了快速查找的工具

locate filename #速度非常快,不准确(基于文件索引周期性生成数据库,搜索的过程只是检索数据库,使用"sudo updatedb"更新索引)
find filename #默认搜索范围为当前目录,注意访问权限,filename中可使用通配符
sudo find / -type f -user username -mtime +1 -mtime -20 -name 1.txt #参数可分开使用,type可指定"b"(块文件)、d(目录)、c(字符管道文件)、p(管道文件)、l(符号链接文件) ,还可以指定用户,指定mtime时间等
sort filename #对内容重新排序,默认是以首字母规则排序,一般文本文件好用
-r #方向排序
-n #按数值大小排序
-M #按月份排序
ls -l --sort='size|time|extension' #"ls"命令也可以排序

快捷键及VI文本编辑

就和win10一样,用好快捷键能提升你的工作效率,下面介绍一些常用的快捷键,这些快捷键不仅在命令行下常用,使用SSH终端(例如Xshell)时也经常使用,

  • Ctrl+P/N/B/F:上下左右
  • Ctrl+A/E:光标移动至开头/至结尾
  • Ctrl+W:删除光标前一空格分隔段落
  • Ctrl+U/K :删除光标到行首/到行尾
  • Ctrl+Y:黏贴删除的内容

由于Linux所有对象都是文件,各种服务的配置也基于文件,好用的文本编辑器就非常有必要,常见的vi(vim是它的增强版)、nao、Emacs……,苑老师表示不要有vim和Emac什么”编辑器之神“透露的优越感,不要执着与工具,工具服务人,按自己使用习惯就好。这里介绍常用的vim使用方式

vimtutor #直接输入vi会进入vi的教程,推荐查看
vi filename.txt #文件存在会打开文件开始编辑,不存在则新建
#vi有3种我们常用的模式:
#一般命令模式:从编辑模式按ESC进入
#命令模式:从一般命令模式按":"进入,此时终端行尾出现一个输入框,按ESC回到一般模式
#编辑模式:一般命令模式按i(光标前插入)、a(光标后插入)、o(下一行插入并编辑)
#移动光标使用K、J、H、L(上下左右),小键盘方向键也可以使用

vi的功能按键对新手来说有点复杂,你需要的是不断的使用它,忘记的命令查手册,随着你的使用你会逐渐得心应手。

#除了"i、a、o",一般命令模式下还有这些命令
#A:在行末添加文本 I:在行首添加文本 O:在上一行插入空行并编辑
#D:删除光标到行尾内容 dd:删除光标所在行内容 ndd:从光标所在向后删除n行(包括所在行) nyy:从光标所在行向下复制n行
#p:黏贴  
# "Ctrl + f":向后翻页 "Ctrl+B" :向前翻页
#命令模式下
#/str:向前搜索字符串 ?str:向后搜索字符串 set nu(number):显示行号 wq:保存并退出
#set nonu(nonumber):不显示行号 q!:不保存强制退出   f:显示当前文件名 
# n:跳转到n行(经常启动服务是会报错某某文件第几行错误,直接跳转到此行检查错误) $:光标移动至末行首
# 1,$s/A/B :从第一行到尾行 替换A成为B  n filename:编辑下一个文件(需要先保存更改)

获取帮助

上面我提到一个操作,查看手册,你可以记不住命令,但你要知道如何通过文档找到它,如果整个工作过程都在查手册就比较尴尬,对帮助手册有个大概的了解,会让你更高效率的查找。Linux传统有完善的文档体系,Manual是最主要的帮助手册,使用“man+命令”即可看到对应的命令帮助。

man -k keyword #搜索关键词,找到包含此关键词的文档
man {1~8} command
查看man手册时,左上角有一个索引编号,每一个索引编号(1~8),代表着一类的手册,注意,有的命令可能只有部分索引编号,下面说明一下索引编号代表的含义
1:用户命令 2:系统调用 3:高级Unix编程库文档(开发人员常用) 4:设备接口和驱动信息(很少使用)
5:文件描述(系统配置文件) 6:Games 7:文件格式,惯例,编码(ASCII、UTF8等) 8:系统命令和服务器

LInux内核的研发者GNU(自有软件基金会)推出另一种帮助手册"info"

info command #如果man手册里找不到你想要的信息,可以尝试"info"获取
很多软件没有官方提供的man手册,开发者往往在软件包里留下README文件给使用者一些指导

前面我们演示很多遍的“-h/--help"也是频繁使用的帮助命令,最后实在找不到帮助,那么搜索引擎是一个好的选择

Shell输入与输出

前面在基本Shell命令一章中简单的介绍下Shell中输入流、输出流、输出错误流的概念。大部分进程的默认输入都是文件或者终端,注意我用了默认这个词,意思是不是我可以更该呢?答案是可以的,这就是我要介绍的。输入流、输出流、错误输出流的文件描述符是0、1、2,文件描述符是LInux内核定义已打开文件所创建的索引,这样描述你可能依然听不懂,看下面例子你就明白了。

"|"、">"、">>"、"<" #利用管道和重定向符号
ifconfig | grep "inet" #将"ifconfig"命令的输出作为"grep "inet" "的输入
ls >file #将ls的输出结果重定向到file文件中,使用"set -c"可禁止覆盖重定向覆盖文件
ls >>file #将ls的输出结果重定向追加到fiLe中
ls < 1.txt #使1.txt的文件内容做为"ls"命令的输入
ls osjdijf >stdout 2>stderr #标准输出到"stdout“ 错误输出输出到"stderr"
使用DocKer服务的朋友经常看到这样的一键代码
"sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://15a26sup.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docke"
这段代码中使用的EOF是自定义终止符,注意可自定义,结合重定向在脚本中非常好用

使用命令时经常会遇到错误,常见的错误说明如下

  • "No such file of directory"(查看不存在的文件目录)
  • "File exists"(创建于文件同名的目录)
  • "Not a Directory,ls a directory"(把文件当目录)
  • “No space left on device"(磁盘空间不足)
  • "Permission denied"(权限不足,一般加”sudo"解决)
  • "Operation not permitted"(杀掉不属于自己的进程)
  • "Segmentaion fault,Bus error"(程序访问禁用内存)

前面部分命令中使用了管道符,部分笔记表示的是或的关系,这里介绍一些在shell命令中常用的有着特殊作用的符号,注意,管道符和管道是不同的概念

  • ”;“:连接符号,可以是命令在同一行内
  • "&":后台执行符号
  • "&&":命令逻辑与
  • "||":命令逻辑或
  • …… 还有一些不常用了

进程管理

进程就是运行中的文件,使用"ps" 不加参数执行,结果默认会显示4列信息,为了区分不同的进程,给进程分配了ID,这就是PID。TIme为进程运行的CPU小号的时间。最后显示名称 COMMAND.Linux经常有多个终端同时使用,TTY则注明是哪个终端。进程有不同的状态,常见的有"R“(Runnable)、"S"(Sleeping)等等。

ps #用于显示当前进程的状态,参数比较多,此次值介绍了常用的
-x #当前用户启动的程
-ax #所有用户的进程
-u #显示详细信息,常用“ps -aux"或者"ps u pid"搭配使用
-w #显示进程文件完整的路径
Linux最初的进程为PID为0,随后以父进程和母进程的结构关系类似树形结构,使用"ps fajx"或者"pstree"可查看这个结构
kill pid #杀掉进程
kill -STOP pid #暂停进程
kill -CONT pid #继续进程
kil -l #可以例如信号名称,我这里没有数字,信号名称和信号代表的数字为对应关系,常用"kill -9 pid"来无条件终止进程

归档打包和压缩

在windows下经常使用winrar或者7zip(有Linux版本)等好用的打包工具,在Linux下,也有类似的打包程序

Linux标准的压缩程序为 gzip file(gunzip解压),只能对单个文件解压缩,对多个文常用的是"tar"命令
tar zcvf file.tar.gz  file1  file2 #"z":调用gzip压缩 c":创建归档 "v":详细诊断输出 "f":文件包名 
tar zxvf file.tar.gz #解压,注意,这里只是为了方便识别而起了文件名
tar tvf file.tat.gz #测试解压
tar jcvf file.bz2 file1 #调用bzip压缩,bzip对文本压缩币gzip压缩比高

前面我说遇到权限问题时使用”sudo“,那么”sudo“的作用是什么呢,LInux下最高的权限为root,Ubuntu发行版出于安全性的考虑,使用户创建了普通用户,需要执行关键操作是,使用”sudo"来允许用户已”root“身份来执行、

cat /etc/group |grep $USER 
#其中有一个"sudo"助定义了可以使用"sudo"命令的用户
#如果系统安装完成后需要赋予sudo权限
sudo vim /etc/sudoers #修改配置文件,这是一种方法
sudo adduser username
sudo usermod -aG sudo username #使用命令,推荐这种

最后 ,命令纯手敲,整个五一假期敲出了这篇笔记,原计划一天敲出,太高估我自己了,祝各位在学习安全的路上的朋友享受这个过程。

参考链接

Ubuntu Server 从入门到精通

流、管道和重定向

Linux的4个主要部分:内核、Shell、文件结构和实用工具

真正理解linux的inode?

理解inode-阮一峰

linux中的通配符与正则表达式

本文分享自微信公众号 - 渗透云笔记(shentouyun)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券