SSH接続を閉じたときに「終了」が保存されないようにするにはどうすればよいですか?

SSH接続を閉じたときに「終了」が保存されないようにするにはどうすればよいですか?

これを行う方法をGoogleで検索するときに見つけることができるのは、履歴を保存せずにセッションを終了する方法(例)kill -9 $$だけでしたが、正反対の問題に直面しました。コマンド以外のすべての履歴を保存したいですexit

Comcastは、パイプを損傷することなくSSHトンネルを5分以上維持できないほど職場で私たちを虐待しました。再接続した後、最後のコマンドを実行に行きましたが、当然今は忘れてしまいましたexit

答え1

シェルは、停止を求めるコマンドを受け取るまで(コマンドを入力してexit)、またはファイルの終わり(EOF)が発生するまで(シェルがスクリプトを実行したときと同じように)、端末(つまりシェルの標準入力)からコマンドを読み取ります。

コマンドが入力されると、exit最初に履歴に保存され、次にシェルが終了します。入力ctrl- DEOFを生成します。これはコマンドではなく入力状態なので、シェル履歴に保存することはできません。

bashEOFを無視するように指示する方法は2つあります。

  • -o 無視設定
  • EOFを無視=n

最初の方法は実行と同じです。つまり、シェルが終了する前に-10を連続してIGNOREEOF=10押す必要があります。これは、たとえばミスなどをした場合にシェルが予期せず終了するのを防ぐためです。ctrlDctrlC

また、ctrl-は行の最初の項目として入力された場合にのみ生成されます(つまり、入力後)。Dその行にすでに入力されている内容がある場合は無視されます。EOFbash

ctrl-Dシェルの外部でも作成されます。EOFたとえば、

$ wc
foo bar
<ctrl-D>
      1       2       8

wc1行、2単語、8文字(改行を含む)として計算されます。

以下は、行にいくつかの入力を提供した後に - を使用する例ですctrlD

$ wc
foo bar<ctrl-D><ctrl-D>       0       2       7

これでwc、0行(enter提供されていません)、2単語、7文字が計算されました。データがすでに提供されているため、2つのctrl順序が必要です。たとえば、データがこの行に入力されたかどうかを無視し、それを具体的に処理することに注意してください。これは 。DbashEOFdashbash

答え2

@StéphaneChazelasが追加を提案した場合ServerAliveInterval機能しない場合(値を試すこともできます)、切断された接続を復元できるようにGNU300などを検討することもできます。screentmux

~/.bashrcすべてのリモートシステムの上部には次のものがあります。

screen -r >/dev/null 2>&1

切断された画面セッションが見つからない場合(たとえば、2回目の接続であるか、再起動したばかりの場合)、何もしませんが、画面セッションがある場合(他の場所に接続されていない場合)、自動的に再接続してみてください。ブーム、すべての以前の履歴(およびアクティブコマンドなど)が復元されます。 (screen初めてログインしたとします。)

また、これを繰り返しSSH接続と組み合わせました。私が言う内容の簡単なバージョンは次のとおりです。

while sleep 1; do ssh remotehost; done

これにより、接続が切断されたときに自動的に再接続されます(Sshキーがあり、ssh-agentパスワードのないキーを使用すると仮定すると、これも透明です)。

関連情報