ttyd:通过网络共享Linux的终端并实现在浏览器使用Lrzsz文件传输工具
编者叭叭:centos7已于2024年6月30日停止维护,虽然替换成国内镜像源还能使用,但镜像源没有义务给各位长期提供免费服务,Redhat官方既然已经决定让centos7成为历史,那国内各大互联网厂商又还能有什么持续维护的理由呢,我除了服务跑的比较多的一台centos7.9还在跑之外其余的几台全部换成debian11了,有空再做迁移。
那么正题开始~❀❀
安装部分
apt-get install build-essential cmake git libjson-c-dev libwebsockets-dev -y
下载安装编译工具和库
git clone https://github.com/tsl0922/ttyd.git
拉取项目仓库(仓库是在github拉取,大部分地区无法直接访问,请自行百度解决办法)
cd ttyd && mkdir build && cd build
进入项目文件夹并创建和进入build文件夹准备编译安装
cmake ..
构建项目
make && sudo make install、make && make install
编译安装,由于没有安装sudo并且是root用户直接执行,所以可以不用sudo提权
ttyd --version
验证安装并查看版本
ttyd --help
查看帮助
root@debian:~# ttyd --help
ttyd is a tool for sharing terminal over the web
USAGE:
ttyd [options] <command> [<arguments...>]
VERSION:
1.7.7-40e79c7
OPTIONS:
-p, --port Port to listen (default: 7681, use `0` for random port)
-i, --interface Network interface to bind (eg: eth0), or UNIX domain socket path (eg: /var/run/ttyd.sock)
-U, --socket-owner User owner of the UNIX domain socket file, when enabled (eg: user:group)
-c, --credential Credential for basic authentication (format: username:password)
-H, --auth-header HTTP Header name for auth proxy, this will configure ttyd to let a HTTP reverse proxy handle authentication
-u, --uid User id to run with
-g, --gid Group id to run with
-s, --signal Signal to send to the command when exit it (default: 1, SIGHUP)
-w, --cwd Working directory to be set for the child program
-a, --url-arg Allow client to send command line arguments in URL (eg: http://localhost:7681?arg=foo&arg=bar)
-W, --writable Allow clients to write to the TTY (readonly by default)
-t, --client-option Send option to client (format: key=value), repeat to add more options
-T, --terminal-type Terminal type to report, default: xterm-256color
-O, --check-origin Do not allow websocket connection from different origin
-m, --max-clients Maximum clients to support (default: 0, no limit)
-o, --once Accept only one client and exit on disconnection
-q, --exit-no-conn Exit on all clients disconnection
-B, --browser Open terminal with the default system browser
-I, --index Custom index.html path
-b, --base-path Expected base path for requests coming from a reverse proxy (eg: /mounted/here, max length: 128)
-P, --ping-interval Websocket ping interval(sec) (default: 5)
-6, --ipv6 Enable IPv6 support
-S, --ssl Enable SSL
-C, --ssl-cert SSL certificate file path
-K, --ssl-key SSL key file path
-A, --ssl-ca SSL CA file path for client certificate verification
-d, --debug Set log level (default: 7)
-v, --version Print the version and exit
-h, --help Print this text and exit
官方帮助如上
下面是gpt3.5的说明
-p, --port:指定 ttyd 监听的端口号。默认为 7681,可以使用 0 来指定随机端口。
-i, --interface:指定 ttyd 绑定的网络接口或 UNIX 域套接字路径。例如,可以使用 eth0 来指定网络接口,或使用 /var/run/ttyd.sock 来指定 UNIX 域套接字路径。
-U, --socket-owner:启用时,设定 UNIX 域套接字文件的用户所有者。格式为 user:group,例如 root:root。
-c, --credential:指定用于基本身份验证的凭据。格式为 username:password,例如 admin:password。
-H, --auth-header:指定用于身份验证代理的 HTTP 标头名称。这将配置 ttyd 让 HTTP 反向代理处理身份验证。
-u, --uid:指定要以其身份运行程序的用户 ID。
-g, --gid:指定要以其群组身份运行程序的群组 ID。
-s, --signal:指定在退出命令时发送的信号。默认为 1(SIGHUP)。
-w, --cwd:指定要为子程序设置的工作目录。
-a, --url-arg:允许客户端在 URL 中发送命令行参数。例如,可以使用 http://localhost:7681?arg=foo&arg=bar 来发送参数。
-W, --writable:允许客户端写入 TTY。默认情况下为只读。
-t, --client-option:向客户端发送选项。格式为 key=value,可以重复使用以添加更多选项。
-T, --terminal-type:指定要报告的终端类型。默认为 xterm-256color。
-O, --check-origin:禁止来自不同来源的 WebSocket 连接。
-m, --max-clients:指定 ttyd 支持的最大客户端数。默认为 0,表示没有限制。
-o, --once:仅接受一个客户端,并在断开连接时退出。
-q, --exit-no-conn:在所有客户端断开连接时退出。
-B, --browser:使用默认系统浏览器打开终端。
-I, --index:指定自定义的 index.html 路径。
-b, --base-path:指定来自反向代理的请求的预期基本路径。例如,可以使用 /mounted/here 来指定基本路径。
-P, --ping-interval:指定 WebSocket ping 间隔(秒)。默认为 5。
-6, --ipv6:启用 IPv6 支持。
-S, --ssl:启用 SSL。
-C, --ssl-cert:指定 SSL 证书文件路径。
-K, --ssl-key:指定 SSL 密钥文件路径。
-A, --ssl-ca:指定用于客户端证书验证的 SSL CA 文件路径。
-d, --debug:设置日志级别。默认为 7。
-v, --version:打印版本信息并退出。
-h, --help:打印帮助信息并退出。
使用部分
根据上方帮助运行一个示例并查看
root@debian:~# ttyd bash
[2024/07/26 15:39:00:2653] N: ttyd 1.7.7-40e79c7 (libwebsockets 4.1.6-)
[2024/07/26 15:39:00:2653] N: tty configuration:
[2024/07/26 15:39:00:2653] N: start command: bash
[2024/07/26 15:39:00:2653] N: close signal: SIGHUP (1)
[2024/07/26 15:39:00:2653] N: terminal type: xterm-256color
[2024/07/26 15:39:00:2653] N: The --writable option is not set, will start in readonly mode[2024/07/26 15:39:00:2653] N: LWS: 4.1.6-, loglevel 7
[2024/07/26 15:39:00:2653] N: NET CLI SRV H1 H2 WS IPV6-off
[2024/07/26 15:39:00:2658] N: /usr/lib/x86_64-linux-gnu/libwebsockets-evlib_uv.so
[2024/07/26 15:39:00:2662] N: Using foreign event loop...
[2024/07/26 15:39:00:2663] N: Listening on port: 7681
为了安全美观以及可以在浏览器使用lrzsz软件,我们可以使用下面的启动方式来实现。
ttyd -p 1234 -c username:password -t enableZmodem=true -W zsh
参数说明:
-p 为固定端口,如果是在云服务器上使用ttyd的话相应端口需要打开
-c 为添加登陆验证,username为用户名,password为密码,都可以自定义
-t 为使用其他选项,当前为enableZmodem=true指启用ZMODEM/lrzsz的文件传输功能,这两个软件需要单独安装
-W 默认为只读,没有输入的权限,加上这条就能输入
zsh 为自定义shell环境,linux默认是bash,zsh需要单独安装,可以配置各种皮肤及辅助插件
尝试连接
root@debian:~# ttyd -p 1234 -c user:passwd -t enabeZmodem=true -W zsh
[2024/07/26 15:53:27:7120] N: ttyd 1.7.7-40e79c7 (libwebsockets 4.1.6-)
[2024/07/26 15:53:27:7121] N: tty configuration:
[2024/07/26 15:53:27:7121] N: credential: dXNlcjpwYXNzd2Q=
[2024/07/26 15:53:27:7121] N: start command: zsh
[2024/07/26 15:53:27:7121] N: close signal: SIGHUP (1)
[2024/07/26 15:53:27:7121] N: terminal type: xterm-256color
[2024/07/26 15:53:27:7121] N: LWS: 4.1.6-, loglevel 7
[2024/07/26 15:53:27:7121] N: NET CLI SRV H1 H2 WS IPV6-off
[2024/07/26 15:53:27:7125] N: /usr/lib/x86_64-linux-gnu/libwebsockets-evlib_uv.so
[2024/07/26 15:53:27:7130] N: Using foreign event loop...
[2024/07/26 15:53:27:7130] N: Listening on port: 1234
拓展内容
以上,就完成了题目的内容,but...这样开启一个服务你关闭窗口后就没了,那么要怎么才能设置开机自启并不占用一个shell呢?
答:众所周知,linux以前一直使用init来管理系统进程,在2010年发布后内置了Systemd这个系统程序来管理,他的诞生不仅仅是替代init,它是一个包含大约 70 个二进制文件的套件,用于处理系统初始化、守护进程和服务、日志记录和日志记录,以及 Linux 中已经由专用模块处理的许多其他功能。所以我们可以创建一个systemd文件来实现开机自启这个程序。
进入/lib/systemd/system/
,创建一个名为ttyd.service
的文件
root@debian:~# cd /lib/systemd/system/
root@debian:/lib/systemd/system# vi ttyd.service
按 i 键进入 install 模式,输入下方配置
[Unit]
Description=ttyd service
After=network.target syslog.target
Wants=network.target
[Service]
Type=simple
ExecStart=ttyd -p 1234 -c amdin:admin@123 -t enableZmodem=true -W zsh
[Install]
WantedBy=multi-user.target
完后按键盘esc键退出编辑模式,输入英文的:wq并回车
重载system服务文件
systemctl daemon-reload
启动ttyd服务
systemctl start ttyd
查看ttyd服务状态
systemctl status ttyd
没问题的话会什么都不提示,如果一堆不认识的返回报错警告这些的,尝试关闭原先运行的ttyd程序并检查端口是否冲突。
最后,开启ttyd服务的开启自启
systemctl enable ttyd
root@debian:/lib/systemd/system# systemctl enable ttyd
Created symlink /etc/systemd/system/multi-user.target.wants/ttyd.service -> /lib/systemd/system/ttyd.service.
这样就行了,以后重启服务会跟着起来,非常适合在特殊环境无法使用ssh或者图方便远程自己的服务器并做一些简单的运维,当然如果你的linux有安装桌面的话可以只用VNC来配置使用浏览器直接访问桌面环境。