屏幕是惊人的,当然,但我不想去想它。 我经常ssh到一台机器,开始做一堆东西,然后想“天哪,我希望我原以为这样做一切,所以我可以从家里后重新连接到这之前启动屏幕会话”。
我想有屏幕会自动启动,每当我登录到一台机器。 当我得到断开的,我希望能够立即只需重新连接而不会“屏幕-ls”和“屏幕-dr”大惊小怪。
我有一个实现一个解决这个问题,我会后作为回答的脚本。 我很感兴趣,看看其他方法。
屏幕是惊人的,当然,但我不想去想它。 我经常ssh到一台机器,开始做一堆东西,然后想“天哪,我希望我原以为这样做一切,所以我可以从家里后重新连接到这之前启动屏幕会话”。
我想有屏幕会自动启动,每当我登录到一台机器。 当我得到断开的,我希望能够立即只需重新连接而不会“屏幕-ls”和“屏幕-dr”大惊小怪。
我有一个实现一个解决这个问题,我会后作为回答的脚本。 我很感兴趣,看看其他方法。
使用下面, ssc
,而不是ssh
。 如果你只是做“ ssc remote.com
”,那么它会列出现有的屏幕会话。 给它一个第三个参数,它会连接到屏幕会话,或者创建它,连接到它。 无论哪种方式,如果您断开连接,你可以做的外壳重新连接“向上箭头,输入”。 屏幕零所需的知识! 编辑:感谢@klochner延长该处理任意SSH选项。 您现在可以使用这个就像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-many-minutes-whenever-they-disconnect
有autossh
它会自动重新连接断开的ssh-会议。
它配备了一个示例脚本调用rscreen
这正是这么做的。 它是简单的:
#!/bin/sh
autossh -M 0 -t $1 "screen -e^Aa -D -R"
然后,你必须重新训练你的手指键入rscreen hostname
,而不是ssh hostname
其实屏幕设置TERM变量“屏幕”。 因此脚本更容易。 下面是我使用:
if [ "$TERM" != "screen" ]; then
screen -xRR
fi
工程就像一个魅力, -x
确保即使在屏幕连接别的地方我重视它在这里。 这样,我只有每一个屏幕,我可以跟踪所有。
ssh user@host.com -t 'screen -dRR'
这将重新加载/上连接创建你的屏幕会话。 这确实是要求什么,即使它移动的会议产卵到发起客户端的责任。 理想情况下,你会希望在服务器管理得到什么呈现给连接客户端的一些过程。 据我知道,不存在。 没有人建议在此线程的理想解决方案。 对我来说这是不及其余“不理想”。 没有剧本,没有错误,没有TTY问题,与其他SSH命令无不良相互作用,无限循环,没有文件的编辑没有潜在的,不需要额外的软件包。
我在我的.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.佩特
我已经使用autossh,这对我来说非常有用
也许把exec screen -dr
在你的.login?
我用狂舞(手机壳) 。 该公司密切关注,即使你去从网络休眠模式,断开连接,改变IP,所以您的连接。 当您返回时,你会得到你的连接了。
取决于你的外壳,但怎么样的.bashrc? (如果你使用bash“屏幕-rd”)