Используя sshfs на C, к которому получают доступ через A и B

Текущий набор, с которым я работаю, требует меня к ssh на машину C первым ssh-лугом в A и затем в B. Что-то вроде этого:

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.Спасибо за помощь!

2
задан 11 September 2018 в 15:43

1 ответ

Я предполагаю, что Вы работаете над машиной A. Оттуда можно соединиться с машиной B. И от B можно соединиться с машиной C. То, что Вы хотите, должно установить соединение непосредственно от машины к машине C. Вот мое предложение:

  • Создайте соединение SSH из машины B к машине C и передайте локальный порт на B (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 из машины к машине B и передайте локальный порт на (10022) к удаленному порту 20022 на B.

    machine-a~$ ssh machine-b -L 10022:127.0.0.1:20022 -fTN
    
  • Создайте соединение SSH или используйте SSHFS от до его обратной петли 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, мы будем использовать его позже. На машине использование 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. Установите соединение от машины к машине C (через машину B). Выполните следующие шаги на машине A:

  • Дайте команду через SSH к машине B для установления соединения с машиной C:

    ssh machine-b "autossh machine-c-port-fwd -fTN"
    
    • Эй может добавить следующее задание в Crontab пользователя (crontab -e) на машине 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 и B...

    • Обратите внимание, что везде мы - предел перенаправление портов только к петлевому интерфейсу (127.0.0.1), но это могло быть сделано для всех интерфейсов (0.0.0.0 или \*) или для определенного интерфейса (при помощи его IP).

    • Можно создать ~/.ssh/config файл на машине A, аналогичный описанию в разделе 2, для упрощения команд в будущем. Alco я предпочел бы использовать основанную на ключе аутентификацию SSH...

  • Соединитесь с машиной C от машины через (на машине 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 будет доступно как команда оболочки. Можно добавить дополнительную логику и аргументы тесту ли /destination/dir/ уже смонтирован, и т.д...

0
ответ дан 2 December 2019 в 07:04

Другие вопросы по тегам:

Похожие вопросы: