EnterキーまたはTabキーを押した後にのみデータを送信するようにSSHに指示できますか?
EnterキーまたはTabキーを押した後にのみデータを送信するようにSSHに指示できますか?
回答:
いいえ、SSHには入力するものにEnterキーまたはTabキーが必要かどうかを判断する方法がないためです。たとえば、コマンド履歴をたどろうとすると、^R
または上矢印は送信されません。それ自体、それは...不快です。
ただし、各文字の間で画面に表示されるのを待つ必要はありません。入力する内容がわかっている場合は、好きなだけすばやく打ち込めば、端末は入力を停止してから約1往復時間で追いつきます。とにかくラインバッファリングされたセットアップ(パケット損失は異なりますが、それはそれ自身の興味深い癖をもたらします)。
PuTTYは、「ローカルエコー」と「ローカルライン編集」という2つの有用な機能を提供します。ローカル行編集はすべてをバッファリングし、行が戻った後にのみサーバーに送信します。これにより、コマンドラインの処理がはるかに簡単になりますが、テキストエディターを使用することもできます。
PuTTYには、認識される接続遅延に影響する可能性のある特定のもの(Nagleのアルゴリズム)を有効/無効にする他のオプションもあります。私が見るように、OpenSSHクライアントはこの点でPuTTYが提供するすべての機能を提供するわけではなく、比較するLinuxの代替手段を知りません。
そうでなければ、wombleはそれを正しく持っています。
Moshは、この正確な問題に対処するために設計されました。高遅延で信頼性の低い接続で使用するように設計されており、ローカルエコーおよびライン編集を提供します。
ssh host.example.org bash
(または使用する任意のシェル)でsshセッションを開きます。
リモートシェルに対してラインバッファモードを取得します。つまり、プロンプトと行編集は表示されませんが、ローカルエコーと「一度に1行」モードが取得されます。接続が非常に悪い場合に役立つことがあります。疑似ttyがないため、すべてのプログラムが正常に実行されるわけではありませんが、ほとんどのUNIXユーティリティは正常に動作します。
更新:
上記のトリックを使用すると、rlfeと呼ばれる便利なラッパープログラムを使用して、ローカルエンドで通常の行編集(readline)を取得できます。実行するだけです。rlfe ssh host.example.org bash
同じ問題(一部の場所でのひどいモバイルデータ品質による高遅延とパケット損失)が発生し、moshはそれをカットしません(すべてのリモートホストでUTF8をローカルおよびリモートで修正し、それらを壊さずに修正する特別なプログラムが必要です) 、すべてのファイアウォールを変更する-とにかく実際にローカル行編集を提供しない)私はsshにローカル行編集モードを提供する小さなラッパーを書くことにしました。
デフォルトでは、デフォルトのchar-by-charモードですべてをsshに渡しますが、ホットキーを押すと、いつでもreadlineを使用したローカル行編集モードに入ることができます。したがって、行全体を(編集、コマンドの呼び出しなどで)ローカルに入力し、Enterキーを押すと、1つのTCPパケットとしてリモート側に送信されます。
利点は、ラグのないコマンドライン編集です(古いtelnetで調理された/標準の「行ごとのバッファモード」ですが、GNU readlineが提供する優れた編集コマンドを使用)。また、サーバーまたはファイアウォールで何も変更する必要はありません。また、エディターやその他のcursesベースのプログラムは、通常のssh接続のように、デフォルトのchar-by-charモードで(ラグはありますが)通常どおり動作し続けます。
欠点は、ホットキーを押してローカル回線編集モードに入る必要があるたびに、またはリモートホストのプロンプトを変更して自動検出を許可する必要があることです。また、リモートタブファイル名の補完は現在、char-by-charモードに戻ることによってのみ機能します(または、好みに応じて、リモートファイルシステムの代わりにローカルファイルシステムを使用します)。ただし、進行中の作業であるため、プルリクエストまたは改善のための実行可能なアイデアは大歓迎です!
利点は、シェル(およびその行編集)がローカルで遅延がないことだけでなく、リモートファイルシステムをナビゲートし、リモートファイルにシェルファイル名補完(タブキー)を使用できることです。また、(最高の機能であるIMHO)、選択したローカルエディタを使用して、リモートファイルの遅延のない編集を行うことができます。
短所は(特にリンクが低遅延であり、高遅延だけではない場合)、編集するファイルごとに、ローカルホストに完全に転送する必要があり、編集後、再度リモートに完全に転送する必要があることです。SSHFSはいくつかのキャッシングを提供し(sshfs(1)のオプションcache、cache_timeout、cache_x_timeoutを参照)、その問題をいくらか軽減します。また、リモートで何かを実行したい場合は、別の画面を使用するか、すべてのコマンドの前に「ssh remotehost」(たとえばssh remotehost sudo service apache restart
)を付ける必要があります。ssh_config(5)のオプションControlMasterを参照して、実行を高速化します(パスワードを要求することなく)。
コマンドを実行しているだけであれば、その動作をエミュレートできます。
ssh user @ targetmachine「文字列のコマンド」
しかし、
ssh-agent
か、パスワードを入力する必要がありますtmuxを使用して、入力の流fluentなエコーを実現できます。tmuxをローカルで実行します。1つのペインにsshシェルがあり、その下のペインにローカルシェルがある場合、ローカルペインからリモートペインにキーを送信できます。
tmux send-keys -t top 'ls' C-m
対話型コマンドと小さなコマンドは、遅れているsshシェルに直接入力します。ラグが入力を妨げ始めたらすぐに、ローカルペインに切り替えて、send-keysを使用します。これは、コマンドを入力する途中でも機能します。
ショートカットするには、これを私の.bashrcに追加しました
function ts {
args=$@
tmux send-keys -t right "$args" C-m
}
send-keysを説明してくれたChristian Pelczarskiに感謝します:https ://minimul.com/increased-developer-productivity-with-tmux-part-5.html
たとえば、引用符を使用する場合はエスケープする必要があります
ts git config --global alias.lola \'log --graph --decorate --pretty=oneline --abbrev-commit --all\'
これはあなたが望むことをします。ただし、クライアントとサーバーの両方をインストールする必要があり、OpenSSHのアップストリームは変更を適用しませんでした。 https://github.com/hyc/OpenSSH-LINEMODE