通过本地套接字或命名管道进行通信

通过本地套接字或命名管道进行通信

我正在看一本与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,但希望本文能帮助您简要说明它们是什么以及它们之间的关系。请参阅我的其他答案关于管道与重定向,其中详细解释了管道

相关内容