快速谷歌搜索表明我可以通过设置 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 中可用选项的限制。也就是说,如果您在使用任何可以控制终端的“全屏”应用程序(例如 、 或许多其他应用程序)时离开less
,vim
那么它就不起作用。 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 客户端连接到服务器(听起来可能是这种情况),那么只需指定
tmux
为RemoteCommand
.执行此操作的方法可能会根据您的客户端(例如 Putty)而有所不同,但对于标准命令行客户端,您将执行如下操作:> ssh user@server tmux #or > ssh -o "RemoteCommand=tmux" user@server
或者将其添加
RemoteCommand=tmux
到~/.ssh/config
该服务器的或者,如果您想在连接到服务器后手动启动 Tmux,或者可能在您的服务器中
~/.bash_profile
(尽管要小心这一点)。然后使用exec tmux
tmux取代父外壳。当退出或断开连接时tmux
,您将立即注销(或返回到更高级别的进程,仅有的如果有的话),而不是您启动它的 shell。