有人可以解释一下这个命令吗:
echo "/bin/sh <$(tty) >$(tty) 2>$(tty)" | sudo at now;tail -f /dev/null
启动 root shell,但是这个命令:
echo "/bin/sh" | sudo at now; tail -f /dev/null
仅接受输入但不执行任何操作。
我确实明白它tail -f /dev/null
与第二个命令具有相同的效果,但是什么因素使得第一个命令与第二个命令不同。
我曾经发布过类似的问题:“ /bin/sh <$(tty) >$(tty) 2>$(tty) ”是什么意思? 但这个问题主要集中在上述命令之间的区别上。提前致谢。
答案1
在我看来,它们都做同样的事情,除了如何处理输入和输出。
“at” 命令的一个特性是它在单独的 tty 中启动,您键入的 tty 的输入和输出将被忽略。添加重定向会强制 at 命令从指定的 tty 读取(通过重定向输入并重定向输出 stdout 和 stderr)。
进一步澄清
$(tty)
意思是“运行命令 tty 并使结果成为命令行的一部分”。tty 标识你的屏幕终端。
< $(tty)
是一条指令,用于从任何设备 $(tty) 进行管道输入。同样
> $(tty) 2>($tty)
将 stderr(第一部分)和 stderr(2>)的结果输出到您当前的终端。
因此,即使异步启动,该命令也会与您的终端进行通信 - 假设 $(tty) 解析为您当前的终端。(您可以使用命令“echo tty”检查当前终端的值