ログインが常にスクリーンセッションに再接続されるように、SSHとスクリーンを設定したいと思います。理想的には、Cdを押すとそのセッションは終了せずに切り離されます。どうすればこれを達成できますか?また、SSHライフを簡単にするために、他にどのような便利な設定がありますか?
ログインが常にスクリーンセッションに再接続されるように、SSHとスクリーンを設定したいと思います。理想的には、Cdを押すとそのセッションは終了せずに切り離されます。どうすればこれを達成できますか?また、SSHライフを簡単にするために、他にどのような便利な設定がありますか?
回答:
SSH経由で接続すると自動的にScreenセッションに入れられるように、すべてのサーバーに対して次のことを行いました。
ユーザーアカウントの〜/ .bashrcに次を追加します。
# Auto-screen invocation. see: http://taint.org/wk/RemoteLoginAutoScreen
# if we're coming from a remote SSH connection, in an interactive session
# then automatically put us into a screen(1) session. Only try once
# -- if $STARTED_SCREEN is set, don't try it again, to avoid looping
# if screen fails for some reason.
if [ "$PS1" != "" -a "${STARTED_SCREEN:-x}" = x -a "${SSH_TTY:-x}" != x ]
then
STARTED_SCREEN=1 ; export STARTED_SCREEN
screen -RR -S main || echo "Screen failed! continuing with normal bash startup"
fi
# [end of auto-screen snippet]
これにより、mainという名前のスクリーンセッションが存在しない場合は開始され、存在する場合は再接続されます。これは、さまざまなサービスのために切り離されて実行されている他のいくつかのスクリーンセッションがあり、それらに接続したくないためです。
リモートサーバーの.bash_profileに次のものがあります。
if [ -z "${STY}" -a -t 0 -a X${USER} = Xarcege ]; then
reattach() {
if [ -n "${SSH_AUTH_SOCK}" ]; then
ln -snf "${SSH_AUTH_SOCK}" "${HOME}/.ssh/agent-script"
SSH_AUTH_SOCK="${HOME}/.ssh/agent-script" export SSH_AUTH_SOCK
fi
exec screen -A -D -RR ${1:+"$@"}
}
screen -wipe
echo 'starting screen... (type Ctrl-C to abort)'
sleep 5 && reattach
fi
これは2つのことを行います:最初に、シェルを置き換えてssh-agent接続を引き継ぐシェル関数をセットアップし、2番目に(画面を開始したくない場合に)数秒間休止した後に関数を呼び出します。
if
まだ実行中の画面(-z "${STY}"
)が端末(-t 0
)に接続されておらず、sudoを実行していない場合(これは変更されないことがあります$USER
)、最初の句はtrueになります。
このreattach
関数は、ssh-agentポートがアクティブな状態でsshが呼び出されたかどうかを最初にチェックします(-n "${SSH_AUTH_SOCK}"
)。次に~/.ssh/agent-script
、現在アクティブなソケットファイルで現在のものを置き換え、環境変数($SSH_AUTH_SOCK
)を新しい値で置き換えます。次に、スクリプトは現在のシェルを1つのscreen
セッションに置き換えます(1つだけのセッションが存在することを確認します)。reattach
関数の引数はすべてコマンドに渡されます(${1:+"$@"}
)。
最後の部分では、最初にデッドセッションを削除し(screen -wipe
)、ユーザー(私)に画面がまもなく開始されることを知らせ、代わりにCtrl- を押してシェルに戻ることができCます。次に、5秒間待機し、reattach
関数を呼び出します。
まず、byobuを使用する場合、常に自動的にbyobuを開始するように新しいシェルセッションを構成できます(これは基本的には素晴らしい画面構成ですが、新しいバージョンではtmuxをバックエンドとして使用できます)。本当にbyobuが必要ない場合は、おそらく、自分.profile
または他のシェル構成スクリプトをexec screen
ifに編集して、手動で接続するように画面を設定できますTERM != "screen"
。
気に入らない場合は、このauthorized_keys
ファイルを使用して、特定のキーとの接続に対して特定のコマンドを実行できます(また、必要な数のキーを使用できます)。詳細man sshd
を参照してください。画面が実行されて接続されているかどうかを確認するスクリプトをコマンドに実行させるか、新しいセッションを開始することをお勧めします。
Ctrl-Dでの切断については、画面ででキーマッピングを設定できます.screenrc
。詳細man screen
を参照してください。「bindkey」を探しています。
質問とはまったく無関係かもしれませんが、代わりにTMUXの使用を検討したことがありますか。すぐに使用できる多くの機能を実行します。
例えば。TMUXの使用中にSSHセッションから切断した場合、必要なことは、sshに戻って「tmux a」を実行してセッションに接続することだけです。TMUXの使用を開始して以来、nohup / disownコマンドが何であるかを忘れていました...何かを実行してログアウトする必要がある場合は、tmux内で実行して切り離します。コマンド出力はバッファリングされるため、後で確認できます。
自動的に添付するには、次のようなものを.bashrcに追加できます。
[ -z $TMUX ] && tmux list-sessions 2>/dev/null && tmux a
またはさらに簡単
tmux a 2>/dev/null
それはより少ないメモリフットプリントと全体的に私見よりもはるかに優れた/使いやすいオプションを持っています。
meta-dショートカットは、TMUXでデタッチするデフォルトのマッピングです。
screen -dAr default || screen -AS default
私のために働く。私はそれを〜/ .bashrcます。
スイッチの簡単な説明:
d
-画面がまだ接続されている場合は、別のセッションから画面を切断します。A
-画面のウィンドウを新しい端末サイズに合わせます。r default
-デフォルトと呼ばれる画面に接続します。最初のスクリーンコマンド(前のコマンド||
)が成功しない場合、2番目のスクリーンコマンドが実行されます。
A
-上で説明したように...S default
-defaultという名前で新しいスクリーンセッションを作成します。