如何用一个命令创建 ssh 隧道链?

如何用一个命令创建 ssh 隧道链?

我们有一台服务器 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

相关内容