monte um diretório local em um servidor ssh remoto

5

Eu quero montar um diretório local para um servidor ssh remoto. especificamente meu diretório ~ / .gnupg para que eu possa usar meu chaveiro local em qualquer lugar, sem armazená-lo remotamente.

então eu acho que essa solução:

  • mantém um servidor ssh local aberto (firewall como você gosta)
  • ssh para encaminhamento remoto local: 22 para remoto: 10000
  • inicie o sshfs para montar o host local: 10000: .gnupg para ~ / .gnupg

eu coloco isso no meu ssh / config:

Host remote
        HostName remotehost
        RemoteForward 10000 localhost:22
        User user
        PermitLocalCommand yes
        LocalCommand sshfs -p 10000 [email protected]:/Users/remoteuser/.gnupg .gnupg

fazendo ssh, recebo:

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

se eu corri o sshfs manualmente após o login ssh tudo funciona bem. então eu acho que a diretiva LocalCommand é executada antes do RemoteForward.
como resolver isso?

    
por robert laing 25.10.2014 / 22:20

1 resposta

3

Problema: ssh LocalCommand é executado no lado local (cliente), não no controle remoto como você deseja. Não há RemoteCommand opção, mas você pode hackear a funcionalidade em seu arquivo de configuração. Note, todos estes assumem que o seu diretório remotehost:.gnupg existe antes da mão.

Opção 1: Use duas especificações de host separadas em seu ~/.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

Desvantagens: ambas as entradas precisam sair para cada host que você deseja que este ponto de montagem.

Opção 2: Combine opções ssh e encaminhamento de porta no 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

Observe que a diferença sutil nas duas linhas LocalCommand é o uso de% n no primeiro exemplo e% h no segundo. Isso funcionará, mas tem uma grande ASSUMPTION : você NUNCA ssh para um host pelo seu nome verdadeiro e somente por meio de "nomes curtos" que existem no arquivo .ssh/config , caso contrário, você terminará com um loop infinito de ssh connections tentando executar seu LocalCommand .

Opção 3: Use o SSH Multiplexing para configurar apenas uma conexão com o controle remoto:

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

Acho que essa é a única solução vencedora e pode até funcionar em Host * regras E não sofre desvantagens. Ele até resolve o problema de que as segundas sessões ssh no mesmo host NÃO tentarão remontar o mesmo diretório via sshfs.

Advertência: Uma questão final que não me preocupei em resolver: seu controle remoto sshfs persistirá por muito tempo depois que você fizer logout do host remoto. Na verdade, ele nunca será unmount , a menos que seu localhost fique off-line ou a conexão seja interrompida.

Você pode verificar outra opção para umount that sshfs mount ao efetuar logout do host remoto, talvez usando idéias como esta . Ou você pode jogar com o LocalCommand para executar algo que vigia e se auto-calcula depois que ele vê algum evento acionador ocorrer, mas parece frágil na melhor das hipóteses.

Outra opção seria envolver os comandos ssh em algum shell ou talvez usar ProxyCommand para fazer algo complicado, mas deixarei isso como um exercício para o leitor.

    
por 27.10.2014 / 16:15

Tags