希望有人能帮助我解决这个问题。
我的设置
我有一个客户端和服务器设置,都运行 Ubuntu 18.04.4 LTS。它们都位于不同的网络上。我希望能够在客户端计算机上使用安装在服务器上的 MariaDB 数据库。我正在尝试设置 SSH,以便如果我在客户端计算机上为特定端口 (3306) 发送 localhost 命令,它会被路由到服务器并在服务器上进行处理,就像它是发送到服务器的 localhost 命令一样。
为此,我在客户端和服务器上都添加了一个用户。客户端和服务器上的用户和密码都是相同的。
我已将服务器上的默认 SSH 端口更改为端口 8888(因为我不喜欢“默认”设置)我能够以我创建的用户身份通过 SSH 进入服务器(从客户端计算机),一切顺利(端口转发和路由问题已解决)。通过 SSH 连接到服务器后,我能够登录 MariaDB 并 CRUD 数据库。
我发现很多网站都声称 SSH 可以让我设置隧道,一旦隧道到位,就可以在服务器上执行发送到特定端口的命令。这就是应该的工作方式:
ssh [email protected] -p 8888 -L 3306:localhost:3306 -N
请注意,对于本次讨论
- 用户 - 客户端和服务器上的帐户的用户名。此用户的唯一限制是用户帐户不在 sudoers 文件中。用户拥有主目录和所有内容。
- myserver.mycomany.com-能够解析服务器所在位置的 IP
- 8888-路由到服务器的端口
- 3306 - 可访问 MariaDB 的端口
- MariaDB 已配置用户/密码
问题
我遇到的问题是,当我使用以下命令时,按下回车键后光标就挂起了(好像命令没有完成),因为它没有让我回到提示符(我必须按 CTRL+C 才能退出它),即光标只是在下一行闪烁:
ssh [email protected] -p 8888 -L 3306:localhost:3306 -N
但是,如果我从命令中删除 -N,则命令似乎已成功完成,但我无法从客户端计算机登录 MariaDB。所以它实际上什么也没做。
有人能帮我找出我做错的地方吗?或者告诉我我疯了才会尝试这个,这是不可能的?
我暗暗希望
我希望能够在弄清楚如何操作后使用 autossh 运行此隧道。然后我所要做的就是登录到客户端计算机并运行数据库命令,这些命令都会路由到服务器,而无需进行任何设置。
我目前所做的
根据 Jos 的建议,我运行了
ssh -vv [email protected] -p 8888 -L 3306:localhost:3306 -N
并获得了更多信息。它挂在
client_input_global_request: rtype [email protected] want_reply 0
我发现重新启动 systemd-logind 可能会解决这个问题,所以我做了:
systemctl restart systemd-logind
这次我走得更远,命令确实退出了,但状态为 127。这是一个巨大的输出,但这里是从看起来相关的内容开始的最后 85 行:
Authenticated to hiding.myservername.com ([hiding.my.ip.com]:8888).
debug1: channel 0: new [client-session]
debug3: ssh_session2_open: channel_new: 0
debug2: channel 0: send open
debug3: send packet: type 90
debug1: Requesting [email protected]
debug3: send packet: type 80
debug1: Entering interactive session.
debug1: pledge: network
debug3: receive packet: type 80
debug1: client_input_global_request: rtype [email protected] want_reply 0
debug3: receive packet: type 91
debug2: channel_input_open_confirmation: channel 0: callback start
debug2: fd 3 setting TCP_NODELAY
debug3: ssh_packet_set_tos: set IP_TOS 0x08
debug2: client_session2_setup: id 0
debug1: Sending environment.
debug3: Ignored env LS_COLORS
debug3: Ignored env SSH_CONNECTION
debug3: Ignored env LESSCLOSE
debug1: Sending env LANG = en_CA.UTF-8
debug2: channel 0: request env confirm 0
debug3: send packet: type 98
debug3: Ignored env XDG_SESSION_ID
debug3: Ignored env USER
debug3: Ignored env PWD
debug3: Ignored env HOME
debug3: Ignored env SSH_CLIENT
debug3: Ignored env SSH_TTY
debug3: Ignored env MAIL
debug3: Ignored env TERM
debug3: Ignored env SHELL
debug3: Ignored env SHLVL
debug3: Ignored env LOGNAME
debug3: Ignored env XDG_RUNTIME_DIR
debug3: Ignored env PATH
debug3: Ignored env LESSOPEN
debug3: Ignored env _
debug1: Sending command: 3306:localhost:3306 -N
debug2: channel 0: request exec confirm 1
debug3: send packet: type 98
debug2: channel_input_open_confirmation: channel 0: callback done
debug2: channel 0: open confirm rwindow 0 rmax 32768
debug2: channel 0: rcvd adjust 2097152
debug3: receive packet: type 99
debug2: channel_input_status_confirm: type 99 id 0
debug2: exec request accepted on channel 0
debug2: channel 0: rcvd ext data 38
debug3: receive packet: type 96
debug2: channel 0: rcvd eof
debug2: channel 0: output open -> drain
debug3: receive packet: type 98
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug3: receive packet: type 98
debug1: client_input_channel_req: channel 0 rtype [email protected] reply 0
debug2: channel 0: rcvd eow
debug2: channel 0: close_read
debug2: channel 0: input open -> closed
debug3: receive packet: type 97
debug2: channel 0: rcvd close
debug3: channel 0: will not send data after close
debug2: channel 0: obuf_empty delayed efd 6/(38)
sh: 1: 3306:localhost:3306: not found
debug2: channel 0: written 38 to efd 6
debug3: channel 0: will not send data after close
debug2: channel 0: obuf empty
debug2: channel 0: close_write
debug2: channel 0: output drain -> closed
debug2: channel 0: almost dead
debug2: channel 0: gc: notify user
debug2: channel 0: gc: user detached
debug2: channel 0: send close
debug3: send packet: type 97
debug2: channel 0: is dead
debug2: channel 0: garbage collecting
debug1: channel 0: free: client-session, nchannels 1
debug3: channel 0: status: The following connections are open:
#0 client-session (t4 r0 i3/0 o3/0 fd -1/-1 cc -1)
debug3: send packet: type 1
Transferred: sent 2432, received 2528 bytes, in 0.5 seconds
Bytes per second: sent 5324.3, received 5534.5
debug1: Exit status 127
我不知道接下来该去哪里。
我将 MySQL 端口 3306 转发到了服务器(虽然我认为我不需要这样做,因为我希望通过 SSH 端口 8888 进行访问)。我仍然卡在。
client_input_global_request: rtype [email protected] want_reply 0
这次重新启动 systemd-logind 没有帮助。
我用以下方法测试了服务器上的 MySQL 端口
User@Server:~$ telnet localhost 3306
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
t
5.5.5-10.4.12-MariaDB-1:10.4.12+maria~bionic-log$j0Mqri9!�5&`3y+fBUf"smysql_native_passwordConnection closed by foreign host.
我觉得还可以。
如果我通过网络进行 telnet,我会收到“连接被拒绝”的信息,这是因为 MariaDB 已配置为仅进行本地主机身份验证。
继续探索。我在服务器所在的本地网络上安装了一个新的 Ubuntu 系统。我使用本地 IP 地址(而不是 DNS 解析的主机名)运行 SSH 命令,由于 2 个系统位于一个子网中,我已消除网关上的任何路由/NAT/端口转发问题。我仍然有一个挂起的 client_input_global_blablabla
我使用与 Sudoers 文件中的用户帐户的连接进行了测试。没有运气。
下一步...重新安装服务器并尝试相同的连接,无需任何公钥认证。