1. Posts/

Linux命令入门与总结

·4854 字·10 分钟
pwn入门 CTF PWN Ubuntu Linux
作者
ta0lve
一些记录,一点思考
PWN入门 - This article is part of a series.
Part 3: This Article

个人比较常用的Linux命令

基础知识(入门向) #

大部分内容都是copy自 珠天PearlSky-sevenG0师傅的 文章,师傅太强啦!

原文链接: https://mp.weixin.qq.com/s/mRPxdDJnS8boa7BNyxME3w

Linux 常用命令 #

# Linux 常用命令
# <------这个符号的内容后面是注释
# 下面的命令只做简单解释,不明白的可以自行百度

sudo [command] # 以系统管理员的身份执行指令,授权所执行指令的执行指令。

ls -al # 列出当前目录所有文件的详细信息 包括以 . 开头的隐藏文件

cd [path] # 切换工作目录到 path 下 . 表示当前目录 .. 表示上一级目录 / 表示根目录

pwd # 以绝对路径的方式显示用户当前工作目录

rm -rf [file] # 强制删除文件或目录

mv [file1] [file2] # 用来对文件或目录重新命名,或者将文件从一个目录移到另一个目录中

cp [file1] [file2] # 用来将一个或多个源文件或者目录复制到指定的目的文件或目录
	# 示例:将文件 file 复制到目录 /your/path/ 中:
	$ cp file /your/path/
	# 使用指令 cp 将当前目录 old/dir/ 下的所有文件复制到新目录/your/new/dir 下,输入如下命令:
	$ cp –r old/dir/ your/new/dir

less [file] # 允许用户向前或向后浏览文字档案的内容

cat [file] # 连接文件并打印到标准输出设备上

echo [string] # 打印一行文本,参数“-e”可激活转义字符

nc [ip] [port] # netcat 建立 TCP 和 UDP 连接IP地址的端口并监听

ps # 用于报告当前系统的进程状态

top # 实时查看系统的整体运行情况

kill # 杀死一个进程

ifconfig # 查看或设置网络设备

ping # 查看网络上的主机是否工作

netstat # 显示网络连接、路由表和网络接口信息

su # 切换当前用户身份到其他用户身份

touch [file] # 创建新的空文件

mkdir [dir] # 创建目录

chmod # 变更文件或目录的权限

chown # 变更某个文件或目录的所有者和所属组

uname -a # 找到对应内核版本全部信息

exit # 退出 shell

man [command] # 查看Linux中的指令帮助、配置文件帮助和编程帮助等信息

apropos [whatever] # 在一些特定的包含系统命令的简短描述的数据库文件里查找关键字

| # 管道命令符 将一个命令的标准输出作为另一个命令的标准输入

var=value # 给变量var赋值value

$var, ${var} # 取变量的值

`cmd`, $(cmd) # 代换标准输出

'string' # 非替换字符串

"string" # 可替换字符串

# 以下为一组命令
$ var="test";
$ echo $var
test
$ echo 'This is a $var';
This is a $var
$ echo "This is a $var";
This is a test
# end

$ echo `date`;
2023年 07月 14日 星期二 23:05:19 CST

$ echo $0
/bin/bash

常用快捷键 #

# Bash 快捷键
Up(Down) # 上(下)一条指令

Ctrl + c # 终止当前进程

Ctrl + z # 挂起当前进程,使用“fg”可唤醒

Ctrl + d # 删除光标处的字符

Ctrl + l # 清屏

Ctrl + a # 移动到命令行首

Ctrl + e # 移动到命令行尾

Ctrl + b # 按单词后移(向左)

Ctrl + f # 按单词前移(向右)

Ctrl + Shift + c # 复制

Ctrl + Shift + v # 粘贴

一些根目录的知识 #

  • /bin/sbin:链接到 /usr/bin,存放 Linux 一些核心的二进制文件,其包含的命令可在 shell 上运行。
  • /boot:操作系统启动时要用到的程序。
  • /dev:包含了所有 Linux 系统中使用的外部设备。需要注意的是这里并不是存放外部设备的驱动程序,而是一个访问这些设备的端口。
  • /etc:存放系统管理时要用到的各种配置文件和子目录。
  • /etc/rc.d:存放 Linux 启动和关闭时要用到的脚本。
  • /home:普通用户的主目录。
  • /mnt:这个目录让用户可以临时挂载其他的文件系统。
  • /proc:虚拟的目录,是系统内存的映射。可直接访问这个目录来获取系统信息。
  • /root:系统管理员的主目录。
  • /srv:存放一些服务启动之后需要提取的数据。
  • /sys:该目录下安装了一个文件系统 sysfs。该文件系统是内核设备树的一个直观反映。当一个内核对象被创建时,对应的文件和目录也在内核对象子系统中被创建。
  • /tmp:公用的临时文件存放目录。
  • /usr:应用程序和文件几乎都在这个目录下。
  • /usr/src:内核源代码的存放目录。
  • /var:存放了很多服务的日志信息

Linux命令执行小结 #

参考学习自lexsd6师傅的 文章,师傅太强啦!

文章链接:

[对linux 命令执行的总结 | lexsd6’s home]( https://lexsd6.github.io/2020/09/10/对linux 命令执行的总结/)


读取文件命令 #

cat # 由第一行开始显示内容,并将所有内容输出
	cat ./flag
	cat /home/flag
	cat flag|base64 # 在当前目录输出文件内容的base64编码	
	## 在getshell后如果我们实在找不到flag文件的话可以试着用find命令搜素一下
	find / -name flag*
	find / -name *flag

tac # 从最后一行倒序显示内容,并将所有内容输出

more # 根据窗口大小,一页一页的现实文件内容
	 # 可加-数字 一次显示的行数。+数字设置从第几行开始查看

less # 与more类似,但其优点可以往前翻页,而且进行可以搜索字符。在默认情况下翻页。
	# :q 退出

echo `less ./flag` #我们还可以反引号来进行指令替代
	#(以某一个指令的输出结果作为另一个指令的输入项)

head # 只显示头几行。
	 # 可加-c 设置一次显示的字符数。-n设置从显示行数
	 
tail # 只显示最后几行。
	 # 可加-c 设置一次显示的字符数。-n设置从显示行数
	 
nl # 类似于cat -n,显示时输出行号

sort # sort 命令默认用法也有读取文件的作用

paste # 在合并文件的同时也会输出文件的内容(可以只传一个文件名)

diff # diff在对比两个文件后,会将两个文件输出

od # od指令会读取所给予的文件的内容,并将其内容以八进制字码呈现出来
   # 我们可以通过 -a、 -c、 -ta 、-tc 选项将其转为可见字符显示出来
   
bzmore # bzmore将bzip压缩过的文件解压到标准输出
	   # 同时也可以将普通文件显示到标准输出
	   
bzless # 增强“.bz2”压缩包查看器,bzless比bzmore命令功能更加强大。在默认情况下翻页。

echo `bzless ./flag`# 我们同样可以用反引号来进行指令替代

m4 # m4 将输入拷贝到输出,同时将宏展开. 宏可以是内嵌的也可以是用户定义的

curl # curl 通过文件协议来读取文件。
curl file:///home/flag

目录读取命令 #

ls # ls 用于查看参数目录下的文件

dir # 与ls类似,用于查看参数目录下的文件

linux命令分割符 #

用linux命令时候,我们想用一行来执行多条命令时我们可以用命令分割符来操作。

‘;’ 符号 #

用;号隔开每个命令, 每个命令按照从左到右的顺序,顺序执行, 彼此之间不关心是否失败, 所有命令都会执行.用法:

command1 ; command2

# 在做pwn题目时我们可能会用到利用这个`;`的特性
# 比如执行system("xxx;/bin/sh")来getshell

单 ’|’ 符号 #

Linux所提供的管道符“|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入。连续使用管道意味着第一个命令的输出会作为 第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,依此类推.

command1 | command2

单’&’符号 #

默认情况下,我们命令行执行的进程是前台进程,这时就把Shell给占据了,我们无法进行其他操作,对于那些没有交互的进程,很多时候,我们希望将其在后台启动,可以在启动参数的时候加一个’&’实现这个目的。用法:

command1 & command2      #commond1 命令将会在后台进行
  • ‘&’前面的命令将会在在后端运行
  • 另外’&’也是可以套娃使用的
  • ‘&’与’;’的对比
    • ’;’是死板的从左到右,’&’是将右边的放入后台执行

双’&’符号(’&&’) #

与c语言的’&&’类似,’&&’表时逻辑且的意思。只有在 && 左边的命令返回真(命令返回值 $? == 0),&& 右边的命令才会被执行。用法:

command1 && command2

双’|’符号(’||’) #

与’&&’相反,’||’表示逻辑或的意思。只有在 || 左边的命令返回假,|| 右边的命令才会被执行。这和 c 语言中的逻辑或语法功能相同,即实现短路逻辑或操作

command1 || command2

I / O重定向 #

I / O重定向通俗的讲就是就是我们平时用到的那些就是经典的输出重定向>和输入重定向<.

但如过要深入点了解I / O重定向,还需要了解文件描述符。

文件描述符 #

在linux中,每个打开的文件都分配有一个文件描述符。但会保留描述符1到9。其中0、1、2是默认打开文件stdin, stdout和stderr的 文件描述符。

  • 0 是stdin(键盘设备文件) 又称为标准输入 ,是我们从键盘输入信息所在的文件
  • 1 是stdout(屏幕设备文件)又称为标准输出,是linux的正常输出信息。
  • 2 是stderr(错误消息输出到屏幕设备文件)又称为标准错误输出,是linux的错误输出信息。

如果还不理解stdout与stderr,看下下面这张图

image-20230829234400104

  • cat flag1 1>flag2cat flag1的标准输出未打印在屏幕上,而是重定向输出在文件flag2里。
  • cat flag1 2>flag2cat flag1并未报错,所以标准输出打印在屏幕上且flag2中的文件为NULL
  • cat flag3 1>flag2时,由于没有flag3文件,所以标准输出到flag2文件里且flag2中的文件为NULL
  • cat flag3 2>flag2时,由于没有flag3文件,cat flag3有报错但是未打印在屏幕上,而是重定向输出在文件flag2里

输入重定向 #

输入重定向是指把命令(或可执行程序)的标准输入重定向到指定的文件中。也就是说,输入可以不来自键盘,而来自一个指定的文件。所以说,输入重定向主要用于改变一个命令的输入源,特别是改变那些需要大量输入的输入源。

 <用法:
command < 文件 #等同于command 0< 文件 把文件当成输入源

<<用法:
<< flag
 
# 内容:
flag

输出重定向 #

输出重定向是指把命令(或可执行程序)的标准输出或标准错误输出重新定向到指定文件中。这样,该命令的输出就不显示在屏幕上,而是写入到指定文件。

command > 文件 
# 相当于command 1>文件 command标准输出就不显示在屏幕上,而是写入到指定文件。
#这用法会覆盖文件里的内容

command >> 文件 
# 相当于command 1>>文件 command标准输出就不显示在屏幕上,而是追加写入到指定文件。
#这用法不会覆盖文件里的内容


command 1> 文件 
#command标准输出就不显示在屏幕上,而是写入到指定文件。
#这用法会覆盖文件里的内容

command 1>> 文件 
#command标准输出就不显示在屏幕上,而是追加写入到指定文件。
#这用法不会覆盖文件里的内容

command 2> 文件 
# 相当于command 2>文件 command报错输出就不显示在屏幕上,而是写入到指定文件。
#这用法会覆盖文件里的内容

command 2>> 文件 
# 相当于command 2>>文件 command报错输出就不显示在屏幕上,而是追加写入到指定文件。
#这用法不会覆盖文件里的内容

command &> 文件 
# 类似于command 1>文件  2>文件 或command 1>文件  2>1 
#command标准输出与报错输出就不显示在屏幕上,而是写入到指定文件。
# 这用法不会覆盖文件里的内容

command &>> 文件 
# 类似于command 1>>文件  2>>文件 或 command 1>>文件  2>>1
#command标准输出与报错输出就不显示在屏幕上,而是追加写入到指定文件。
# 这用法会不会覆盖文件里的内容

&> 与 >& #

&>>&都允许将标准输出(文件描述符1)和标准错误输出(文件描述符2)都重定向到的文件里.如下图所示:

image-20230829235403805


看似&>>&一样,但如果重定向的是文件描述符时,两者这有点细微的:

image-20230829235525814

注意!在当前目录下,有个名为1的文件!!!

我们在执行ls 1&>flag2时,&>ls 1当成一条命令运行重定向到flag2里。

相当于执行的是(ls 1) &>flag2

我们在执行ls 1>&flag2时,&>ls当成一条命令运行重定向到sss里。

相当于执行的是(ls) 1&>flag2


命令替换 #

命令替换是指将命令的标准输出作为值赋给某个变量,bash Shell定义了两种形式进行命令的替换,两种形式的语法格式如下:

# 方式一: 
`Linux命令`

# 方式二: 
$(Linux命令)

image-20230830000114892

注:尽管$()和反引号在命令替换上是等价的,但是,$()形式的命令替换是可以嵌套的


附录 #

本文参考链接及推荐阅读:

CTF PWN新手入门篇 PWN学习大纲 (qq.com)

[对linux 命令执行的总结 | lexsd6’s home]( https://lexsd6.github.io/2020/09/10/对linux 命令执行的总结/)

PWN入门 - This article is part of a series.
Part 3: This Article