リモートサーバーにssh
したときに画面を自動的に起動する方法について読んでいます。 screen
を開始するときにssh
を開始し、画面を切り離すときにリモート接続を終了しないように、.bash_profile
に簡単なワンライナーを追加したいと思います。
私はexec screen
と-d
、-r
、-D
と-R
のほとんどすべての組み合わせを調査しており、必要なフラグを特定できません。
理想的には、ssh whatever
と入力して、新しいscreen
でサーバーにログインするか、古い画面に再接続できます。どちらが良いのかを確認する方法を知りたいのですが。それから私はどちらかを入力することができます Ctrlad または Ctrld そして、そのサーバーの通常のssh
ログイン(motdが表示される場所)に戻します。そこからscreen -r
で好きな画面に戻るか、 Ctrld 再びログアウトします。
単純なscreen -R
でうまくいくはずです。
これを確認するために、リモートサーバー上の.bash_profileにscreen -R
を追加し、ログインして画面から切り離し、リモートサーバー上の通常のシェルプロンプトにドロップしました。 .bashrcでも検証済み。その後のログインでは、期待どおりの結果が得られました(画面に再接続します)。
新しいウィンドウまたはスクリーンセッションを開始するときに、いくつかのソリューションで40のカスケードスクリーンセッションが作成されるという問題がありました。これが存在しない場合は、カスケード画面を削除して新しいセッションを作成することができました。
if [ -z "$STY" ]; then screen -R; fi
スクリーンセッションかどうかをテストし、スクリーンセッションでない場合はscreen -R
を実行します。テストを行わないと、「画面内からのアタッチ?」新しい画面ウィンドウを作成するたびに画面から警告。
screen -RR
は、利用可能な最初のセッションに再接続するか、必要に応じて作成します。
私があなたの必要性を理解しているなら、あなたは試すべきです:
if $(screen -ls | grep -q pts); then screen -x; else screen -R; fi
1つの画面セッションのみを作成します。それ以外の場合は、マルチウィンドウ方式で既存の画面に再接続します(複数のsshセッションがある場合でも、最終的に同じ画面セッションになります)
ここで少し拡張、
bashrcのスクリプトは、複数の切り離された画面セッションがあるかどうかをチェックします。それ以上ある場合は、手動でセッションを選択する必要があります。切り離されたセッションがあると、このセッションに戻ります。セッションを終了すると、sshセッションも終了します。
#Start Screen
if [ -z "$STY" ]; then
value=$( screen -ls |grep '\<pts.*Detached\>' |wc -l )
if [ $value -gt 1 ]; then
screen -ls
else
screen -R
echo 5 Sek. bis die SSH Session beendet wird.
echo Strg + C - um ohne screen weiter zu arbeiten.
sleep 6
exit
fi
fi
SSH経由で接続するときにスクリーンセッションに自動的に接続する場合は、以下のコードをリモートマシンの.bash_profile
または.bashrc
に追加すると、次のようになります。
.bashrc
に追加する場合は、ループを避けてくださいスクリプトは次のとおりです。
#!/bin/bash
#
# Attaches to the first Detached Screen. Otherwise starts a new Screen.
# Only run if we are not already inside a running screen and only if in an SSH session.
if [[ -z "${STY}" && ! -z "${SSH_CLIENT}" ]]; then
detached_screens=($(screen -ls | grep pts | grep -v Attached))
for screen in "${detached_screens[@]}"; do
if [[ "${screen}" == *".pts"* ]]; then
IFS='.pts' read -ra split <<< "${screen}"
for id in "${split[@]}"; do
first_id="${id}"
break
done
break
fi
done
screen -R $first_id
fi
PS:ローカルターミナルでこれを有効にする場合は、最初の行の&& ! -z "${SSH_CLIENT}
を削除してください。