SSHの入力遅延を回避する方法はありますか?


43

EnterキーまたはTabキーを押した後にのみデータを送信するようにSSHに指示できますか?


あなたがそれを扱うことができないほどの入力遅延がある場合、私は非常に興味があります。私はモデム時代にsshを使用しましたが、これらの問題に直面することはありませんでした。
mailq

4
ベルギーからSliceHost VPS(米国)にアクセスしています。遅延は、私を混乱させるほど顕著です。しかし、私は他の人が私よりもこれに悩まされていないように見えることに気づきました
。– StackedCrooked


@mailq 2019年に3Gを使用しませんか?地下の村のカントリーハウスからsshingかは、よりダイヤルアップでそれをやってようなものです
POMATu

回答:


32

いいえ、SSHには入力するものにEnterキーまたはTabキーが必要かどうかを判断する方法がないためです。たとえば、コマンド履歴をたどろうとすると、^Rまたは上矢印は送信されません。それ自体、それは...不快です。

ただし、各文字の間で画面に表示されるのを待つ必要はありません。入力する内容がわかっている場合は、好きなだけすばやく打ち込めば、端末は入力を停止してから約1往復時間で追いつきます。とにかくラインバッファリングされたセットアップ(パケット損失は異なりますが、それはそれ自身の興味深い癖をもたらします)。


複数のマシンでsshのタイピング速度をベンチマークする方法を見つけることに本当に興味があります。同じ場所にあるマシン間で速度がLOTを変える可能性があり、マシンに大きな負荷がないことがわかりました。私の理論では、これは特にAWSの小さなインスタンス(マイクロまたはミニインスタンスなど)で発生します。
ソリン

1
モッシュの論文を見てください。著者はいくつかのベンチマークを行いましたmosh.org/#techinfo
user7610

25

PuTTYは、「ローカルエコー」と「ローカルライン編集」という2つの有用な機能を提供します。ローカル行編集はすべてをバッファリングし、行が戻った後にのみサーバーに送信します。これにより、コマンドラインの処理がはるかに簡単になりますが、テキストエディターを使用することもできます。

PuTTYには、認識される接続遅延に影響する可能性のある特定のもの(Nagleのアルゴリズム)を有効/無効にする他のオプションもあります。私が見るように、OpenSSHクライアントはこの点でPuTTYが提供するすべての機能を提供するわけではなく、比較するLinuxの代替手段を知りません。

そうでなければ、wombleはそれを正しく持っています。


これは受け入れられた答えであるはずです
フレディファブレガス

macOSにPuTTYをインストールできませんでしたが、代替品はありますか?
エアロウィンドウォーカー

Linuxでのパテは少し苦痛です。自動的に再接続できず、切断時にメッセージボックスが表示されるため、ウィンドウを再度開く必要があります。Linuxでkittyやplink.exeなどを使用して、autosshを何らかの方法で微調整することを望んでいます。一部のデバイスはmosh thoをサポートしていません(ホームOpenwrtルーターにアクセスしようとした場合)
POMATu

22

Moshは、この正確な問題に対処するために設計されました。高遅延で信頼性の低い接続で使用するように設計されており、ローカルエコーおよびライン編集を提供します。


sudoを使用せずに、ソースからローカルディレクトリにインストールできます。また、mosh.orgもご覧ください。「特権コードはありません。デーモンはありません。Moshをインストールまたは実行するためにスーパーユーザーである必要はありません。クライアントとサーバーは、通常のユーザーによって実行される実行可能ファイルであり、接続が続く限り持続します。」
スティーブンC.ハウエル

1
ただ注意してください。MoshはSSHではありません。独自の独自プロトコルを使用します。(しかし、私はそれで問題はありません。)
user7610

これは、Androidと自宅の悪いWi-Fiネットワークでゼロから機能しました。readlineについて知っている
-tinmarino

9

ssh host.example.org bash(または使用する任意のシェル)でsshセッションを開きます。

リモートシェルに対してラインバッファモードを取得します。つまり、プロンプトと行編集は表示されませんが、ローカルエコーと「一度に1行」モードが取得されます。接続が非常に悪い場合に役立つことがあります。疑似ttyがないため、すべてのプログラムが正常に実行されるわけではありませんが、ほとんどのUNIXユーティリティは正常に動作します。

更新:

上記のトリックを使用すると、rlfeと呼ばれる便利なラッパープログラムを使用して、ローカルエンドで通常の行編集(readline)を取得できます。実行するだけです。rlfe ssh host.example.org bash


1
私はそれを試してみましたが、非常に実用的ではありませんでした。しかし、知るのはクールです、ありがとう。
-StackedCrooked

これは私にとって素晴らしく機能します。
lakesare

6

同じ問題(一部の場所でのひどいモバイルデータ品質による高遅延とパケット損失)が発生し、moshはそれをカットしません(すべてのリモートホストでUTF8をローカルおよびリモートで修正し、それらを壊さずに修正する特別なプログラムが必要です) 、すべてのファイアウォールを変更する-とにかく実際にローカル行編集を提供しない)私はsshにローカル行編集モードを提供する小さなラッパーを書くことにしました。

デフォルトでは、デフォルトのchar-by-charモードですべてをsshに渡しますが、ホットキーを押すと、いつでもreadlineを使用したローカル行編集モードに入ることができます。したがって、行全体を(編集、コマンドの呼び出しなどで)ローカルに入力し、Enterキーを押すと、1つのTCPパケットとしてリモート側に送信されます。

利点は、ラグのないコマンドライン編集です(古いtelnetで調理された/標準の「行ごとのバッファモード」ですが、GNU readlineが提供する優れた編集コマンドを使用)。また、サーバーまたはファイアウォールで何も変更する必要はありません。また、エディターやその他のcursesベースのプログラムは、通常のssh接続のように、デフォルトのchar-by-charモードで(ラグはありますが)通常どおり動作し続けます。

欠点は、ホットキーを押してローカル回線編集モードに入る必要があるたびに、またはリモートホストのプロンプトを変更して自動検出を許可する必要があることです。また、リモートタブファイル名の補完は現在、char-by-charモードに戻ることによってのみ機能します(または、好みに応じて、リモートファイルシステムの代わりにローカルファイルシステムを使用します)。ただし、進行中の作業であるため、プルリクエストまたは改善のための実行可能なアイデアは大歓迎です!


型破りな面では、代わりにSSHFSを使用してリモートファイルシステムをローカルにマウントできます。

利点は、シェル(およびその行編集)がローカルで遅延がないことだけでなく、リモートファイルシステムをナビゲートし、リモートファイルにシェルファイル名補完(タブキー)を使用できることです。また、(最高の機能であるIMHO)、選択したローカルエディタを使用して、リモートファイルの遅延のない編集を行うことができます。

短所は(特にリンクが低遅延であり、高遅延だけではない場合)、編集するファイルごとに、ローカルホストに完全に転送する必要があり、編集後、再度リモートに完全に転送する必要があることです。SSHFSはいくつかのキャッシングを提供し(sshfs(1)のオプションcachecache_timeoutcache_x_timeoutを参照)、その問題をいくらか軽減します。また、リモートで何かを実行したい場合は、別の画面を使用するか、すべてのコマンドの前に「ssh remotehost」(たとえばssh remotehost sudo service apache restart)を付ける必要があります。ssh_config(5)のオプションControlMasterを参照して、実行を高速化します(パスワードを要求することなく)。


3

コマンドを実行しているだけであれば、その動作をエミュレートできます。

ssh user @ targetmachine「文字列のコマンド」

しかし、

  1. これにより、接続の作成に遅延が追加されます(マスター/共有ssh接続を使用して軽減できます)
  2. パスワードなしの秘密鍵がない場合は、使用するssh-agentか、パスワードを入力する必要があります
  3. メニューを操作したり、ファイルを編集したりしている場合、明らかに機能しません。

1

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\'

0

これはあなたが望むことをします。ただし、クライアントとサーバーの両方をインストールする必要があり、OpenSSHのアップストリームは変更を適用しませんでした。 https://github.com/hyc/OpenSSH-LINEMODE

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.