#终端 #tmux #shell #持久性 #tty #守护进程

shpool-protocol

shpool-protocol 定义了 shpool 用于其客户端和守护进程之间通信的内部协议。你几乎不需要直接使用它

1 个不稳定版本

0.1.0 2024年7月18日

#3#守护进程

Download history 82/week @ 2024-07-13 19/week @ 2024-07-20 2/week @ 2024-07-27

每月下载量 103

Apache-2.0

23KB
159

shpool

shpool 是一种服务,通过允许创建由 shpool 拥有的命名 shell 会话来启用会话持久性,这样在连接断开时也不会丢失会话。可以认为 shpooltmux 或 GNU screen 的轻量级替代品。虽然 tmuxscreen 会接管整个终端并提供窗口分割和拼接功能,但 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 相比,可以认为它们属于同一类别。

shpooltmux 的主要区别在于,tmux 是一个终端多路复用器,这意味着它必然提供会话持久化功能,而 shpool 仅仅旨在成为一个会话持久化工具。与 tmux 不同,shpool 的理念是管理不同的终端是您的显示或窗口管理器的职责,而不是您的会话持久化工具的职责。每个操作系统都有自己的应用程序之间切换的习语,而且没有必要在切换终端时切换到不同的习语。特别是对于使用 i3swayxmonad 等平铺窗口管理器的用户来说,tmux 的多路复用功能是多余的。

虽然 tmux 在远程渲染终端内容,只将当前视图绘制到屏幕上,但 shpool 只是将所有shell输出直接发送回用户的本地终端。这意味着所有的渲染都由单个终端状态机处理,而不是通过 tmux 内部的内存终端,然后再由本地终端格式化和重新渲染。这有性能影响,而且最重要的是,使用 shpool 的终端会感觉完全原生。滚动和复制粘贴将像在您的本地终端中一样工作,而当使用 tmux 时,它们可能会有不同的表现。

mosh

mosh 是另一个专注于提供持久远程shell会话的工具。它与其他讨论的工具的不同之处在于,它有自己的网络协议,它从常规 ssh 中启动。像 tmux 一样,它远程渲染屏幕内容,只发送当前视图。它在尝试预测性地猜测在网络延迟时向用户显示的正确输出方面具有一定的独特性。

shpoolmosh 的不同之处在于,它与网络无关,像大多数其他工具一样,仅限于单台机器。就像在 tmux 的情况下一样,mosh 将影响滚动和复制粘贴的工作方式,而 shpool 则使它们完全原生。

dtachabducodiss

这些工具与 shpool 最相似。就像 shpool 一样,它们避免了多路复用,只是将原始字节发送回您,由您的本地终端进行渲染。虽然可以说 shpool 旨在成为 tmux 的简化版本,但这些工具遵循相同的理念,更加专注于简洁和做好一件事情。

shpool 的目标是提供一个简单、愉悦的体验,让那些只想获得会话持久性而不必过多关注的人使用。因此,它包含了一些额外“舒适”的特性,这些特性可能不适合这些工具简洁性的重点。

这些特性中最明显的一个是 shpool 和这些程序在重新连接处理上的差异。尽管在正常操作中,shpool 不进行任何渲染和子集化 shell 输出,但它通过 shpool_vt100 crate 持续维护一个内存中的终端状态渲染。在重新连接时,shpool 将使用这个内存渲染来重新绘制屏幕,这样你可以轻松地看到连接断开时的位置。这甚至允许你看到断开连接后生成的输出。

另一个这样的特性是自动提示前缀。当检测到你正在使用已知的 shell(目前是 bashzshfish)时,shpool 会自动在提示中注入一个前缀,让你知道你所在的 shpool 会话的名称。这增加了有用的上下文,让你不会丢失终端,并对当前终端状态有所提示。

shpool 缺少一些这些程序拥有的特性。特别是,dtachabduco 支持共享会话,而 shpool 只允许一次连接到一个特定会话的单个客户端。可能还有更多,因为我对这些工具的了解不如 shpool 深入。

开发

有关如何开发 shpool 的信息,请参阅 HACKING.md

依赖关系

~0.5–1MB
~24K SLoC