我们有一台服务器 A 需要连接。然后我们使用服务器 A 连接到数据库 B。在 Putty(Windows)中设置如下:
会话1:
1. 连接到 admin@serverA
2. 设置隧道本地端口 10022 到 databaseB:22
3. 运行“vi”
会话2:
1. 连接到 admin@localhost:10022
2. 设置隧道本地端口 1521 到数据库 1521
3. 运行“vi”
(vi 用于保持会话)
然后程序使用localhost:1521进行数据库连接。
我想知道我是否可以在 cygwin 中使用单个命令或批处理文件来完成此操作?请注意,我无法在 serverA 上打开端口
答案1
ssh -L 1521:127.0.0.1:61521 admin@serverA ssh -L 61521:127.0.0.1:1521 admin@databaseB
或者在命令窗口中使用 plink (Putty 链接):
plink -ssh -L 1521:127.0.0.1:61521 admin@serverA ssh -L 61521:127.0.0.1:1521 admin@databaseB
答案2
至于将其作为单个命令运行,前面的答案是正确的,但如果第二个 ssh 需要密码,则它可能不起作用(取决于 ssh 默认配置)。您必须使用 -t 选项强制分配伪 tty,如下所示:
ssh -t -L 1521:127.0.0.1:61521 admin@serverA ssh -L 61521:127.0.0.1:1521 admin@databaseB
(这可以使用 cygwin 的 ssh 命令来实现)
答案3
您可以使用 ProxyCommand 选项来实现这一点。将以下内容放入您的 ssh 配置文件中(通常位于~/.ssh/config
):
Host direct-serverB
ProxyCommand ssh admin@serverA ssh admin@serverB sshd -i
然后你就可以像直接连接服务器B一样:
% ssh -L 1521:localhost:1521 admin@direct-serverB
此命令没有打开中间服务器 A 上的任何端口。但是,它有一个缺点,即您需要从服务器 A 和本地计算机向服务器 B 进行身份验证。
如果 serverA 已经netcat
安装,那么您可以将其写入您的 ssh 配置中:
Host direct-serverB
ProxyCommand ssh admin@serverA nc -q0 serverB 22
并删除serverA→serverB的身份验证步骤。
答案4
以下是对我有用的方法。——
我的目标是将客户端应用程序指向 localhost:1115 并让它实际连接到 target_db_server:1433。——
target_db_server 只能从 jumpserver2 访问。——
jumpserver2 只能从 jumpserver1 访问。——
因此,该命令连接到 jumpserver1,提示输入令牌(在我的情况下),然后连接到 jumpserver2 并要求输入该服务器的密码,然后本地客户端就可以建立连接。
ssh -L 1115:127.0.0.1:1115 username@jumpserver1 -tt ssh -L 1115:target_db_server:1433 username@jumpserver2
我发现连接会超时,这并不理想。以下方法修复了这个问题:
echo "Host *" >> ~/.ssh/config
echo "ServerAliveInterval 60" >> ~/.ssh/config