1 个不稳定版本
0.1.0 | 2024年7月18日 |
---|
#3 在 #守护进程
每月下载量 103
23KB
159 行
shpool
shpool
是一种服务,通过允许创建由 shpool
拥有的命名 shell 会话来启用会话持久性,这样在连接断开时也不会丢失会话。可以认为 shpool
是 tmux
或 GNU screen
的轻量级替代品。虽然 tmux
和 screen
会接管整个终端并提供窗口分割和拼接功能,但 shpool
只提供持久会话。这种方法的最大优势是 shpool
不会打断原生的滚动回滚或复制粘贴。
安装
从 crates.io 安装
运行
cargo install shpool
curl -fLo "${XDG_CONFIG_HOME:-$HOME/.config}/systemd/user/shpool.service" --create-dirs https://raw.githubusercontent.com/shell-pool/shpool/master/systemd/shpool.service
sed -i "s|/usr|$HOME/.cargo|" "${XDG_CONFIG_HOME:-$HOME/.config}/systemd/user/shpool.service"
curl -fLo "${XDG_CONFIG_HOME:-$HOME/.config}/systemd/user/shpool.socket" --create-dirs https://raw.githubusercontent.com/shell-pool/shpool/master/systemd/shpool.socket
systemctl --user enable shpool
systemctl --user start shpool
loginctl enable-linger
用法
通常,shpool
用于在远程主机上 SSH 登录时提供持久会话。为此,必须在远程主机上安装 shpool
。客户端不需要额外的软件。安装和设置后,典型的使用模式是在已安装 shpool 的主机上 SSH 登录,然后通过运行 shpool attach main
创建新的命名会话。在这里,main
是会话的名称。您将需要为连接到远程主机的每个终端创建单独的命名会话。如果您的连接断开或卡住,您可以再次 SSH 登录到远程主机,并通过再次运行 shpool attach main
重新连接到相同的命名会话。
如果您的终端卡住并强制关闭窗口,您可能会发现当您尝试重新连接时,shpool
仍然认为终端连接到您的会话。这可能是由于 SSH 代理在徒劳地希望再次获得一些流量时保持连接开放。您只需运行 shpool detach main
即可强制会话断开,以便您能够连接。
本README涵盖了基本用法,但您也可以查看维基获取更多技巧和窍门。
故障排除
故障排除维基页面包含一些关于已知问题的信息。
配置
您可以通过编辑您的~/.config/shpool/config.toml
文件来自定义一些shpool
的行为。有关配置选项的深入讨论,请参阅CONFIG.md。
Shell配置
bash
如果您使用bash,您可能想要确保huponexit
选项已设置,以确保当您离开shell时子进程会退出。如果没有这个设置,在您的shell会话期间产生的后台进程将保留在shpool
守护进程的进程树中并消耗内存。要设置此选项,请在您的~/.bashrc
中添加以下内容:
shopt -s huponexit
。
子命令
shpool守护进程
daemon
子命令使shpool
以守护进程模式运行。在此模式下,shpool
将监听传入的连接并打开子shell,在表中保留对它们的拥有权。通常,此子命令不会直接由用户调用,而是从systemd单元文件中调用。
shpool attach
attach
子命令连接到shpool守护进程
实例,传入一个名称。如果该名称是新的,则创建一个新的shell,如果它已经存在,则只要没有其他终端当前连接到该会话,它就会附加到现有会话。可以使用--ttl
标志限制会话的持续时间。
shpool list
列出所有当前shell会话。
shpool detach
从一个或多个会话中分离,而不会停止它们。如果在shpool
会话内部运行且没有会话名称参数,则将断开当前会话。
shpool kill
终止一个命名的shell会话。
(可选) 自动连接到shpool
显式命名的会话
指定会话名称让您可以为每个会话分配逻辑角色,例如文本编辑。
ssh配置
如果您通常与特定机器上的相同作业连接到少量会话,则客户端机器上的自定义ssh配置块可能是最佳选择。
为此,您可以在客户端机器上的~/.ssh/config
中添加一个名为edit
的配置块,如下所示
Host = edit
Hostname remote.host.example.com
RemoteCommand shpool attach -f edit
RequestTTY yes
。
shell函数
如果您希望更有灵活性地指定会话名称和目标机器,您可以创建一个自定义shell函数,以便在调用时指定这两个参数。在您的.bashrc
中添加以下内容
function shpool-ssh () {
if [ $# -ne 2 ] ; then
echo "usage: shpool-ssh <remote-machine> <session-name>" >&2
return 1
fi
ssh -t "-oRemoteCommand=shpool attach -f $2" "$1"
}
然后像这样调用它:shpool-ssh remote.host.example.com main
。
基于本地tty
而不是在连接时指定显式名称,您可以将系统设置为根据您的本地终端仿真器的tty编号自动生成shpool
会话名称。为此,您可以在本地机器的~/.ssh/config
中添加以下自定义ssh配置块
Host = by-tty
User remoteuser
Hostname remote.host.example.com
RemoteCommand shpool attach -f "ssh-$(basename $(tty))"
RequestTTY yes
您可以使用 ssh by-tty
来调用它。同样的原则也适用于使用 $(basename $(tty))
获取一个唯一标识符,以便在自定义shell函数方法中使用本地终端。
基于本地-tty的方法的优点是您不需要指定会话名称,但如果您必须关闭本地窗口并打开新终端,可能会遇到问题,这可能会发生在连接冻结而不是掉线时。
与其他工具的比较
tmux
和 GNU screen
tmux
可能是知名度最高的会话持久化工具,GNU screen
也具有类似的功能集,因此与 shpool
相比,可以认为它们属于同一类别。
shpool
与 tmux
的主要区别在于,tmux
是一个终端多路复用器,这意味着它必然提供会话持久化功能,而 shpool
仅仅旨在成为一个会话持久化工具。与 tmux
不同,shpool
的理念是管理不同的终端是您的显示或窗口管理器的职责,而不是您的会话持久化工具的职责。每个操作系统都有自己的应用程序之间切换的习语,而且没有必要在切换终端时切换到不同的习语。特别是对于使用 i3
、sway
或 xmonad
等平铺窗口管理器的用户来说,tmux 的多路复用功能是多余的。
虽然 tmux
在远程渲染终端内容,只将当前视图绘制到屏幕上,但 shpool
只是将所有shell输出直接发送回用户的本地终端。这意味着所有的渲染都由单个终端状态机处理,而不是通过 tmux
内部的内存终端,然后再由本地终端格式化和重新渲染。这有性能影响,而且最重要的是,使用 shpool
的终端会感觉完全原生。滚动和复制粘贴将像在您的本地终端中一样工作,而当使用 tmux
时,它们可能会有不同的表现。
mosh
mosh
是另一个专注于提供持久远程shell会话的工具。它与其他讨论的工具的不同之处在于,它有自己的网络协议,它从常规 ssh 中启动。像 tmux
一样,它远程渲染屏幕内容,只发送当前视图。它在尝试预测性地猜测在网络延迟时向用户显示的正确输出方面具有一定的独特性。
shpool
与 mosh
的不同之处在于,它与网络无关,像大多数其他工具一样,仅限于单台机器。就像在 tmux
的情况下一样,mosh
将影响滚动和复制粘贴的工作方式,而 shpool
则使它们完全原生。
dtach
、abduco
和 diss
这些工具与 shpool
最相似。就像 shpool
一样,它们避免了多路复用,只是将原始字节发送回您,由您的本地终端进行渲染。虽然可以说 shpool
旨在成为 tmux
的简化版本,但这些工具遵循相同的理念,更加专注于简洁和做好一件事情。
shpool
的目标是提供一个简单、愉悦的体验,让那些只想获得会话持久性而不必过多关注的人使用。因此,它包含了一些额外“舒适”的特性,这些特性可能不适合这些工具简洁性的重点。
这些特性中最明显的一个是 shpool
和这些程序在重新连接处理上的差异。尽管在正常操作中,shpool
不进行任何渲染和子集化 shell 输出,但它通过 shpool_vt100
crate 持续维护一个内存中的终端状态渲染。在重新连接时,shpool
将使用这个内存渲染来重新绘制屏幕,这样你可以轻松地看到连接断开时的位置。这甚至允许你看到断开连接后生成的输出。
另一个这样的特性是自动提示前缀。当检测到你正在使用已知的 shell(目前是 bash
、zsh
或 fish
)时,shpool
会自动在提示中注入一个前缀,让你知道你所在的 shpool
会话的名称。这增加了有用的上下文,让你不会丢失终端,并对当前终端状态有所提示。
shpool
缺少一些这些程序拥有的特性。特别是,dtach
和 abduco
支持共享会话,而 shpool
只允许一次连接到一个特定会话的单个客户端。可能还有更多,因为我对这些工具的了解不如 shpool
深入。
开发
有关如何开发 shpool 的信息,请参阅 HACKING.md。
依赖关系
~0.5–1MB
~24K SLoC