56

追加:この質問は今、これに含まれていると私は信じています:GNUScreenを 完全に透過的かつ自動的に使用する

この関連する質問も参照してください:
https ://superuser.com/questions/147873/ssh-sessions-in-xterms-freeze-for-many-minutes-whenever-they-disconnect

元の質問:

マシンにSSHで接続し、すぐに特定の画面セッションに再接続する方法があれば便利です。あなたはこれを行うことができます:

laptop> ssh server.com screen -ls

そしてそれは次のようにserver.comで利用可能な画面のリストを表示します[1]:

123.pts-1
456.pts-2

そして、あなたはこれをやろうとするかもしれません:

laptop> ssh server.com screen -dr pts-2

しかし、「端末に接続する必要があります」と言って失敗します。最初にSSHで接続してから、server.comで「screen-dr pts-2」を実行する必要があります。これは、接続が不安定で接続が頻繁に切断される場合は適切ではありません。ラップトップで単純な「上矢印入力」で再開できるようにする必要があります。(または、さらに自動化することもできます。)

私はこの問題に対する巧妙な解決策を持っており、それを答えとして投稿し、これに対処する正しい方法を支持して忘却に反対することを願っています。


脚注:

screen -S foo[1]または、「 」や「」などの名前でスクリーンセッションを作成した場合は、次のようなわかりやすいscreen -S barリストが表示されます。

123.foo
456.bar

そして、例えば、" screen -dr foo"と再接続することができます。


この質問への回答を組み込んだミニスクリーンチュートリアル:

server.comにログインして実行します

screen -S foo 

その後、そのセッションから再度ログアウトすることはありません。他の場所から再接続するには、

ssh -t server.com screen -dr foo

再接続するために使用可能な画面を一覧表示するには:

screen -ls

または、もちろん、

ssh server.com screen -ls

server.comの利用可能な画面をリモートで確認します。

以下のJasonの回答に基づいて、次のエイリアス(tcsh)を使用して、名前付き画面が存在する場合はそれに接続するか、そうでない場合は作成して接続します。

alias ssc 'ssh -t \!:1 "screen -S \!:2 -dr || screen -S \!:2"'
4

6 に答える 6

62

オプションはあなた-tが望むことをしますか?

     -t疑似tty割り当てを強制します。これは、arbi-を実行するために使用できます。
             リモートマシン上の画面ベースのプログラム。
             メニューサービスを実装する場合など、非常に便利です。複数の-t
             オプションは、sshにローカルttyがない場合でも、ttyの割り当てを強制します。

それで:

laptop> ssh -t server.com screen -dr pts-2

これは私のインストールでは機能するようです。

于 2009-01-23T23:08:59.533 に答える
4

これは、次のようにまとめられます: Using GNU Screencompletely transparently and automatically


次のスクリプトはsscと同じように機能sshしますが、再接続先のスクリーンまたは新しいスクリーンの名前を指定する 3 番目の引数を取ります。このスクリプトには、元の質問のすべてが含まれていると思います。

#!/usr/bin/env perl
# Use 'ssc' (this script) instead of 'ssh' to log into a remote machine.
# Without a 3rd argument it will list available screens.
# Give it a 3rd argument 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.
# Screen is a little too clever though in that if there's an existing screen "bar"
#   and you say "ssc remote.com b" it will reconnect you to "bar" instead of making
#   a new screen "b".  It's like invisible and silent tab-completion.

if(scalar(@ARGV)==0 || scalar(@ARGV) > 2) {
  print "USAGE: ssc remote.com [screen name]\n";
} elsif (scalar(@ARGV) == 1) {
  $machine = shift;
  @screens = split("\n", `ssh $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"; }
    }
  }
  print "ATTACHED screens:\n";
  for(keys(%att)) { print "  $_\n" if $att{$_}; }
  print "DETACHED screens:\n";
  for(keys(%att)) { print "  $_\n" unless $att{$_}; }
} else {
  $machine = shift;
  $tag = shift;
  system("ssh -t $machine \"screen -S $tag -dr || screen -S $tag\"");
}
于 2009-07-02T17:56:10.947 に答える
2

-tコマンドを直接実行しているときに端末を割り当てるには、sshオプションを使用します。

laptop> ssh -t server.com screen -dr pts-2
于 2009-01-23T23:10:00.700 に答える
2

私は似たようなことに取り組んできましたが、そこまでは行きませんでした.あなたの解決策は私の問題を解決したので、ここに私の提案があります:

ssh -t server.com "screen -S foo -rd || screen -S foo"

これは、foo という名前の既存のスクリーンを開こうとするだけで、存在しない場合は作成します。これをラップトップのランチャーに入れて、ワイヤレス ネットワークが接続されたときに中断したところから開くことができるようにします。

デフォルトのスクリーン シェルが少し弱いことに気付きました。そのため、ホーム環境をもう少し適切に設定するための改善点は次のとおりです。

ssh -t server.com "screen -S foo -rd || screen -S foo bash -l"
于 2009-03-12T18:25:24.120 に答える
1

これを変換して、OS X .bash_profile で動作するようにしました。2 番目のパラメーターが指定されていない場合、セッション「デフォルト」が開始されます。

function ssc() {
    if [[ -z $2 ]]; then
        screen="default"
    else
        screen=$2
    fi
    ssh -t $1 "screen -S $screen -dr || screen -S $screen"
}
于 2013-09-06T06:34:40.760 に答える