PuTTY/SSH:如何防止自动注销?

PuTTY/SSH:如何防止自动注销?

当我使用 PuTTY (Windows XP) 连接时,我的 ISP 的 SSH 服务器 (Debian 2.0) 在 35 分钟不活动后将我注销。当我使用该服务器进行端口转发时,这是一个大问题。终端中显示的最终消息:

This terminal has been idle 30 minutes. If it remains idle
for 5 more minutes it will be logged out by the system.

Logged out by the system.

PuTTY 选项不是帮助:

  • 发送空数据包以保持会话处于活动状态。保持活动间隔秒数(0 表示关闭):30
  • [x] 启用 TCP 保持连接 (SO_KEEPALIVE 选项)

知道如何避免自动注销吗?我应该尝试另一个 SSH 客户端吗?

答案1

当你只需要端口转发时,你可以尝试完全禁用启动shell,并禁用分配伪终端。然后终端就不能再闲置了。:-)

如果你的 ISP 不允许这样做,你可以在 shell 会话中运行这样的脚本

while sleep 60; do
    echo "Still there"
done

这样终端就会显示活动并且不应被注销。

但这取决于他们使用的操作系统,哪个选项有用。你没有告诉我们,是吗?uname -a是你的朋友。

答案2

您在服务器上使用哪种 shell?

您可以尝试完全不使用 shell 进行登录,方法是勾选ConnectionSSHDon't start a shell or command at all,或者您可以尝试运行不同的 shell 并确保它没有启用自动注销功能。

例如,尝试运行tcsh并通过执行确保autologout未设置unset autologout

答案3

我有一个简单的 AutoHotkey 脚本来处理从 Windows 打开的任何 Telnet/SSH 会话。它可能会帮助某些人:

SetTitleMatchMode 2     ; 2 - partially, 3 - exact match
MyWinTitle=- PuTTY      ; Describe the window for keep alive signals
Timeout=180000          ; Call KeepAlive every 180 seconds (180000 ms)

ttl := Timeout / 1000
ToolTip, Keepalives every '%ttl%' seconds for the last touched '%MyWinTitle%' window`nTo stop the keepalive press F12
SetTimer, RemoveToolTip, 3000   ; Shows the tooltip for 5 seconds
return

RemoveToolTip:
    SetTimer, RemoveToolTip, Off    ; only once
    ToolTip
    Gosub, MyKeepAlive
Return

MyKeepAlive:
    WinGetActiveTitle, Title

    IfWinExist, %MyWinTitle%
    {
        WinActivate
        WinGet, mywin_id
        WinGetActiveTitle, mywin_title
        Send {!}{BS}
        MsgBox,,Info message, The window for keep-alives is '%mywin_title%',3
        WinActivate, %Title%
    }
    else
    {
        MsgBox,,Exit message, Open the window first!,10
        ExitApp
    }

    SetTimer, KeepAlive, %Timeout%
    Return

    KeepAlive:
        WinGetActiveTitle, Title
        WinGetTitle, current_title, ahk_id %mywin_id%

        If current_title = %mywin_title%
        {
            WinActivate, ahk_id %mywin_id%
            Send {!}{BS}
            WinActivate, %Title%
        }
        else
        {
            MsgBox,,Exit message, The window was closed!,10
            ExitApp
        }
    Return
Return

F12::ExitApp                ; Exit button

答案4

看起来服务器在协议级别强制执行超时,并明确忽略空数据包,这些空数据包通常用于在超时的情况下保持连接处于活动状态。不幸的是,这意味着您可能无法通过客户端选项执行任何操作。

您可以尝试安排会话中的某些内容不断更新,例如使用byobu(或tmuxscreen直接)并安排更新时钟位于状态栏中,这是大多数 Linux 发行版的标准配置中的默认设置byobu

如果不使用这样的屏幕显示管理器,您可以尝试运行 SSH 会话中自动更新的任何东西以使其保持隧道活动,例如watch -n 10 date

相关内容