在Linux下,使用快捷方式删除隐藏密码提示中输入的密码。

有没有办法删除我在Linux中隐藏密码提示符中输入的所有字符?例如,当我通过SSH连接到服务器时,它会要求输入密码,但输入的键不会显示出来。
$ ssh root@somehost
root@somehost's password:

有没有一种方法可以删除我输入的所有文本,而不必按下退格键一段时间?当我觉得自己输入错误时,我想重新开始,按下退格键几秒钟很烦人。我尝试了EscCtrlA希望能选择整个文本和Home。按下CtrlC会取消整个命令,我必须再次发送命令以重试。这几乎是最好和最快的解决方案,但仍然不令人满意。在我的shell中也无法使用插入键。

7关于Ctrl+A,在终端中通常表示“跳到行首”。终端中使用的键盘组合(尤其是bash)往往更接近Emacs而不是Windows。 - Score_Under
18以root身份登录通常被认为是非常非常糟糕的做法。 - Sam
要从屏幕上删除字符,您需要使用光标控制序列(如果您的终端支持)。通过从脚本中运行ssh,您可以在运行之前分析参数字符串。 - AFH
4请注意@Sam所说的内容。您应该在所有地方禁用root登录。用一个复杂的密码作为普通用户登录,然后使用su命令切换到root用户。下一步是禁用SSH的基于密码的身份验证方案,并使用密钥进行登录。 - kostix
@kostix 我相当确定禁用密码应该是第一步。如果你正在使用密码,那么通过su和禁用root,只需要在登录后再次输入攻击者已经猜到的密码,所以只有在用户名难以猜测的情况下才能获得一些好处(通常情况下并非如此,我没有统计数据来证明)。而且,没有密码登录会增加第二个秘密,即密码,但这比更长的私钥价值要低。 - Nobody
@Sam 我记得我曾经有一次安装,我绕过了我的路由器,并通过ssh启用了root访问,密码是一个字典中的单词。几周之内,有人在网上劫持了我的电脑。活到老,学到老... - sig_seg_v
@Sam:没有使用公钥身份验证(并且禁用了密码)。 - user541686
2个回答

你可以用 Ctrl+U 删除整个输入的密码。

6这在常规终端提示符中也适用! - user487867
35供参考,这是readline的“emacs模式”中unix-line-discard的默认键绑定,描述为“从光标向后删除到当前行的开头”。参考链接:https://cnswww.cns.cwru.edu/php/chet/readline/rluserman.html#SEC17 GNU readline是大多数shell和许多其他交互式程序使用的输入库(但内置于tty中,因此这在所有地方都无法工作)。 - IMSoP
22@IMSoP 不过,Ctrl-U本身内置于tty中的(作为stty kill函数的默认字符),这就是为什么它可以在ssh密码提示符中使用。 - Random832
5顺便说一句,Ctrl+K是删除光标到行尾的等效操作。 - wjandrea
一点小细节是,一些图形界面程序也试图与我们这些老家伙友好相处,并在提示中实现对于 C-u 的支持。作为一个例子,i3lock 程序允许按下 C-u 来清除无效的输入。 - kostix
@Random832 哇,你每天都学到一些新东西。谢谢! - IMSoP
@IMSoP: 我写了一个回答来更详细地解释为什么这个方法有效,以及它与在bash中使用readline进行行编辑的区别。 - Peter Cordes
1@wjandrea:ctrl+k只适用于readline/emacs,无法在POSIX终端的规范模式下执行。 - Peter Cordes
1警告:只有在您的光标位于您输入内容的末尾时,才会清除所有内容,否则可能发生不完全删除!(例如,因为您想要更改第一个字符,然后决定清除所有内容)。 - Dennis Jaheruddin
2@DennisJaheruddin:这是不可能的,ssh不使用readline来提供行编辑功能。请参考我的回答。 - Peter Cordes

bash不同,ssh的密码提示不使用任何特殊的终端输入库,如readline。行编辑功能只是基本的POSIX TTY行编辑功能。
因此,您在“cooked”模式下拥有一个POSIX TTY(而不是原始模式),也称为规范模式,唯一可用的行编辑功能是内核提供的功能。请参阅stty(1),并注意到 kill = ^U。这也是退格字符定义的位置(erase = ^?)。当您不盲打时,单词删除(^W)很方便。 lnext = ^V意味着您可以键入控制-v,然后是任何内容(包括控制-c)以获得文字形式的控制-c。
要调试您盲目尝试的内容,请在终端中运行catcat > /dev/null。键入一些内容,然后查看哪些内容可以编辑,哪些不能。

readline(由bash使用)在用户空间中读取原始字符并进行行编辑。它的默认绑定与默认TTY控制字符兼容,尽管只提供了它们共同提供的一小部分编辑功能。

readline远远超出了普通TTY的简单行编辑功能。(例如,TTY只能删除行末的字符,所以没有^adelete或左/右箭头)

当bash在前台运行命令时,它首先将TTY置于规范模式(因为这是默认设置)。因此,运行stty -a(没有重定向)将始终在规范模式下查看自己的终端。但是,如果您从其他正在运行bash的TTY中重定向输入,您可以查看bash + readline应用的终端设置。例如,stty -a < /dev/pts/12显示原始模式的-icanon,因为我在该终端上运行了一个bash。(我切换到另一个标签并运行tty,然后使用第一个终端的设备文件路径)。如果我在另一个终端上运行cat,我会看到规范模式的icanon。
相关链接:解密TTY

https://www.gnu.org/software/libc/manual/html_node/Canonical-or-Not.html

https://en.wikipedia.org/wiki/POSIX_terminal_interface


实际上,您只需输入"stty"即可查看当前所有的设置。使用"stty rows ##"或"stty cols ##"可以动态更改终端窗口的行数或列数。这在您通过VNC之类的工具在一个窗口内部工作时特别方便,因为它可能无法准确捕捉到外部窗口的大小。您可以将活动区域定义为比所在窗口更小,从而无需滚动。这样可以确保VI和其他功能正常工作。它还可以动态重新映射退格和删除键。 - Rowan Hawkins
@RowanHawkins:我的最后一段编辑得不好。现在已经修复了。我想表达的是,通过从另一个tty重定向,你可以看到bash+readline本身在原始模式下应用的stty / ioctl设置。(以及它实际上处于原始模式,其中大多数特殊字符不适用) - Peter Cordes