web-dev-qa-db-ja.com

sshログイン時に画面を自動的に開始する

リモートサーバーにsshしたときに画面を自動的に起動する方法について読んでいます。 screenを開始するときにsshを開始し、画面を切り離すときにリモート接続を終了しないように、.bash_profileに簡単なワンライナーを追加したいと思います。

私はexec screen-d-r-D-Rのほとんどすべての組み合わせを調査しており、必要なフラグを特定できません。

理想的には、ssh whateverと入力して、新しいscreenでサーバーにログインするか、古い画面に再接続できます。どちらが良いのかを確認する方法を知りたいのですが。それから私はどちらかを入力することができます Ctrlad または Ctrld そして、そのサーバーの通常のsshログイン(motdが表示される場所)に戻します。そこからscreen -rで好きな画面に戻るか、 Ctrld 再びログアウトします。

22
Ronald Dregan

単純なscreen -Rでうまくいくはずです。

これを確認するために、リモートサーバー上の.bash_profileにscreen -Rを追加し、ログインして画面から切り離し、リモートサーバー上の通常のシェルプロンプトにドロップしました。 .bashrcでも検証済み。その後のログインでは、期待どおりの結果が得られました(画面に再接続します)。

19
btanaka

新しいウィンドウまたはスクリーンセッションを開始するときに、いくつかのソリューションで40のカスケードスクリーンセッションが作成されるという問題がありました。これが存在しない場合は、カスケード画面を削除して新しいセッションを作成することができました。

if [ -z "$STY" ]; then screen -R; fi

スクリーンセッションかどうかをテストし、スクリーンセッションでない場合はscreen -Rを実行します。テストを行わないと、「画面内からのアタッチ?」新しい画面ウィンドウを作成するたびに画面から警告。

13
seq3

screen -RRは、利用可能な最初のセッションに再接続するか、必要に応じて作成します。

11
user1187902

私があなたの必要性を理解しているなら、あなたは試すべきです:

if $(screen -ls | grep -q pts); then screen -x; else screen -R; fi

1つの画面セッションのみを作成します。それ以外の場合は、マルチウィンドウ方式で既存の画面に再接続します(複数のsshセッションがある場合でも、最終的に同じ画面セッションになります)

8
Tony

ここで少し拡張、

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
0
Thomas

SSH経由で接続するときにスクリーンセッションに自動的に接続する場合は、以下のコードをリモートマシンの.bash_profileまたは.bashrcに追加すると、次のようになります。

  • SSH経由で接続するたびに新しいスクリーンセッションを開始します。
  • 既存の再利用detachedスクリーンセッション、常に最新のものから開始。分離されたセッションがない場合は、新しいセッションを開始します。
  • マシンへの複数のSSH接続を開くと、切り離されたものだけを再利用するため、別の画面セッションが表示されます。
  • スクリプトを.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}を削除してください。

0
Nicolas Garnier