你已经学会了:用 <(command) 进行进程替换,可以让命令输出以文件的形式供其他程序读取。
不过,进程替换也可以用来向命令写入数据!
你可以用 tee 把数据复制到两个文件:
hacker@dojo:~$ echo HACK | tee THE > PLANET
hacker@dojo:~$ cat THE
HACK
hacker@dojo:~$ cat PLANET
HACK
hacker@dojo:~$
你也用过 tee,把数据同时复制到一个文件和一个命令:
hacker@dojo:~$ echo HACK | tee THE | cat
HACK
hacker@dojo:~$ cat THE
HACK
hacker@dojo:~$
那么,要把数据同时复制给两个命令呢?
正如 tee 的手册所说,它的作用是将数据写入文件和标准输出:
TEE(1) User Commands TEE(1)
NAME
tee - read from standard input and write to standard output and files
等等!你刚刚学过,bash 可以利用进程替换,让命令看起来像文件!
要向命令写入数据(输出进程替换),可以使用 >(command)。
如果你把 >(rev) 写成一个参数,bash 就会运行 rev 命令(这个命令从标准输入读取数据,将每行的字符顺序反转,再写入标准输出!),并将它的输入连接到一个临时的命名管道文件。
当其他命令写入这个文件时,数据就会进入该命令的标准输入:
hacker@dojo:~$ echo HACK | rev
KCAH
hacker@dojo:~$ echo HACK | tee >(rev)
HACK
KCAH
上面的例子中,依次发生了以下事情:
bash 启动 rev 命令,把一个命名管道(假设是 /dev/fd/63)连接到 rev 的标准输入。
bash 启动 tee 命令,把一个管道连接到它的标准输入,并将传给 tee 的第一个参数替换成 /dev/fd/63。tee 甚至从未见过 >(rev) 这个参数;shell 已经替换了这个参数,然后才启动 tee。
bash 使用内建命令 echo,把 HACK 输出到 tee 的标准输入。
tee 读入 HACK,将它写入标准输出,再写入 /dev/fd/63(它连接着 rev 的 stdin)。
rev 从标准输入读入 HACK,将它反转,然后把 KCAH 写入标准输出。
现在轮到你了!
本关提供了 /challenge/hack、/challenge/the 和 /challenge/planet。
运行 /challenge/hack 命令,并将它的输出复制为 /challenge/the 和 /challenge/planet 两条命令的输入!
记住,tee 可以接收多个输出目标,>(command) 就是其中一种目标。
如果需要复习这种方法,可以回顾前面的“用 tee 复制管道数据”和“用进程替换提供输入”两关。
小知识!
细心的同学会发现,下面两种写法是等价的:
hacker@dojo:~$ echo hi | rev
ih
hacker@dojo:~$ echo hi > >(rev)
ih
hacker@dojo:~$
通过管道传递数据不止一种方法!
当然,第二种写法难读得多,也更难扩展。
例如:
hacker@dojo:~$ echo hi | rev | rev
hi
hacker@dojo:~$ echo hi > >(rev | rev)
hi
hacker@dojo:~$
这样写就太绕了!
这里要记住的是:虽然进程替换是一个强大的工具,但它的用途相当专门,不要什么情况都用它!
通过 SSH 连接
在
个人设置 中绑定你的 SSH 公钥后,使用以下命令连接:
ssh hacker@dojo.pwn.college