我正在看一本与SSH相关的书。我不明白这句话是什么意思。
SSH 客户端通过本地套接字或命名管道与代理通信,其文件名存储在环境变量中,因此登录会话中的所有客户端(和所有其他进程)都可以访问代理。
“通过本地套接字或命名管道”,这是什么意思?
答案1
我们先回答几个问题:
什么是命名管道? 这是一种进程间通信方法。匿名管道是在软件中创建的,通常通过
pipe()
系统调用。当您在 shell 中执行管道时,就像/bin/echo foo | grep 'foo'
您要求 shell 执行该pipe()
调用一样,创建两个子进程,并让这两个子进程(在本例中/bin/echo
为和grep
)相互通信。当然,因为这种类型的管道是匿名的,所以在磁盘上的文件系统中没有它的名称(内核的虚拟文件系统中有一个文件,但那是另一回事)。可以使用mkfifo
命令或mkfifo(3)
/mkfifoat(3)
系统调用创建命名管道(也称为 FIFO)。例如,mkfifo /tmp/my_named_pipe.fifo
。因此,您不必echo foo | grep 'foo'
在同一个终端中执行,而是可以在另一个终端中执行echo foo > /tmp/my_named_pipe.fifo
和执行grep 'foo' /tmp/my_named_pipe.fifo
因此,管道的基本思想是有两个端点 - 一个用于写入,一个用于读取。在命名管道的情况下,您有一个命令/进程写入该 FIFO 文件,另一个命令/进程从该文件读取。
什么是套接字: A 网络套接字基本上是软件通道或引用,使用它,同一台或不同机器上的进程可以进行通信。套接字本身不能做很多事情,但如果它绑定到同一台或不同机器上的网络端口(如 HTTP 的端口 80 或 RTSP 媒体流的端口 554)进程,那么您的软件就可以与其他软件通信。
基本思想类似:创建一个命名套接字,例如
/tmp/my_socket.sock
并让两个或多个命令通过该套接字进行通信(写入和读取),通常其中一个命令是“服务器”并始终在该套接字上监听。这与 SSH 有何关系?默认情况下,
ssh
服务器在端口 22 上运行,并且会为此分配一个网络套接字(还记得我说过套接字有端口吗?)。有时建立 SSH 隧道很有用。例如,如果我们有此设置Client Computer A -> Firewall Linux Server B -> Linux Server with Website C IP: 172.16.127.1 IP: 172.16.127.2(ssh port 22) IP: 172.16.127.3 (website on port 80)
并且我们希望从客户端 A 到网站 C 建立安全连接,我们将执行以下操作
ssh
:ssh -L 172.16.127.1:8877:172.16.127.3:80 [email protected]
这称为端口转发:现在您可以在
http://172.16.127.1:8877
计算机 A 上打开浏览器,它将重定向到 Linux 服务器 C 上的网站。请注意,8877 是随机未使用的端口。如果该端口已被使用 - 您可能需要找到其他未使用的端口,任何高于 1000 的端口都应该没问题。当然,这并不总是方便的,因为它将保持会话打开。在这里你可以创建一个命名套接字,又称Unix 域套接字 并在后台控制 ssh 会话,而无需打开 shell。
因此,我们可以在这里回答与您提到的书中的引文相关的实际问题:
ssh 代理:在某些情况下,我们不想在尝试连接的服务器上存储 ssh 凭据。这就是为什么你需要运行SSH 代理软件(对于 Windows,您可以使用 Pageant 又名 PuTTY Agent)。
SSH_AUTH_SOCKET
(例如SSH_AUTH_SOCKET=/tmp/my_auth.sock
)环境变量将具有 Unix 域套接字路径,命令ssh
可以通过该路径与代理通信,并确认您的登录正确。这在我之前的例子中很有用,如果我们想确保与 Linux 防火墙服务器 B 的连接是真实的 - 用户名是他们的真实身份 - 那么您可以在计算机 A 上使用 ssh 代理。如果我们有许多服务器 C 和许多防火墙服务器 B,那么这将非常有用 - 在许多服务器 B 机器上存储密码既不安全也不实用。
关于套接字、管道和 还有很多内容ssh
,但希望本文能帮助您简要说明它们是什么以及它们之间的关系。请参阅我的其他答案关于管道与重定向,其中详细解释了管道