tmuxセッションのインスタンス化タイムアウトしたシェルに再接続するための予想される方法は何ですか?

tmuxセッションのインスタンス化タイムアウトしたシェルに再接続するための予想される方法は何ですか?

tmux セッションを使用する場合シェルインスタンス化の一部として呼び出される、ユーザーがSSHを介してシステムに接続するたびに、新しいセッションが作成されます。接続が失われた場合(セッションタイムアウトなど)、セッションは存在し続けますが、再接続すると、以前のセッションに接続せずに新しいセッションが作成され続けます。以前のセッションを再接続または管理するための予想される方法は何ですか?

背景

内部にRHEL 8スティック、一つあります。発見するこれには、「シェルの初期化時に自動的に開始されるセッション制御」が必要です。 STIGでこれを行う方法は、ログイン時にtmuxを起動することです。また、以下を引き起こす他のコントロールもあります。アクティビティ後、tmuxセッションがロックされました。非アクティブ後にSSHを切断する。私のSTIGedシステムでは、基本的な開発システムに加えて因果テストを実行しましたが、アイドルタイムアウトが多く発生し、独立したセッションもたくさん発生しました。

タイムアウトセッションの例

[user@system ~]$ tmux list-sessions
0: 1 windows (created Tue Jun 15 14:09:29 2021) [202x47]
1: 1 windows (created Tue Jun 15 14:32:53 2021) [202x47]
10: 1 windows (created Wed Jun 16 10:34:15 2021) [202x47]
11: 1 windows (created Wed Jun 16 10:50:04 2021) [202x47] (attached)
3: 1 windows (created Tue Jun 15 15:11:01 2021) [202x47]
4: 1 windows (created Tue Jun 15 16:47:34 2021) [202x47]
5: 1 windows (created Tue Jun 15 16:50:10 2021) [80x24]
6: 1 windows (created Tue Jun 15 18:22:36 2021) [202x47]
7: 1 windows (created Wed Jun 16 09:41:14 2021) [202x47]
8: 1 windows (created Wed Jun 16 09:52:56 2021) [202x47]
9: 1 windows (created Wed Jun 16 10:14:31 2021) [202x47]

この問題をどのように処理しましたか?

そのうちの1つに再接続しようとすると、次の警告が表示されます。

[user@system ~]$ tmux attach-session -t 0
sessions should be nested with care, unset $TMUX to force

値の設定を解除してセッションを再接続すると、セッションがネストされ、状況が非常に複雑になります。理論的には、このネストされたセッションで実行されている操作を実行できますが、より良い方法が必要になると思います。完了する前に再度分離し、以前のセッションに再接続する必要がある場合サム会議はどれくらい深いですか?

メモ: 私はRHEL 8 STIGが実装されている環境をテストして習得するためにこのシステムを使用しています。本番システムでは、ユーザーが環境をよりよく認識し、セッションアイドルタイムアウトの可能性を減らすことを願っています。ユースケースに応じてタイムアウトを無効にすることはできますが、STIGルールに準拠しようとしています。

答え1

推測するtmuxこれはログインシェルのために発生します。 SSH経由で接続するたびに、tmux新しいプロセスが開始されます。デフォルトでは、tmux新しいセッションが作成されます。

接続すると、要求に応じて実行可能tmux a

# from the outside
ssh -t user@server 'tmux a || tmux'

メモ:

  • tmux a || tmux私は失敗した場合(たとえば、接続する前のセッションがない場合)、新しいセッションを作成するために使用しました。tmux a
  • -ttmuxtty はリモート側に割り当てられます。端末が必要です。
  • このコマンドは(例:)tmuxのサポートのために機能します。このオプションは、SSHサーバーからコマンド文字列を渡すために使用されます。 「このオプションは、ログインシェルとして使用するときの互換性のためのものです」と言います。もちろん。-csh -cman 1 tmuxsh(1)tmux

ssh user@server 'tmux ls'最初に実行してから(これを行う必要はありませんssh -t)、特定のセッションに接続できます(ssh -t … 'tmux a -t …')。


tmux私はそれをログインシェルとして使用するのが好きではありません。これが私がする方法です:

  1. 私の公式ログインシェルはです/bin/bash。サーバーのログインシェルを変更するには、たとえば接続に使用しますchsh -s /bin/bash/etc/shells(ファイル確認のために実行)cat /etc/shellsにリストされているシェルを指定できます。

  2. それから最後に私は.bashrcこれを持っています:

    # run tmux if outside of tmux
    if [ -z "$TMUX"]; then
       tmux a || tmux
    fi
    

    .bashrcBashの場合。他のシェルを選択した場合は、bash他のファイルを変更する必要があります。)

sshコンピュータに移動すると(または何らかの方法でログインシェルを実行すると)、/bin/bash私のログインシェルであるために実行されます。部材を検出し、tmuxまたはtmux aを実行しますtmuxtmux実行しようとするとbash実行されます。その他 /bin/bash。シェルは自分が内部にあることを検出し、tmux他のシェルを実行しようとしませんtmux

これは非常にうまく機能します。私はこれを.bashrc試したり実行したりしないので、私が中にいる間、シェルはまだ実行中です。これは、ログアウトせずに現在のtmuxセッションを終了または分離できることを意味します。これはシェルに入り、必要に応じて手動で別のセッションに入ることができ、新しいセッションを開始したり、タスクがない可能性があります。これは私が慎重に考慮したデザインの選択でした。exec tmux aexec tmuxtmuxtmux atmux

bash外部シェルと内部シェルとして使用するという事実も私の選択です。一般的に言えば、これらは他の殻であってもよい。選択した外層にはchsh。以下を指定して、デフォルトの内部シェルを選択できます。default-shellあなたの.tmux.conf

default-shell path

デフォルトのシェルを指定します。このdefault-commandオプションを空白のままにすると、新しいウィンドウのログインシェルとして使用され、実行可能ファイルのフルパスである必要があります。起動時に最初の適切な環境変数(shell byまたは)から返された値にデフォルト値を設定しようとしますtmux。このオプションは、ログインシェルとして使用するときに設定する必要があります。SHELLgetpwuid(3)/bin/shtmux

私の設定では、ウィンドウ/ウィンドウでログインシェルを有効または無効にすることはdefault-shellできません。tmuxしかし、tmuxこれが私のログインシェル自体であれば、それを指定する必要がありますdefault-shell(おそらくこれが現在機能している方法です)。

答え2

別のセッションに移動するためのキーボードショートカットはctrlb+(またはctrlb+です)

このコマンドはnotですが、マニュアルattach-sessionの説明方法が誤解を招くようです(太字は誤解を招く可能性があります)。

attach-session [-dErx] [-c working-directory] [-t target-session]
(エイリアス:添付)

tmuxの外部で実行している場合は、現在の端末に新しいクライアントを作成し、それをターゲットセッションに接続します。 内部で使用している場合は、現在のクライアントを切り替えてください。

これに対応するのは、実際にswitch-clientクライアントのセッションを切り替えることができることです(たとえば、すでに接続されている間)。

switch-client [-Elnpr] [-c target-client] [-t target-session] [-T key-table]
(エイリアス:スイッチc)

クライアントtarget-clientの現在のセッションをtarget-sessionに切り替えます。

顧客が指定されていない場合は、現在の顧客です。

したがって、手動でログインした後、まず現在のセッションIDをどこかに保存できます。

tmux display-message -p '#S' > /tmp/sessiontokill

いいえ、変数は次の切り替え#{client_last_session}の直後にこの値を使用します。

ターゲットセッションに切り替えます。

tmux switch-client -t 0 

そして、時間が経っても累積しないように、現在役に立たず、未使用の古いセッションを終了します。

tmux kill-session -t "$(tmux display-message -p '#{client_last_session}')"

まだ同じセッションを使用する1つ以上のクライアントがある場合(たとえば、一部のネットワークエラーのため)、次の手順を実行してそのクライアントをすべて削除できます。

  • このセッションを使用するクライアントのリストを探す
  • リストから現在のクライアントを削除する
  • 他のすべてのクライアントを分離する(+ -HUP)

for i in $(tmux list-clients -F '#{client_name}' -t "$(tmux display-message -p '#S')" | grep -Fvx "$(tmux display-message -p '#{client_name}')"); do
        tmux detach-client -P -t "$i"
done

これらのコマンドが一部のスクリプトやエイリアス/関数に含まれている場合は、これが役に立つことを願っています。

関連情報