谁能解释一下这是什么意思:
SHELL=/bin/bash script -q /dev/null
它用于升级 CTF 中的 shellHTB:
SHELL=/bin/bash script -q /dev/null
Ctrl-Z
stty raw -echo
fg
reset
xterm
它与这篇文章中的类似:将简单的 Shell 升级为完全交互式 TTY,但我不明白它的作用。
man script
说:
NAME
script - make typescript of terminal session
SYNOPSIS
script [options] [file]
script makes a typescript of everything displayed on your terminal. It is useful for students
who need a hardcopy record of an interactive session as proof of an assignment, as the type‐
script file can be printed out later with lpr(1).
和
-q, --quiet
Be quiet (do not write start and done messages to standard output).
答案1
所以,这里的上下文似乎是你有一个到某个地方运行的 shell 的普通 TCP 连接,可能使用类似于netcat
你的终端的东西。我所说的“普通”是指 shell(其 stdin/stdout)直接连接到网络套接字,而不是通过 SSH 等为 shell 提供伪终端 (pty) 的方式。
伪终端很重要,因为这是所有智能发生的层,例如处理 ^C 和 ^Z 等。
SHELL=/bin/bash script -q /dev/null
它script
在环境变量SHELL
设置为/bin/bash
以及参数-q
和 的情况下运行/dev/null
。要点script
是记录 shell 会话获取的所有内容作为输入并作为输出打印,为此,它使用 pty。它还在运行时传递所有内容。创建 pty 是这里的重点,而不是发送到的实际记录/dev/null
。-q
只是script
在启动时不打印消息。
Ctrl-Z
假设我们通过以下方式连接到远程netcat
,当地的终端可能处于处理 ^Z 的模式。所以这会挂起本地netcat进程。
stty raw -echo
然后我们将本地终端置于原始模式,这样它就不会干扰远程pty。
fg
并再次启动netcat。现在,我们有一个在远程端打开了 pty 的 shell,并且本地终端不会干扰它。
reset
重置远程终端,我不确定这是否有必要。在您链接到的文章中,他们似乎需要它,但没有它对我来说效果很好。
重置当地的结束远程后的终端script
可能会更困难,因为这样你的本地终端就处于原始模式,在远程上运行连接的 netcat,并且很难杀死该 netcat。但是然后你可以杀死本地 xterm/屏幕窗口/无论你的 shell 运行在什么地方。或者可以exec script
在远程运行。