是的,我知道我在标题中写了“SSH shell”。
TL;DR:第一段、带有链接的段落和带有错误消息的段落是最重要的。
我家里有我的 Raspberry Pi,我可以通过互联网访问它,但只能通过 IPv6。我目前所在的位置没有 IPv6。
我可以通过首先登录到同时具有 IPv4 和 IPv6 的服务器,然后从那里登录到我的 pi 来执行命令。但是,我在其上使用 SSH 的目的不仅仅是在其上执行命令:
- git
- 备份(Deja Dup)
- 访问文件 (SFTP)
- VNC(我通过 SSH 建立隧道,然后可以通过 VNC 连接到本地主机)
这些按重要性降序排列。我想访问我的 git 存储库。
更多细节:
- 我不能简单地让我的 Pi 通过 IPv4 进行访问。它后面的调制解调器有一个 IPv4 地址和一个 IPv6 子网,但我必须使用我没有选择运行我无法更改的软件的硬件。该软件不仅有缺陷而且我什至无法查看它,而且它不允许 IPv4 端口转发所有内容。
- 我不控制同时具有 IPv4 和 IPv6 的服务器。我只有一个普通用户帐户,并且无法(例如)安装新软件(如果需要超过标准用户权限)。
谷歌搜索提出的解决方案这个相当有前途的页面,它实际上适用于 git。我为我正在使用的存储库设置了新的遥控器,只需将 pi 的域名替换为localhost:3333
.
但它看起来比这更有希望。它看起来像是上述所有问题的解决方案。它开始起作用了!
SFTP 可以工作,但我无法真正确定通过 Deja Dup 进行的备份是否有效,因为我的连接速度太慢,但它还没有失败,并且某些东西导致了网络流量,所以这很好并且很有前途。
但为什么我不能直接ssh localhost:3333
连接到我的笔记本电脑来在我的 pi 上安装 shell?该命令会产生以下错误消息:
ssh: Could not resolve hostname localhost:3333: Name or service not known
我主要感兴趣的是为什么我不能按照我期望的方式获得 shell。
答案1
您可能需要查看ssh
的ProxyCommand
配置,它可以使工作更加无缝,并且适用于 shell、SFTP、隧道以及您可能希望通过 ssh 代理的任何其他内容。
假设您有以下三个主机:
workstation.example.com
- 这是您正在操作的机器proxy.example.com
- 这是您路由 SSH 流量的机器endpoint.example.com
- 这是您希望流量最终到达的地方
在~/.ssh/config
on 中workstation
,添加以下内容:
Host endpoint
User EndpointUser # set this to the username on the destination host
HostName endpoint.example.com
ProxyCommand ssh [email protected] nc %h %p 2> /dev/null
在proxy
主机上,确保nc
已安装 (netcat)。
然后,在 上workstation
,您可以ssh endpoint
或sftp endpoint
并且您将通过代理主机透明地代理到该计算机。
答案2
有几部分可以用不同的方式拼凑在一起,具体取决于最适合您的方式。每件都是可选的,并且有变体。
我将使用以下术语:
- “desktop” => 您坐在前面的机器(在您的示例中,是具有 ipv4 的机器)。
- “jump host” => 中间的机器,你必须经过的那台机器(在你的例子中,使用 ipv4 和 ipv6)
“target” => 你真正想要使用的最终机器(在你的例子中,是 Pi)。
- 考虑使用 ssh 密钥而不是密码。这将为您节省大量输入密码的时间。看https://www.digitalocean.com/community/tutorials/how-to-set-up-ssh-keys--2
- 确保您可以使用“ssh Jumphostname”或“ssh Jumpuser@jumphostname”直接 ssh 到跳转主机 - 如果您需要连接任何其他选项(端口号等),请在 ~/.ssh/config 中添加一个条目这个跳跃主机。
- 向目标的 ~/.ssh/config 添加一个条目,并使用子句“ProxyJump Jumphostname”或“ProxyJump Jumpuser@jumphostname”。
- 如果您有时直接访问目标,有时通过跳转主机(例如“桌面”是您有时在家中使用,有时在工作中使用的笔记本电脑),则可以为目标和/或跳转主机指定不同的名称(例如“主机”) Jump-pi' 或 'Host Jump-proxy'),并在 'hostname' 子句中指定目标的真实主机名或 IP。
- 您现在应该能够直接从桌面通过 ssh 连接到 pi。在幕后,ssh 将创建从桌面到跳转主机的连接,然后通过第一个连接直接从桌面启动另一个连接到目标。
- 您可以将端口转发添加到 ssh 命令(或将其添加到 ssh 配置中)。例如,如果您希望您的 pi 能够在桌面上访问 ssh,请在 pi 上选择一个要侦听的端口(我将选择 2222),然后运行以下命令:“ssh -R2222:localhost:22 piusername @pi” - 这表示,在 ssh 连接后,任何到端口 2222(在 pi 上)的传入连接都应通过隧道转发回您的桌面,然后桌面应连接到“localhost 端口 22”。然后,在 pi 上,您可以“ssh -p 2222desktopuser@localhost”。您可以对任何其他单个端口执行相同的操作(前提是您可以为正在使用的程序指定主机名和端口)。
- 如果您想要通用网络,可以运行 Dynamic Socks。 ssh 内置了这个功能,但它只能在 OTHER 方向上工作。要允许连接返回(从 Pi 到您的桌面),您的桌面上需要有一个 Dynamic Socks 服务器。然后设置从 Pi 到 Dynamic Socks 服务器的 tcp 连接(按照步骤 6),然后在 Pi 上运行 Dynamic Socks 客户端(某些应用程序内置了 Dynamic Socks,例如 wget,或者您可以使用类似 'tsocks ')。
- 如果这还不够通用,请通过 ssh 运行 PPP。这将为您的桌面和 Pi 上提供另一个“网卡”,然后它们可以直接相互通信。您可以通过此界面设置路由(请注意,如果您失去与 Pi 的连接,您将无法远程修复它)。