ssh登录后自动启动屏幕


19

我一直在阅读有关在ssh访问远程服务器时如何自动启动屏幕的信息。我希望添加一个简单的单行代码即可在我.bash_profile进入时启动,而screen在我ssh离开屏幕时不退出远程连接。

我一直在寻找到exec screen和几乎每一个组合-d-r-D-R和无法弄清楚,我需要什么标志。

理想情况下,我将输入新的内容ssh whatever并登录到服务器中,screen或者可以重新附加旧的屏幕,我想知道如何同时执行这两个操作,以查看自己更喜欢哪个屏幕。然后,我可以键入Ctrl adCtrl d让它回到ssh该服务器的常规登录名(您将在其中看到motd)。从那里,我可以screen -r返回所需的任何屏幕,或Ctrl d再次单击以注销。

Answers:


19

一个简单的screen -R就可以解决问题。

为了验证这一点,我将其添加screen -R到远程服务器上的.bash_profile中,登录后与屏幕分离,然后又被放回远程服务器上的常规Shell提示符。以及.bashrc的验证。随后的登录产生了预期的结果(重新附加到屏幕会话)。


谢谢!我正在阅读,印象很深刻,我需要执行屏幕-R。很高兴这项工作
罗纳德·德雷根

一旦通过ctrl + D关闭屏幕后,立即在ssh会话中终止该行,logout或者exit立即放置该行,是否是一个坏主意?
Griddo

这对我不起作用。由于每次会话开始都会执行该行,因此我启动了几十个屏幕。您是如何做到的,这样就不会发生?
托马斯

11

在启动新窗口或屏幕会话时,使用某些解决方案创建了40个级联屏幕会话时,我遇到了问题。我可以消除级联屏幕,并创建一个新的会话(如果与此不存在):

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

它测试您是否在屏幕会话中,screen -R如果不是,则运行。如果没有测试,您将获得“从屏幕内部安装?” 每次您创建新的屏幕窗口时,屏幕都会发出警告。


+1 -像这样好过的screen -ls测试托尼提到
CWD

10

screen -RR 将重新附加到第一个可用会话,或在必要时创建一个会话。


这真的很有用,因为使用screen -R给我造成了多个会话的麻烦。
David V.

太好了,谢谢!它连接到找到的第一个“独立”会话(如果有),并忽略附加的会话。因此,它允许您登录并打开多个窗口,但仍要确保每个会话都可以在屏幕上运行。我们的OPS员工感谢您!
伊恩·麦克高恩

8

如果我了解您的需求,请尝试:

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

它只会创建一个屏幕会话,否则将以多窗口方式重新连接到现有的屏幕会话(即使您有多个ssh会话,您也将最终到达同一屏幕会话)


我喜欢这个想法,因为它认识到我们有多窗口SSH客户端(或者有时直接在计算机上登录)。如果您使用Bitvise之类的东西并打开多个终端窗口,这将非常灵活-您可以将单个屏幕窗口变成单独的物理窗口。
Piku

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}在第一行上将其删除。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.