假设我正在执行一个长时间运行的 bash 脚本,并且在运行时,我不小心右键单击终端并将敏感密码(刚从密码管理器中复制出来的)粘贴到终端中。
~$ process_data.sh
[useful data 1]
[useful data 2]
...
[useful data N-1]
hunter2[useful data N]
[useful data N+1]
有什么方法可以删除终端上显示的文本 (hunter2),同时保留有用的数据? Ctrl-L 可以clear
删除屏幕上的所有内容。Ctrl-H 可以删除当前行的字符,但我无法将光标向上移动。
我不需要从中删除文本~/.bash_history
,我只是希望有用的数据显示在终端中,而没有令人反感的文本。
我认为答案可能取决于终端的功能/实现。我使用的是 Ubuntu 18,但任何针对常见终端的解决方案都将不胜感激。
不。
您可以使用Ctrlu取消输入缓冲区,这样您就不会意外地将其作为命令输入Enter。但是您无法删除已粘贴到当前行上一行的文本。
是的。
如果您可以访问同一台计算机上的另一个终端会话,则可以将相应的字符序列发送到有问题的终端会话,以覆盖非预期的文本。当然,如果应用程序已经完成,您也可以直接运行它。例如
如果有必要,将所有这些作为单个块重定向到有问题的终端
如果你运行:
然后,您将能够使用箭头键在屏幕上移动,用空格覆盖您需要的内容,然后按Enter返回提示。
t=$(stty -g)
保存当前 tty 设置stty -echoctl
^X
禁用大多数控制字符的回显更改(例如ESC 键)的行为^[
。相反,它们将以原始格式发送到终端。tput rmkx
。确保终端未处于键盘模式。在大多数终端中,非键盘模式时,按下箭头键时发送的字符序列(第一个字符是 ESC 控制字符)恰好对应于终端接收后识别的转义序列,从而将光标移动到相应方向。例如,按下Up会发送<ESC>[A
序列,而该序列发送到终端时(例如,通过回显您键入的内容)会使光标向上移动。如果没有rmkx
,您可能会发现终端发送的<ESC>OA
回显不会将光标向上移动,而是显示A
。tput sc
s
避免了c
鼠标位置read -r _
直到你按下Entertput rc
r
恢复c
鼠标位置stty "$t"
恢复之前保存的 tty 设置。我们没有这样做
stty smkx
,因为我们不知道键盘模式是否事先启用(并且据我所知,在这方面没有简单/便携的等效方法stty -g
来保存终端的内部状态)。请注意,您将无法通过这种方式更改已经滚出屏幕的文本。
如果使用 GNU终端多路复用器,即使终端中仍有应用程序运行,您也可以作为过滤器
screen
的一部分执行相同的操作:调出提示符(默认情况下为+ , ),然后输入:exec
screen
Crtla:在那里也做同样的事情。在这种情况下,不需要保存和恢复 tty 设置,因为
exec
会生成一个新的伪终端设备。这看起来确实像个XY问题:你真正需要的可能是根本不显示“hunter2”?但你问的是一个可能的“解决方案”:之后如何删除它?
如果真正的问题是避免显示某些内容(这里,可能是您输入到“读取”中的某些内容?):
如果您需要输入可能也包含 Enter,那么您也可以将 tty 置于原始模式(但它会变得有点棘手)