19

もちろん、画面は素晴らしいですが、私はそれについて考える必要はありません。私はよくマシンにSSHで接続し、たくさんのことを始めて、「まあ、後で家からこれに再接続できるように、すべてを行う前にスクリーンセッションを開始することを考えていたらよかったのに」と思います。

マシンにログインするたびに画面が自動的に起動するようにしたいのですが。そして、切断されたときに、「screen-ls」や「screen-dr」に煩わされることなく、すぐに簡単に再接続できるようにしたいと考えています。

この問題の1つの解決策を実装するスクリプトがあり、それを回答として投稿します。他のアプローチに興味があります。

4

9 に答える 9

15

sscの代わりに、次の、を使用しますssh。「ssc remote.com」を実行すると、既存の画面セッションが一覧表示されます。3番目の引数を指定すると、その画面セッションに接続するか、作成して接続します。いずれにせよ、切断された場合は、シェルに「上矢印、入力」を実行して再接続できます。画面の知識は必要ありません!編集:任意のsshオプションを処理するためにこれを拡張してくれた@klochnerに感謝します。これで、sshと同じように使用できます。

#!/usr/bin/env perl
# Use 'ssc' (this script) instead of 'ssh' to log into a remote machine.
# Without an argument after the hostname it will list available screens.
# Add an argument after the hostname to attach to an existing screen, or
#   specify a new screen.  Eg, ssc remote.com foo
# The numbers in front of the screen tag can usually be ignored.

# ssh option parsing by @klochner
my $optstring = ""; 
while ($val = shift) {
  if    ($val =~ /^-\w$/)  { $optstring .= " ".$val.(shift); }
  elsif ($val =~ /^-\w+$/) { $optstring .= " ".$val;         }
  elsif ($machine)         { $tag        =     $val;         }
  else                     { $machine    =     $val;         }
}

if (!$machine) {
  print "USAGE: ssc [ssh options] remote.com [screen name]\n";
} elsif (!$tag) {
  @screens = split("\n", `ssh $optstring $machine screen -ls`);
  for(@screens) {
    if(/^\s*(\d+)\.(\S+)\s+\(([^\)]*)\)/) {
      ($num, $tag, $status) = ($1, $2, $3);
      if($status =~ /attached/i) { $att{"$num.$tag"} = 1; }
      elsif($status =~ /detached/i) { $att{"$num.$tag"} = 0; }
      else { print "Couldn't parse this: $_\n"; }
      # remember anything weird about the screen, like shared screens
      if($status =~ /^(attached|detached)$/i) { 
        $special{"$num.$tag"} = "";
      } else {
        $special{"$num.$tag"} = "[$status]";
      }
    }
  }
  print "ATTACHED:\n";
  for(sort { ($a=~/\.(\w+)/)[0] cmp ($b=~/\.(\w+)/)[0] } keys(%att)) {
    ($tag) = /\.(\w+)/;
    print "  $tag\t($_)\t$special{$_}\n" if $att{$_};
  }
  print "DETACHED:\n";
  for(sort { ($a=~/\.(\w+)/)[0] cmp ($b=~/\.(\w+)/)[0] } keys(%att)) {
    ($tag) = /\.(\w+)/;
    print "  $tag\t($_)\t$special{$_}\n" unless $att{$_};
  }
} else {
 system("ssh $optstring -t $machine \"screen -S $tag -dr || screen -S $tag\"");
}

ところで、ネットワーク接続が失われたときにsshセッションを強制的に終了し、ローカルターミナルプロンプトを返すためのトリックがあります:
https ://superuser.com/questions/147873/ssh-sessions-in-xterms-freeze-for-何分-いつでも-彼らは切断します

于 2009-07-02T18:29:18.990 に答える
10

autossh切断されたsshセッションを自動的に再接続するものがあります。

rscreenそれはまさにそれを行うと呼ばれるサンプルスクリプトが付属しています。それは、単純に:

#!/bin/sh
autossh -M 0 -t $1 "screen -e^Aa -D -R"

rscreen hostname次に、代わりに入力するように指を再トレーニングする必要がありますssh hostname

于 2009-12-13T13:43:51.723 に答える
7

実際、screenはTERM変数を「screen」に設定します。したがって、スクリプトはさらに簡単です。これが私が使用するものです:

if [ "$TERM" != "screen" ]; then
  screen -xRR
fi

チャームのように機能し-x、画面がどこかに取り付けられていても、ここに取り付けることができます。このように、私はすべてを追跡できる1つの画面しか持っていません。

于 2009-08-11T02:56:08.277 に答える
7
ssh user@host.com -t 'screen -dRR'

これにより、接続時に画面セッションがリロード/作成されます。これは、セッションを生成する責任を開始クライアントに移したとしても、要求されたとおりに実行されます。理想的には、接続しているクライアントに提示されるものを管理するサーバー上のプロセスが必要になります。私の知る限り、それは存在しません。このスレッドで理想的な解決策を提案した人は誰もいません。私にとって、これは他の部分よりも「理想的ではない」ということではありません。スクリプト、バグ、TTYの問題、他のsshコマンドとの不正な相互作用、無限ループの可能性、ファイル編集、追加のパッケージは必要ありません。

于 2011-03-23T18:27:58.147 に答える
3

.bashrcに次のものがあります

 if [ "$PS1" != "" -a "${_STARTED_SCREEN:-x}" = x -a "${SSH_TTY:-x}" ] 
 then 
     export _STARTED_SCREEN=1;
     sleep 1 
     screen -RR && exit 0 
     # normally, execution of this rc script ends here... 
     echo "Screen failed! continuing with normal bash startup" 
 fi

しばらく前にオンラインで見つけましたが、どこにあるのかわかりません。

更新コメントで指摘されたエラーを修正しました。ありがとうR.パテ

于 2009-07-02T18:30:57.490 に答える
2

私はautosshを使用しました、それは私にとって非常に便利です

于 2010-05-05T06:54:07.657 に答える
1

たぶんexec screen -drあなたの.loginに入れますか?

于 2009-07-02T18:29:27.523 に答える
1

モッシュ(モバイルシェル)を使用しています。スリープモードになったり、ネットワークから切断したり、IPを変更したりしても、接続は維持されます。あなたが戻るときはいつでも、あなたはあなたの接続を取り戻します。

于 2016-03-22T18:22:17.043 に答える
0

シェルによって異なりますが、.bashrcはどうですか?(bash "screen -rd"を使用する場合)

于 2009-07-02T18:28:59.830 に答える