就像在Using net/ssh/gateway to establish ssh tunnel to mysql中一样,我尝试使用Net :: SSH :: Gateway建立到远程服务器的隧道以进行端口转发。但是我在这个过程中遇到了问题! :)
如何调整OpenSSL和Net :: SSH :: Gateway.new()以便隧道连接到远程服务器?
我可以通过在后台启动ssh进程来设置隧道,如下所示:
remote_addr = <some_remote_server.com>
remote_user = <some_remote_server@somehost.com>
ssh -f -N -L 3307:#{remote_addr}:3306 #{remote_user}
并在我的rails代码中:
# config/database.yml
...
remote_db:
adapter: mysql2
database: <remote_db_name>
username: <remote_db_user>
password: <remote_db_pass>
host: 127.0.0.1
port: 3307
这一切都有效。
但是当我尝试以下操作时(当然没有在后台启动ssh),它会因拒绝连接而失败&#39;:
>> require 'net/ssh/gateway'
>> remote_addr = <some_remote_server.com>
>> remote_user = <some_remote_server@somehost.com>
>> gateway = Net::SSH::Gateway.new(remote_addr, remote_user, :port => 3306, :verbose => :debug)
D, [2014-12-04T07:56:50.720603 #32532] DEBUG -- net.ssh.transport.session[3fe0d1587180]: establishing connection to some_remote_server.com:3306
... then after a delay ...
Errno::ECONNREFUSED: Connection refused - connect(2) for "some_remote_server.com" port 3306
我也尝试过没有端口规范(所以它使用端口22),这导致超时:
>> gateway = Net::SSH::Gateway.new(remote_addr, remote_user, :verbose => :debug)
D, [2014-12-04T07:59:17.722649 #32532] DEBUG -- net.ssh.transport.session[3fe0d156efb8]: establishing connection to some_remote_server.com:22
Errno::ETIMEDOUT: Operation timed out - connect(2) for "some_remote_server.com" port 22
我怀疑OpenSSL可能没有找到我的证书。当我以详细模式运行ssh
时,我可以看到它在〜/ .ssh / id_rsa中提供并接受我的公钥。但即使我明确地将我的密钥文件作为参数传递:
gateway = Net::SSH::Gateway.new(remote_addr,
remote_user,
:keys => ['/Users/home/.ssh/id_rsa'],
:port => 3306,
:verbose => :debug)
......它似乎没什么区别。
Net::SSH:Gateway.new()
,以便模仿对ssh -N -L ...
的调用?答案 0 :(得分:1)
好吧,这是一个简单修复的问题。尽管我很尴尬,但我发布了解决方案以防其他人认为它有用。
简而言之,如果你一直在运行ssh:
remote_addr = <some_remote_server.com>
remote_user = <some_remote_user@somehost.com>
ssh -f -N -L 3307:#{remote_addr}:3306 #{remote_user}
你可能想要:
require 'net/ssh/gateway'
gateway = Net::SSH::Gateway.new("somehost.com", "some_remote_user")
port = gateway.open(remote_addr, 3306, 3307)
我在O.P.中获得ECONNREFUSED和ETIMEDOUT的原因仅仅是因为我试图连接到错误的服务器。