Linuxの隠しパスワードプロンプトで入力した文字をすべて削除する方法はありますか?例えば、私がサーバーにSSHするとき、それは入力されたキーが表示されないところに私のパスワードを求めています
$ ssh root@somehost
root@somehost's password:
不明な時間バックスペースを押さなくても、入力したテキストをすべて削除する方法はありますか?何か間違って入力したと思うとやり直したくなりますが、数秒間バックスペースを押すのは面倒です。私はEsc, CtrlAを試してみましたが、うまくいけばテキスト全体を選択することができますし、Homeも試してみました。CtrlCではコマンド全体がキャンセルされてしまい、再度コマンドを送信して再試行しなければなりません。これがほぼベストで最速の解決策ですが、まだ満足のいくものではありません。私のシェルでは Insert も動作しません
106 None 2017-11-01
Ctrl+Uで入力したパスワードを全て削除することができます
163 Ipor Sircer 2017-11-01
bash
とは異なり、ssh
のパスワードプロンプトはreadline
のような特別な端末入力ライブラリを使用しません。行編集機能は、基本的な POSIX TTY 行編集機能にすぎません
つまり、POSIX TTY は “調理された” モード (生ではなく)、別名カノニカルモードにあり、利用可能な行編集はカーネルが提供するものだけです。stty(1)
を見て、kill = ^U
に注目してください。ここにもバックスペース文字が定義されています(erase = ^?
)。Word-erase (^W
) は、ブラインドタイピングをしていないときに便利です
lnext = ^V
は、control-v と入力してから何でも(control-c を含む)、リテラルの control-c を取得できることを意味します
やみくもにやろうとしていたことをデバッグするには、ターミナルで cat
か cat > /dev/null
を実行してください。何かを入力して、それを編集するために何が機能して何が機能しないのかを確認してください
readline
(bash
で使われる) は、生の文字を読み込んで、ユーザ空間で行編集を行います。しかし、両者が提供する編集機能のサブセットについては、そのデフォルトのバインディングはデフォルトの TTY 制御文字と互換性があります
readline は、プレーンな TTY の単純な行編集をはるかに超えています。(例えば、TTYは行末の文字しか削除できないので、^a
とdelete
や左/右矢印はありません)
bash
がフォアグラウンドでコマンドを実行すると、TTY を最初に正規モードにします (これがデフォルトだからです)。そのため、stty -a
を (リダイレクトなしで) 実行すると、それ自身のターミナルは常に正規モードで表示されます。しかし、bash
が実行されている他の TTY からの入力をリダイレクトすると、bash + readline が適用されたターミナル設定を見ることができます。(別のタブに切り替えて tty
を実行し、最初のターミナルからそのデバイスファイルのパスを使っています)。別のターミナルで cat
を実行すると、正規モードの icanon
が表示されます
関連しています。TTYの仕組みを解明した
14 Peter Cordes 2017-11-02