Utilizzare quanto segue, ssc
, anziché ssh
. Se si esegue semplicemente "ssc remote.com
", verranno elencate le sessioni dello schermo esistenti. Dagli un terzo argomento e si collegherà a quella sessione dello schermo, oppure crearla e connettersi ad essa. In entrambi i casi, se ti disconnetti, puoi semplicemente fare "freccia su, immettere" nella shell per riconnetterti. Necessaria conoscenza dello schermo! Modifica: grazie a @klochner per estendere questo per gestire le opzioni ssh arbitrarie. Ora puoi usarlo proprio come 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\"");
}
Btw, c'è un trucco per forzare una sessione ssh per uscire e dare di nuovo il prompt del terminale locale quando si perde la connettività di rete:
https://superuser.com/questions/147873/ssh-sessions-in-xterms-freeze-for-many-minutes-whenever-they-disconnect
Per quanto lo schermo sia troppo intelligente con il suo completamento invisibile e silenzioso delle tabulazioni sui nomi delle schermate, suggerisco una convenzione per assicurarmi che ogni nome di schermo che usi inizi con una lettera distinta. Usa una parola descrittiva la prima volta ma da quel momento in poi puoi usare solo la prima lettera. – dreeves
Sul mio sistema Ubuntu (10.4) ho dovuto modificare l'espressione regolare per tenere conto delle informazioni sulla data/ora che stampa accanto a ciascuna sessione. if (/^\ s * (\ d +) \. (\ S +) \ s + \ (([^ \)] *) \) \ s + \ (([^ \)] *) \) /) { ($ num, $ tag, $ stato) = ($ 1, $ 2, $ 4); –