每当我 ssh 到远程计算机时,它总是会创建一个新的远程 shell。
ssh 客户端可以连接到远程计算机上运行的现有 shell 吗?
答案1
不可以,ssh 客户端无法连接到现有的正在运行的 shell。
这安全外壳连接协议指定交互式会话是:
会话是程序的远程执行。该计划可能是:
- 如地狱,
- 一个应用程序,
- 系统命令,
- 或一些内置子系统。
它可能有也可能没有 tty,并且可能涉及也可能不涉及 X11 转发。多个会话可以同时处于活动状态。
它继续澄清,在启动 shell 或命令(我的重点):
会话建立后,就会有一个程序开始在远端。该程序可以是 shell、应用程序或具有与主机无关的名称的子系统。每个通道中只有一个请求可以成功。
该文档随后说明了客户如何提出请求(我再次强调):
- 一个“shell”,它“将请求用户的默认 shell(通常在 UNIX 系统中的 /etc/passwd 中定义)”开始在另一端”,或
- “exec”,“将请求服务器开始执行给定的命令。”,或
- “子系统”,“执行预定义的子系统”(例如 sftp)
因此,ssh 连接只能启动一个新的 shell。
正如一条评论所指出的,你可以仿真通过在远程端创建screen
或会话来连接到现有 shell 的行为,然后通过(创建新的 $SHELL 实例!)连接到该远程系统,然后在该新 shell 中使用或命令附加到现有会话。tmux
ssh
screen
tmux
答案2
是的,尽管这在几年前是不可能的。近年来,Linux 内核引入了一项名为 eBPF 的新功能。 SSH 日志 (https://github.com/sshlog/agent) 守护进程使用它来跨进程监听并允许您连接到其他用户的 SSH 会话。
安装后,首先运行命令列出服务器上的所有活动会话。
mhill@devlaptop:~$ sshlog sessions
User Last Activity Last Command Session Start Client IP TTY
mhill just now /usr/bin/gcc 2023-04-10 16:16:18 127.0.0.1:58668 17
billy 10 min ago /usr/sbin/fdisk 2023-04-10 12:11:05 15.12.5.8:58669 32
并附加到它们:
mhill@devlaptop:~$ sshlog attach 32
Attached to TTY 32. Press CTRL+Q to exit
billy@devlaptop:~$
现在您正在与另一个用户/会话共享此远程 shell。您可以像在您自己的会话中一样发出命令。