考虑以下两个命令:
创建 smtp 消息 | ssh -p 25 服务器账号
创建 smtp 消息 | ssh serveraccount telnet localhost 25
根据我对 ssh(1) 的理解,他们都应该做同样的事情。相反,第二个将 create-smtp-message 的输出从 serveraccount 发送到服务器的 25 端口(即它可以工作),而第一个只是挂起。
我猜这只是我误解了 ssh 在给定 -p 标志时的作用,但如果出现一些配置错误:发出类似命令的客户端是带有 openssh ssh 的 osx-tiger (OpenSSH_5.1p1, OpenSSL 0.9.7l 2006 年 9 月 28 日),服务器运行带有 openssh sshd 的 Debian Sarge(真的吗?必须升级!)(OpenSSH_3.8.1p1 Debian-8.sarge.6,OpenSSL 0.9.7e 2004 年 10 月 25 日)。授权使用 .ssh/config 文件中指定的 DSA。
您的第一个示例是告诉 ssh 连接到非标准端口上的 ssh 守护进程(服务器端进程),在本例中为 25。如果 sshd 守护进程未在此端口上侦听,则连接尝试将超时或出错协议问题,正如您所遇到的。
第二个是告诉 ssh 与“serveraccount”建立正常连接(通过端口 22 发生)并远程执行 telnet 命令到 localhost:25。create-smtp-message 的输出成为您的 telnet 命令的标准输入,从而允许您的 SMTP 服务器接收您的消息。
ssh 需要另一侧的 sshd 才能联系。-p 选项指定此联系将在哪个端口上进行,如果不是默认端口。这是不存在的,因此有人可以通过 ssh 连接到 smtp 服务器或 Web 服务器。但是,这是第一行尝试的错误,它失败了,因为这些端口不是可以处理和解密 ssh 加密协议的 sshd。请记住 -p 选项只是为了让偏执狂可以将他们的 sshd 端口移动到某个不明显的数字。
ssh 不是 telnet 的克隆,而是 telnet的主要但不安全的应用程序的安全替代品——创建远程终端连接。
telnet 的传统用途之一(它仍然有用)是创建到系统中任何端口的哑终端连接。然后,您可以逐字向该端口发送和接收字符。在第 2 行中,您使用 ssh 加密与远程主机的会话,然后在远程主机上调用该主机上的 telnet 将会话中的信息发送到 smtp 服务器。
另一方面,SSH 会尝试将所有内容都封装在加密中——而不是明文——并且需要一个 sshd 与之通信,这是进行解密的唯一方式。
您可能想了解的是使用 ssh 加密的未加密流量端口的端口转发,但这是一个高级应用程序,不清楚您是否需要它。您的第二行可能足以满足您的既定目的。