Bash
Shell 升級:使用 bash 編寫 typescript 命令
誰能解釋一下這是什麼意思:
SHELL=/bin/bash script -q /dev/null
它用於在HTB中升級 CTF 中的外殼:
SHELL=/bin/bash script -q /dev/null Ctrl-Z stty raw -echo fg reset xterm
它與本文中的類似:將簡單外殼升級到完全互動式 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).
所以,這裡的上下文似乎是你有一個普通的 TCP 連接到某個地方執行的 shell,可能
netcat
在你的最後使用類似的東西。“普通”是指外殼(它的標準輸入/標準輸出)直接連接到網路套接字,而不是通過像 SSH 那樣為外殼提供偽終端(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
在遠端執行。