我当前正在使用的设置要求我先 ssh 到 A,然后再 ssh 到 B,这样才能 ssh 到机器 C。如下所示:
ssh [username]@[university].com # Machine A
ssh [department] # Machine B
ssh [machinename] # Machine C
当我通过 ssh 进入 A 时,系统要求我输入密码。
我的目标是使用 sshfs 在本地 C 上挂载远程目录,以便在我的机器上使用文件管理器和文本编辑器本地编辑远程目录中的文件。我尝试遵循多个教程/博客文章,但似乎无法实现这一点。
我一直试图向~/.ssh/config
文件中添加条目以首先自动化整个 ssh 过程,但无济于事。有人可以解释一下如何做到这一点或提供可以提供帮助的链接吗?
附带一个问题:预期的方法是否最适合我的目的(即能够使用本地文本编辑器在远程驱动器上编辑/创建脚本)?
我使用的是 Ubuntu 18.04,对 Linux 还不太熟悉。谢谢你的帮助!
答案1
我假设你正在机器A。从那里你可以连接到机器B. 并且来自乙您可以连接到机器C. 你想要的是建立连接直接地从机器A到机器C。以下是我的建议:
从以下位置创建 SSH 连接机器B到机器C并转发本地端口乙(
20022
例如 - )到远程 SSH 端口C(22
)。machine-b~$ ssh machine-c -L 20022:127.0.0.1:22 -fTN
或者直接从 SSH 发出命令机器A:
machine-a~$ ssh machine-b "ssh machine-c -L 20022:127.0.0.1:22 -fTN"
从以下位置创建 SSH 连接机器A到机器B并转发本地端口A(
10022
)到远程20022
端口乙。machine-a~$ ssh machine-b -L 10022:127.0.0.1:20022 -fTN
创建 SSH 连接或使用 SSHFSA连接到端口上的环回 iface (
127.0.0.0
/ )localhost
10022
C。machine-a~$ ssh -p 10022 <machine-c-user>@localhost machine-a~$ sshfs -p 10022 <machine-c-user>@localhost:/target/dir/ /dest/dir/
根据这种情况,下面提出了一些更高级的想法和解释。
1.设置机器B连接到机器C如果之前没有这样做,请使用 ssh 密钥对(无密码)。为此,请使用以下顺序:
SSH 到机器B并生成 RSA 密钥对,不要输入密码:
mkdir -p ~/.ssh/machine-c-key/ chmod 700 ~/.ssh chmod 700 ~/.ssh/machine-c-key/ ssh-keygen -t rsa -b 4096 -f ~/.ssh/machine-c-key/id_rsa # do not enter passphrase chmod 600 ~/.ssh/machine-c-key/id_rsa
将密钥传输
id_rsa.pub
到文件中~/.ssh/authorized_keys
机器C通过使用ssh-cipy-id
。在机器B执行命令:ssh-copy-id -i ~/.ssh/machine-c-key/id_rsa '<user>@<machine-c>' -p '22'
现在尝试登录机器C, 和:
ssh -i ~/.ssh/machine-c-key/id_rsa -p '22' '<user>@<machine-c>'
如果可行,如果您愿意,请编辑
/etc/ssh/sshd_config
并设置:PasswordAuthentication no
复制生成的密钥机器B到机器A,我们稍后会用到它。机器A按以下方式使用
rsync
(注意斜线/
):rsync -r machine-b:/home/<user>/.ssh/machine-c-key ~/.ssh/
处理权限(机器A):
chown -R $(id -u):$(id -g) ~/.ssh chmod 700 ~/.ssh/machine-c-key/ chmod 600 ~/.ssh/machine-c-key/id_rsa
2.创建文件于~/.ssh/config
机器B,并设置端口转发。将以下几行添加到上述配置文件中:
Host machine-c-port-fwd
HostName 192.168.100.100
IdentityFile ~/.ssh/machine-c-key/id_rsa
User user
Port 22
LocalForward 20022 127.0.0.1:22
- 你应该提供实际IP 地址或域名的机器C和实际用户。
- 这
Port 22
是 ssh 端口机器C。 - 该指令
RemoteForward 20022 127.0.0.1:22
表示22
远程环回接口的端口(机器C)将被转发20022
至 机器B。 - 请注意,如果您已经配置了
Host machine-c
为端口转发设置创建一个单独的设置是一个好主意。
现在你应该能够连接到机器C从机器B通过使用以下命令:
ssh machine-c-port-fwd
我们可以通过添加选项-fTN
(参考)。我们还可以使用该工具autossh
来确保连接能够长时间保持活动状态(sudo apt install autossh
-参考):
autossh machine-c-port-fwd -fTN
- 用于
killall autossh
禁用它:)
此时你应该能够连接到机器C从机器B通过其环回接口:
ssh -i ~/.ssh/machine-c-key/id_rsa -p '20022' '<machine-c-user>@localhost'
3.建立连接机器A到机器C(通过机器B)。执行以下步骤机器A:
通过 SSH 发出命令机器B建立连接机器C:
ssh machine-b "autossh machine-c-port-fwd -fTN"
crontab -e
您可以在用户的 Crontab ( )中添加以下作业机器B在系统重启时建立端口转发:@reboot sleep 15 && autossh machine-c-port-fwd -fTN
建立 SSH 连接机器B(从A)并进行端口转发,将连接推送到后台:
autossh machine-b -L 10022:127.0.0.1:20022 -fTN
这样,本地端口
10022
(机器A)将被转发(绑定)到远程端口20022
(在机器B)绑定到22
端口机器C。我们可以使用相同的端口号(20022
例如 -)A和乙...请注意,我们在任何地方都将端口转发限制在环回接口(
127.0.0.1
),但这可以针对所有接口(0.0.0.0
或\*
)或特定接口(通过使用其 IP)执行。您可以
~/.ssh/config
在机器A,类似于第 2 节中的描述,以简化您将来的命令。Alco 我更喜欢使用基于 SSH 密钥的身份验证...
连接到机器C从机器A通过其(机器A)环回接口:
ssh -i ~/.ssh/machine-c-key/id_rsa -p '10022' '<machine-c-user>@localhost'
或者以这种方式使用 SSHFS(注意,
sshfs
可以使用来自的主机~/.ssh/config
):sshfs -p 10022 <machine-c-user>@localhost:/target/dir/ /destination/dir/ -o IdentityFile=~/.ssh/machine-c-key/id_rsa
为了自动执行上述三个命令,您可以在文件中创建如下函数~/.bashrc
:
mount-machine-c() {
ssh machine-b "autossh machine-c-port-fwd -fTN" && sleep 1
autossh machine-b -L 10022:127.0.0.1:20022 -fTN
sshfs -p 10022 <machine-c-user>@localhost:/target/dir/ /destination/dir/ -o IdentityFile=~/.ssh/machine-c-key/id_rsa
}
source ~/.bashrc
并将mount-machine-c
作为 shell 命令使用。您可以添加其他逻辑和参数来测试是否/destination/dir/
已安装等...