如何在fish shell中启用自动注销?

如何在fish shell中启用自动注销?

快速谷歌搜索表明我可以通过设置 TMOUT 参数来启用自动注销(对于文本控制台)。然而,我后来发现这只适用于 bash shell。

如果我的默认 shell 是 Fish,有没有办法设置自动注销计时器?

什么目的?当然是安全。我希望它在闲置 1 分钟时锁定。

答案1

虽然 Fish 本身不直接支持TMOUT,但有一些替代方案可能适合您。鉴于我的两种方法截然不同,我将把它们包含在两个单独的答案中。

首先(而不是我的首选方法,但它最接近 Bash 功能),具体取决于您的 Fish 版本:

简短回答:

创建一个新文件~/.config/fish/conf.d/fish_tmout.fish

function start_logout_timer --on-event fish_prompt
    # Allows $last_pid to work in a function
    status job-control full
    if set --query __fish_tmout_pid
        # Stop previous timer
        kill -- -$__fish_tmout_pid
    end
    # Start new timer
    FISH_PID=%self sh -c "sleep 60; kill -HUP $FISH_PID" &
    # Allows logout without warning of background jobs
    disown
    set -gx __fish_tmout_pid $last_pid
end

function stop_logout_timer --on-event fish_preexec
    if set --query __fish_tmout_pid
        kill -- -$__fish_tmout_pid
    end
    set --erase __fish_tmout_pid
end

重新启动 shell,您应该会发现 shell 中没有任何活动 1 分钟后您会自动注销。

兼容性:至少 Fish 3.2.2 及更高版本。已知不适用于 3.0.2 及更早版本。

小警告:当您执行ps.

注意:这确实处理运行的多个 shell 实例,因为每个 shell 都在全局(非通用)变量中跟踪自己的 PID 和计时器。

解释:

您可以尝试通过其他 Fish 功能来复制该 Bash 功能。但是,由于(根据您对 Stack Overflow 的评论),您希望这样做是为了保护周围其他人的会话,以防您忘记注销,因此您应该意识到此功能以及TMOUT其他 shell 中可用选项的限制。也就是说,如果您在使用任何可以控制终端的“全屏”应用程序(例如 、 或许多其他应用程序)时离开lessvim那么它就不起作用。 TMOUT仅当您让 Bash 空闲时处理根据提示

同样,这种方法也有同样的局限性。考虑到这一点 ...

Bash 手册有这要说关于TMOUT

在交互式 shell 中,该值被解释为发出主提示后等待一行输入的秒数。如果未到达完整的输入行,Bash 将在等待该秒数后终止。

用 Fish 的话来说,那就是:

  • 两次连续提示显示之间的时间间隔
  • 显示提示和用户输入交互式命令之间的时间间隔

Fish 函数钩子可以处理以下内容:

  • fish_prompt
  • fish_preexec

所以上面的脚本:

  • sleep当显示提示时 ( fish_prompt)启动自动注销计时器(通过)
  • fish_prompt当显示下一个提示 ( ) 或输入命令 ( )时,停止该计时器(通过终止拥有计时器的子进程并注销)fish_preexec
  • SIGHUP当计时器到期时从 shell 注销(通过)而不被终止

答案2

“在不活动时保护 shell”的另一个选项是使用tmux,可能与 结合使用vlock,假设它们在相关服务器上可用或者您有权安装它们。

假设这些已安装并就位,请编辑~/.tmux.conf并添加以下内容:

set -g lock-after-time 60
set -g lock-command vlock

或者 ...

set -g lock-after-time 60
set -g lock-command "tmux kill-session"

这将在 60 秒不活动后锁定或终止整个 Tmux 会话(所有窗格)。虽然我在 Tmux 文档中没有看到这一点,但这种情况下的不活动似乎是由“缺少按键”定义的。在我的测试中,命令(例如 a )的屏幕输出tail -f似乎不会停止不活动计时器。

这比TMOUT替代方法更安全,因为当您运行vi或 之类的交互式命令时它也可以工作less

请注意,为了使其真正安全,tmux需要在 ssh 会话或终端中作为顶级 PID 运行。有几种方法可以做到这一点:

  • 如果您通过 ssh 客户端连接到服务器(听起来可能是这种情况),那么只需指定tmuxRemoteCommand.执行此操作的方法可能会根据您的客户端(例如 Putty)而有所不同,但对于标准命令行客户端,您将执行如下操作:

    > ssh user@server tmux #or
    > ssh -o "RemoteCommand=tmux" user@server
    
  • 或者将其添加RemoteCommand=tmux~/.ssh/config该服务器的

  • 或者,如果您想在连接到服务器后手动启动 Tmux,或者可能在您的服务器中~/.bash_profile(尽管要小心这一点)。然后使用exec tmuxtmux取代父外壳。当退出或断开连接时tmux,您将立即注销(或返回到更高级别的进程,仅有的如果有的话),而不是您启动它的 shell。

相关内容