SSH経由で再接続した後に別の「history」コマンドを出力する

SSH経由で再接続した後に別の「history」コマンドを出力する

切断されたSSHセッションを再接続した後、同じユーザーに対して "history"コマンドに対して異なる結果を得るのはなぜですか?

  • パテ(SSH)を使用してサーバー(ルートなど)に接続します。
  • インターネットがダウンしました。
  • Puttyセッションを再接続します。
  • 最後に使用したコマンドを再実行するために上矢印キーを押すと、他のコマンドが表示されます。

別のポイントに再接続したからだと思います。私は正しいですか?

答え1

これは、ログアウト中に現在のセッションのコマンド履歴がディスクにフラッシュされるためです。接続が失われた場合は、再接続すると最後に更新された履歴が表示されます。

次のコマンドを実行して、履歴をディスクに手動でフラッシュすることもできます。

history -a

引用するman history

   history [n]
   history -c
   history -d offset
   history -anrw [filename]
   history -p arg [arg ...]
   history -s arg [arg ...]
          With no options, display the command history list with line numbers.  Lines listed with a * have been  modified.
          An  argument  of n lists only the last n lines.  If the shell variable HISTTIMEFORMAT is set and not null, it is
          used as a format string for strftime(3) to display the time stamp associated with each displayed history  entry.
          No intervening blank is printed between the formatted time stamp and the history line.  If filename is supplied,
          it is used as the name of the history file; if not, the value of HISTFILE is used.  Options, if  supplied,  have
          the following meanings:
          -c     Clear the history list by deleting all the entries.
          -d offset
                 Delete the history entry at position offset.
          -a     Append  the ‘‘new’’ history lines (history lines entered since the beginning of the current bash session)
                 to the history file.
          -n     Read the history lines not already read from the history file into the current history list.   These  are
                 lines appended to the history file since the beginning of the current bash session.
          -r     Read the contents of the history file and use them as the current history.
          -w     Write the current history to the history file, overwriting the history file’s contents.
          -p     Perform  history  substitution on the following args and display the result on the standard output.  Does
                 not store the results in the history list.  Each arg must be quoted to disable normal history  expansion.
          -s     Store  the  args  in the history list as a single entry.  The last command in the history list is removed
                 before the args are added.

          If the HISTTIMEFORMAT variable is set, the time stamp information associated with each history entry is  written
          to  the history file, marked with the history comment character.  When the history file is read, lines beginning
          with the history comment character followed immediately by a digit are interpreted as timestamps for the  previ-
          ous  history line.  The return value is 0 unless an invalid option is encountered, an error occurs while reading
          or writing the history file, an invalid offset is supplied as an argument to -d, or the history  expansion  sup-
          plied as an argument to -p fails.

答え2

デフォルトでは、@frzieは質問に答えましたが、明確にするためにシェルセッションにログインしたときに生成される一時履歴ファイルがあります。ログアウトすると、この履歴ファイル.history$HOME

ログアウトしなかったため、追加は発生しませんでした。これをテストするには、コマンドを実行してhistory出力(一時記録を含む)を出力(つまりのファイルの内容)とcat $HOME/.history比較します。これらの出力は異なる必要があります(出力の1つで実行されたコマンドだけが表示され、他の出力では表示されない場合でも)。これでコマンドを実行すると、ファイルはほぼ同じでなければなりません。.history$HOMEhistoryhistory -a

答え3

履歴ロギングの動作を制御するいくつかの環境変数があります。これらのいくつかは次のとおりです。

HISTFILE=/home/saml/.bash_history
HISTFILESIZE=1000
HISTSIZE=1000

一般的に発生する現象は、複数のシェルが開いていて、最後に閉じたシェルが最初に閉じたシェルの前に作成されたいくつかの項目を破損することです。

見てコマンド履歴の Bash リファレンスマニュアルセクションより多くの情報を知りたいです。

関連情報