前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Ubuntu Server 第二章 命令行基础

Ubuntu Server 第二章 命令行基础

作者头像
天钧
发布2019-07-26 17:08:03
1.2K0
发布2019-07-26 17:08:03
举报
文章被收录于专栏:渗透云笔记渗透云笔记

第二章 命令行基础

说明,此笔记来源于苑老师的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命令

代码语言:javascript
复制
 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":无论当前情况强制结束
代码语言:javascript
复制
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信息,找到”块“,读取数据。

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

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

代码语言:javascript
复制
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下目录是大于分区。

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

代码语言:javascript
复制
tree / #tree命令能够直观的展示目录结构

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

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

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

echo * #"*"匹配任何字符串,特殊语句通配符,在这里是通配符,有接触正则的朋友请区分,在文本工具中(awk、sed)叫做正则
ls a* #匹配以当前目录"a"开头的文件和文件夹
代码语言:javascript
复制
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
代码语言:javascript
复制
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中“万物皆文件”。

代码语言:javascript
复制
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……
代码语言:javascript
复制
file filename #可以是文件,也可是是一串文件列表
-b #显示摘要信息,不显示文件名
-i #mime类型
stat filename #查看文件的时间属性

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

代码语言:javascript
复制
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时间等
代码语言:javascript
复制
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使用方式

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

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

代码语言:javascript
复制
#除了"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+命令”即可看到对应的命令帮助。

代码语言:javascript
复制
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"

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

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

Shell输入与输出

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

代码语言:javascript
复制
"|"、">"、">>"、"<" #利用管道和重定向符号
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)等等。

代码语言:javascript
复制
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下,也有类似的打包程序

代码语言:javascript
复制
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“身份来执行、

代码语言:javascript
复制
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中的通配符与正则表达式

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 渗透云笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第二章 命令行基础
    • 基本Shell命令
      • 目录结构命令
        • 快捷键及VI文本编辑
          • 获取帮助
            • Shell输入与输出
              • 进程管理
                • 归档打包和压缩
                  • 参考链接
                  相关产品与服务
                  容器服务
                  腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档