5

Я хочу подключить локальный каталог к удаленному серверу SSH. в частности, мой каталог ~/.gnupg, чтобы я мог использовать свою локальную связку ключей везде, не сохраняя ее удаленно.

так что я думаю это решение:

  • держать локальный ssh-сервер открытым (firewalled, как вам нравится)
  • SSH к удаленной переадресации локальной:22 к удаленной:10000
  • запустите sshfs для монтирования localhost:10000:.gnupg в ~/.gnupg

я положил это в моем SSH / конфигурации:

Host remote
        HostName remotehost
        RemoteForward 10000 localhost:22
        User user
        PermitLocalCommand yes
        LocalCommand sshfs -p 10000 user@127.0.0.1:/Users/remoteuser/.gnupg .gnupg

делаю SSH, я получаю:

fuse: bad mount point `.gnupg': No such file or directory

если я запускаю sshfs вручную после входа в систему ssh, все работает нормально. поэтому я предполагаю, что директива LocalCommand выполняется перед RemoteForward.
как это решить?

1 ответ1

3

Проблема: ssh LocalCommand выполняется на локальной (клиентской) стороне, а не на удаленной, как вы хотите. Там нет опции RemoteCommand , но вы можете взломать функциональность в вашем конфигурационном файле. Обратите внимание, что все они предполагают, что ваш remotehost:.gnupg существует.

Вариант 1. Используйте две отдельные спецификации хоста в ~/.ssh/config:

Host remote
    HostName remotehost
    PermitLocalCommand yes
    LocalCommand ssh -f %r@%n-mount -p %p sshfs -p 10000 %u@localhost:%d/.gnupg .gnupg

Host remote-mount
    HostName remotehost
    ForwardAgent yes
    RemoteForward 10000 localhost:22

Недостатки: обе записи должны быть завершены для каждого хоста, для которого вы хотите эту точку монтирования.

Вариант 2. Объедините параметры ssh и переадресацию портов в LocalCommand:

Host remote
    HostName remotehost
    PermitLocalCommand yes
    LocalCommand ssh -f %r@%h -o RemoteForward="10000 localhost:22" -o ForwardAgent=yes -p %p sshfs -p 10000 %u@localhost:%d/.gnupg .gnupg

Обратите внимание, что небольшая разница в двух строках LocalCommand заключается в использовании% n в первом примере и% h во втором. Это будет работать, но имеет одно огромное ПОЛОЖЕНИЕ: вы НИКОГДА не будете использовать ssh для хоста по его истинному имени и только через "короткие имена", которые существуют в вашем файле .ssh/config , в противном случае вы получите бесконечный цикл соединений ssh пытаясь выполнить вашу LocalCommand .

Вариант 3. Использование мультиплексирования SSH для настройки только одного подключения к удаленному:

Host remote
    HostName remotehost
    PermitLocalCommand yes
    LocalCommand ssh -f %r@%h -o RemoteForward="10000 localhost:22" -o ForwardAgent=yes -p %p sshfs -p 10000 %u@localhost:%d/.gnupg .gnupg
    ControlMaster auto
    ControlPersist 30m
    ControlPath ~/.ssh/controlmasters/%r@%h:%p

Я думаю, что это единственное выигрышное решение, и оно может работать даже по правилам Host * , и не имеет никаких недостатков. Это даже решает проблему, заключающуюся в том, что вторые сеансы ssh на одном и том же хосте НЕ будут пытаться перемонтировать один и тот же каталог через sshfs.

Предостережение: еще одна проблема, которую я не удосужился решить: ваши удаленные sshfs сохранятся еще долго после выхода из системы с удаленного хоста. Фактически, он никогда не будет unmount , если ваш локальный хост не отключится или соединение не будет разорвано.

Вы можете посмотреть на какой - то другой вариант umount , что sshfs крепление , как вы выйдите из удаленного хоста, возможно , используя такие идеи, как это. Или вы можете играть в игры с LocalCommand для выполнения чего-то, что наблюдает и самостоятельно монтируется после того, как происходит какое-то событие триггера, но в лучшем случае кажется хрупким.

Другой вариант - заключить команды ssh в какую-либо оболочку или использовать ProxyCommand чтобы сделать что-то хитрое, но я оставлю это в качестве упражнения для читателя.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .