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


18

sshリモートサーバーにアクセスしたときに自動的に画面を開始する方法について読んでいます。シンプルなワンライナーを追加して、私.bash_profileが入るscreenときに開始しssh、画面をデタッチしたときにリモート接続を終了しないようにします。

私はに探しているexec screenと、ほとんどのあらゆる組み合わせを-d-r-D-R、私は必要なもののフラグを把握することはできません。

理想的にはssh whatever、新しいscreen画面でサーバーに入力してログインするか、古い画面に再接続できるので、どちらが良いかを確認するために両方を行う方法を知りたいと思います。その後、私はどちらか入力することができますCtrl adCtrl d、それが正常に戻って私を持っていsshます(MOTDを見るであろう)、そのサーバーのログイン。そこからscreen -r、必要な画面に戻るか、Ctrl dもう一度クリックしてログアウトします。

回答:


18

簡単な方法でscreen -Rトリックを行う必要があります。

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


ありがとう!私は周りを読んでいて、exec screen -Rが必要だという印象を受けました。これが機能して
良かった

置くことは悪い考えであるlogoutか、exit右画面にCtrl + Dによって閉鎖された後のST sshセッションが直ちに終了し、その行の後に?
-Griddo

これは私にはうまくいきませんでした。セッションが開始されるたびに行が実行されるため、数十の画面を開始しました。これが起こらないようにどのようにしたのですか?
トーマス

10

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

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

スクリーンセッション中かどうかをテストし、screen -Rそうでない場合は実行します。テストなしでは、「画面の内側から接続しますか?」新しい画面ウィンドウを作成するたびに画面から警告が表示されます。


1 -より良い、このようなscreen -lsトニーが言及したことをテスト
CWD

9

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


screen -Rを使用すると、複数のセッションで問題が発生したため、これは本当に役に立ちました。
デビッドV.

これはすごい、ありがとう!最初に見つかった「切り離された」セッション(ある場合)に接続し、接続されたセッションを無視します。したがって、ログインして複数のウィンドウを開くことができますが、それでも各セッションが画面で実行される保護を持っていることを確認してください。OPSの皆さん、ありがとうございます!
イアンマッゴーワン

8

私はあなたの必要性を理解している場合、あなたは試してみてください:

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

作成されるスクリーンセッションは1つだけです。そうでない場合は、マルチウィンドウ形式で既存のセッションに再接続します(複数のsshセッションがある場合でも、同じスクリーンセッションになります)


マルチウィンドウSSHクライアントを持っている(またはマシンに直接ログインすることもある)という認識からこのアイデアが気に入っています。Bitviseのようなものを使用し、複数のターミナルウィンドウを開いている場合、非常に柔軟です。個々の画面ウィンドウを個別の物理ウィンドウに変えることができます。
ピク

1
これはすべて、に置き換えることができます。これはscreen -xR、「アタッチするものがある場合はアタッチし、そうでない場合は新しい画面を作成する」と解析されるようです。
Piskvorは、

0

ここで少し拡張して、

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

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

  • SSH経由で接続するたびに、新しいスクリーンセッションを開始します。
  • 既存の既存の再利用 常に最新のセッションから開始して、デタッチスクリーンセッションを。使用可能な切り離されたセッションがない場合、新しいセッションが開始されます。
  • マシンへの複数の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}は、最初の行で削除します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.