揭开UNIX高手的那些重大秘密(2) - 51CTO.COM
来源:百度文库 编辑:神马文学网 时间:2024/09/29 21:40:07
揭开UNIX高手的那些重大秘密(2)
嘘......关于 SSH 的秘密Secure Shell (SSH) 是一个功能强大的子系统,用于安全地登录到远程系统、复制文件并穿越防火墙。由于 SSH 是一个子系统,它提供大量选项来定制和简化其操作。事实上,SSH 提供名为 $HOME/.ssh 的整个 “点目录” 来包含其所有数据。(您的 .ssh 目录必须是模式 600,以阻止他人访问。非 600 模式将干扰正常的操作。)特别是,文件 $HOME/.ssh/config 可以定义大量快捷方式,包括机器名称的别名、每主机访问控制等。
下面是位于 $HOME/.ssh/config 中的一个典型代码块,用于定制一个特定主机的 SSH:
Host worker HostName worker.example.com IdentityFile ~/.ssh/id_rsa_worker User joeuser
~/.ssh/config 中的每个块配置一个或多个主机。不同的块使用一个空行分隔。这个块使用 4 个选项:Host
、HostName
、IdentityFile
和 User
。Host
为 HostName
指定的机器创建一个昵称。昵称允许您键入 ssh worker
,而不是 ssh worker.example.com
。另外,IdentityFile
和 User
选项指定如何登录到 worker
。前者指向此主机使用的一个私匙,后者提供登录 ID。这样,这个代码块就等同于以下命令:
ssh joeuser@worker.example.com -i ~/.ssh/id_rsa_worker
ControlMaster
是一个鲜为人知的强大选项。如果设置,同一个主机的多个 SSH 会话将共享单个连接。一旦第一个连接建立,后续连接就不再需要凭证,从而消除了每次连接同一机器都需要键入密码的麻烦。ControlMaster
非常方便,您可能愿意为每台机器启用它。启用方法非常简单,只需使用主机通配符 *
:
Host * ControlMaster auto ControlPath ~/.ssh/master-%r@%h:%p
如您所料,标记了 Host *
的块将应用到每个主机,甚至是那些在配置文件中没有明确指定的主机。ControlMaster auto
尝试使用一个现有连接,并在没有发现共享连接时创建一个新连接。ControlPath
指向一个文件,以便持久化一个控制套接字以供共享。%r
用远程登录用户名替换,%h
用目标主机名替换,%p
代替连接使用的端口。(您还可以使用 %l
,它使用本地主机名替换。)上述规范使用类似于下面的文件名创建控制套接字:
master-joeuser@worker.example.com:22
当到远程主机的所有连接都被切断时,每个控制套接字都就会被移除。如果您想随时了解连接到了哪些主机,只需键入 ls ~/.ssh
并查看控制套接字的主机名部分(%h
)。
SSH 配置文件非常大,它也有自己的手册页。键入 man ssh_config
查看所有可能的选项。这里有一个巧妙的 SSH 技巧:可以通过 SSH 从本地系统进入远程系统。要用到的命令行如下所示:
$ ssh example.com -L 5000:localhost:3306
这条命令的意思是:通过 example.com 进行连接,并在本地机器上的端口 5000 和名为 “localhost” 的机器上的端口 3306(MySQL 服务器端口)之间建立一条通道。由于 localhost
在 example.com 上解释(因为通道已建立),因此 localhost
就是 example.com。由于出站通道 — 以前称为本地转发(local forward)— 已建立,本地客户端能够连接到端口 5000,并与 example.com 上运行的 MySQL 服务器通信。
通道创建的常规形式如下:
$ ssh proxyhost localport:targethost:targetport
其中,proxyhost
是可以通过 SSH 访问的机器,并且拥有一个到 targethost
的网络连接(不通过 SSH)。localport
是您的本地系统上的一个非特权端口(1024 以上的任一未用端口),targetport
是您要连接到的服务的端口。
前面的命令从您的机器发送出去,到达外部世界。 也可以使用 SSH 发送进来,或者从外部世界连接到您的本地系统。入站通道的常规形式如下:
$ ssh user@proxyhost -R proxyport:targethosttargetport
建立一条入站通道 — 以前称为远程转发 — 时,proxyhost
和 targethost
的角色将被反转:目标是您的本地机器,代理是远程机器。user
是您在代理上的登录名。以下命令提供了一个具体示例:
$ ssh joe@example.com -R 8080:localhost:80
这条命令的意思是:用户 Joe 连接到 example.com,并将远程端口连接到本地端口 80。这条命令向 example.com 上的用户提供一个通道,以连接到 Joe 的机器上。远程用户能够连接到 8080,以便连接 Joe 机器上的 Web 服务器。
除了分别用于本地和远程转发的 -L
和 -R
之外,SSH 还提供 -D
参数来在远程机器上创建一个 HTTP 代理。请参见 SSH 手册页了解正确语法。