在通过 A 和 B 访问的 C 上使用 sshfs

在通过 A 和 B 访问的 C 上使用 sshfs

我当前正在使用的设置要求我先 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 端口C22)。

    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并转发本地端口A10022)到远程20022端口

    machine-a~$ ssh machine-b -L 10022:127.0.0.1:20022 -fTN
    
  • 创建 SSH 连接或使用 SSHFSA连接到端口上的环回 iface ( 127.0.0.0/ )localhost10022C

    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/已安装等...

相关内容