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
-t
tmux
tty はリモート側に割り当てられます。端末が必要です。- このコマンドは(例:)
tmux
のサポートのために機能します。このオプションは、SSHサーバーからコマンド文字列を渡すために使用されます。 「このオプションは、ログインシェルとして使用するときの互換性のためのものです」と言います。もちろん。-c
sh -c
man 1 tmux
sh(1)
tmux
ssh user@server 'tmux ls'
最初に実行してから(これを行う必要はありませんssh -t
)、特定のセッションに接続できます(ssh -t … 'tmux a -t …'
)。
tmux
私はそれをログインシェルとして使用するのが好きではありません。これが私がする方法です:
私の公式ログインシェルはです
/bin/bash
。サーバーのログインシェルを変更するには、たとえば接続に使用しますchsh -s /bin/bash
。/etc/shells
(ファイル確認のために実行)cat /etc/shells
にリストされているシェルを指定できます。それから最後に私は
.bashrc
これを持っています:# run tmux if outside of tmux if [ -z "$TMUX"]; then tmux a || tmux fi
(
.bashrc
Bashの場合。他のシェルを選択した場合は、bash
他のファイルを変更する必要があります。)
ssh
コンピュータに移動すると(または何らかの方法でログインシェルを実行すると)、/bin/bash
私のログインシェルであるために実行されます。部材を検出し、tmux
またはtmux a
を実行しますtmux
。tmux
実行しようとするとbash
実行されます。その他 /bin/bash
。シェルは自分が内部にあることを検出し、tmux
他のシェルを実行しようとしませんtmux
。
これは非常にうまく機能します。私はこれを.bashrc
試したり実行したりしないので、私が中にいる間、シェルはまだ実行中です。これは、ログアウトせずに現在のtmuxセッションを終了または分離できることを意味します。これはシェルに入り、必要に応じて手動で別のセッションに入ることができ、新しいセッションを開始したり、タスクがない可能性があります。これは私が慎重に考慮したデザインの選択でした。exec tmux a
exec tmux
tmux
tmux a
tmux
bash
外部シェルと内部シェルとして使用するという事実も私の選択です。一般的に言えば、これらは他の殻であってもよい。選択した外層にはchsh
。以下を指定して、デフォルトの内部シェルを選択できます。default-shell
あなたの.tmux.conf
:
default-shell path
デフォルトのシェルを指定します。この
default-command
オプションを空白のままにすると、新しいウィンドウのログインシェルとして使用され、実行可能ファイルのフルパスである必要があります。起動時に最初の適切な環境変数(shell byまたは)から返された値にデフォルト値を設定しようとしますtmux
。このオプションは、ログインシェルとして使用するときに設定する必要があります。SHELL
getpwuid(3)
/bin/sh
tmux
私の設定では、ウィンドウ/ウィンドウでログインシェルを有効または無効にすることは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
これらのコマンドが一部のスクリプトやエイリアス/関数に含まれている場合は、これが役に立つことを願っています。