我知道如何使用远程 CVS 存储库,通过 SSH 访问远程服务器。
我的问题如下:远程 CVS 服务器(称为“A”)只能通过 SSH 从同一子网内的计算机访问。子网上有一台计算机“B”,其 SSH 向全世界开放。(不要问为什么;我不是管理员。)我可以通过 SSH 进入“B”,然后从那里通过 SSH 进入 CVS 存储库所在的“A”。
我家用电脑与“A”和“B”不在同一子网。是否可以通过家用电脑与“B”以及“B”与“A”之间的 SSH 连接访问“A”上的 CVS 存储库?
- 无需在“B”上托管另一个 CVS 存储库。
- 并且无需在“B”上签出并将我的家用电脑与该签出同步。
答案1
Quack 的答案是一个好的开始,但它有两个问题。因此我也将尝试一下:
首先,您必须从本地工作站到机器 A 的 SSH 端口创建一条隧道。这可以通过命令行轻松完成:
ssh -L 127.0.0.1:2200:A:22 B
(ssh 到 B 并创建从本地端口 127.0.0.1:2200 到远程端口 A:22 的隧道)
因为 CVS 不允许你在使用:ext
协议时指定端口,所以这个简单的命令行不够好。你需要做的是创建或修改你的~/.ssh/config
文件:
Host B
LocalForward 127.0.0.1:2200 A:22
Host tunnel2a
Port 2200
HostName 127.0.0.1
这是两个条目。第一个条目告诉 ssh 在您 ssh 到 B 时创建一个隧道。第二个条目定义tunnel2a
可用于 cvs 的新“主机名”。
首先,通过 ssh 连接到 B 打开隧道:
ssh B
CVS 现在应该像这样工作:
cvs -d :ext:username@tunnel2a:/cvsroot/ checkout someModule
答案2
您应该能够通过 SSH 隧道执行此操作。我没有 3 台机器可以测试,但如果我理解正确的话,您需要 2 个终端窗口。
首先,使用此选项通过 SSH 连接到“B”:。-L 1234:A:22
这将在本地主机(端口 1234)通过机器“B”到机器“A”(端口 22,即 SSH 端口)之间添加一条隧道。
我最初编写的 CVS 命令不起作用,因为 CVS 不支持我编写的 :ext: 格式的端口。如果使用 GUI IDE 或 CVS 客户端,它可能允许您直接输入备用端口。如果使用命令行客户端执行此操作,则需要另一种方法 - 使用~/.ssh/config
正确的端口向文件添加主机别名。Manni 的回答给出了一个很好的例子来说明如何做到这一点,所以我不会在这里重现它。
通过瞄准本地主机上的端口 1234,您将接入 SSH 隧道并路由到 A 上的 SSH 端口。
您可能需要检查答案到一些 相关问题关于 SSH 隧道。感谢 Manni 帮助我完善这些说明。
在第二个终端中,运行 CVS checkout 命令,但将 localhost:1234 替换为 A:
cvs -d :ext:username@localhost:1234:/cvs checkout test
# instead of
# cvs -d :ext:username@A:/cvs checkout test
答案3
遇到麻烦伊纳姆的答案,尽管它是正确的,并且在这里没有重复,但也许一些额外的信息可以帮助那些在实施答案时遇到困难的奇怪用户。
如果遇到困难,一定要尝试远程控制和简历在命令行上执行命令,然后再添加配置本地转发在里面配置文件。编辑配置如果特定设置与应答者的环境稍有不同,那么过早提交文件可能会令人沮丧。
第一个可能遇到的问题很少见,但至关重要。知道正确的位置至关重要配置文件。在大多数情况下,正确的位置是〜/.ssh /配置/${HOME}/.ssh/config,但有时并非如此。正确的配置即便是从命令行进行实验,也需要文件位置来解决此问题。另请参阅: ssh 不再使用 ~/.ssh/config
还有可能出现权限问题。在故障排除期间,将 .ssh 文件夹和配置文件都设置为用户只读(即修改权限 600),但不一定需要这么严格的权限。无论如何,文件夹和文件都不应被其他用户写入。
还有设置的问题CVS_RSH正确。即使远程控制环境设置正确后,最终简历如果CVS_RSH准备不充分。
CVS_RSH=ssh; export CVS_RSH
没有CVS_RSH, 这简历命令可能会返回:
-l: bad option(s) cvs [... aborted]: end of file from server (consult above messages if any)
无需打开两个外壳即可与隧道配合使用。 伊纳姆的答案说要用以下方法建立隧道:
ssh B
这样你就可以在 B 上打开一个 shell,而不是在本地工作站上打开一个 shell。没有必要在 B 上打开一个 shell。你可以完全在单个 shell 中工作,只需使用以下命令设置隧道即可:
ssh -fN B
此命令将您置于本地系统提示符下,而不是 B 提示符下。需要注意的是,在SSH 连接只需注销即可取消转发乙,而在ssh -fN B这远程控制进程在后台,必须通过其他方式终止才能拆除转发器。
当多个系统需要备用端口号时,添加港口适用的选项配置 主持人部分是可行的。
请记住配置文件可以指定用户在主持人用户名在不同系统间存在差异的部分。
另一个潜在的陷阱可能是在用户名指定不正确的情况下发生的。虽然将系统用户名指定为用户@主机名,请勿在配置文件或ssh-L 密码参数。例如,这将导致严重错误,并且可能很难解决:
ssh -L 2200:Auser@A:22 Buser@B
(这从来不是必要的 CVS 使用,因为Auser@指定为cvs -d :ext:Auser@A:/路径/到/存储库。
虽然指定是完全可以接受的布瑟@B,Auser@不能在命令行或配置文件。简历命令问题与这样的错误命令可能会返回类似的内容:
ssh_exchange_identification: read: Connection reset by peer cvs [checkout aborted]: end of file from server (consult above messages if any)
调试可能很困难,并且可能导致其他无法解释的消息,例如:
SSH Tunnel: channel 3: open failed: administratively prohibited
问题是,当与-L或者本地转发,Auser@成为主机名(或 IP 地址)的一部分,因此无法解析为预期的 IP 地址。