Monte um sshfs via macfuse na inicialização

6

Eu quero montar uma pasta sshfs na inicialização no Mac OSX: estou usando o Macfusion agora, que é uma GUI para MacFUSE, mas tenho que montar a pasta manualmente.

Como posso conseguir isso?

    
por dag729 23.04.2010 / 22:41

3 respostas

5

Se você mantiver uma máquina remota, pode ser realmente útil montar o sistema de arquivos da máquina localmente para mover arquivos. MacFuse e sshfs tornam isso realmente fácil, embora configurá-lo e montá-lo automaticamente no login pode ser um pouco complicado.

Primeiro, certifique-se de que você pode fazer ssh em seu computador remoto sem digitar uma senha. Faça o setup em Leopard finalmente suportando o ssh-agent no login e verifique se funciona:

ssh USER@HOSTNAME:

Se você fizer login sem solicitar uma senha ou chave de acesso, estará pronto para prosseguir.

Em seguida, instale sshfs e MacFuse de acordo com Instalando sshfs 1.9 com o MacFuse 1.7 no OS X Leopard 10.5.5 .

Descubra onde você quer montar seu volume remoto. Eu não recomendaria usar /Volumes , pois parece que o OS X exclui automaticamente os diretórios quando você desmonta as coisas. Então, em vez disso, usei /mnt/HOSTNAME

mkdir -p /mnt/HOSTNAME

(Obviamente, você substituirá HOSTNAME pelo nome do seu servidor remoto.)

Em seguida, certifique-se de montar seu site remoto como um volume sem especificar uma senha usando sshfs :

sshfs USER@HOSTNAME:PATH /mnt/HOSTNAME -oreconnect,allow_other,volname=VOLUME_NAME

Defina VOLUME_NAME como desejar para que seu volume seja nomeado no Finder. Eu usei HOSTNAME. PATH é opcional; configurá-lo para qualquer diretório que você deseja montar no host remoto. Se não estiver definido, ele usará seu diretório pessoal.

Se você não receber mensagens de erro, e quando você faz um ls /mnt/HOSTNAME os arquivos remotos aparecem, então você está pronto para prosseguir para a próxima etapa.

Desmonte o volume que acabou de montar:

umount /mnt/HOSTNAME

Agora vem a parte complicada. Você precisará criar um item do LaunchAgent para montar seu volume no login. Isso em si é bem fácil. No entanto, se o seu sistema for parecido com o meu, este item não terá seu SSH_AUTH_SOCK configurado corretamente, por isso não será possível efetuar login no host remoto sem usar uma senha. Você terá que definir manualmente o SSH_AUTH_SOCK você mesmo.

Primeiro, crie um wrapper em torno de sshfs que definirá o SSH_AUTH_SOCK para você. Coloque isso em um arquivo onde você quiser. Sugiro /opt/local/bin/sshfs-authsock .

#!/bin/bash
export SSH_AUTH_SOCK=$(ls -t /tmp/launch-*/Listeners | head -1)
/opt/local/bin/sshfs $*

Basicamente, este arquivo configura SSH_AUTH_SOCK para o soquete mais recente em seu diretório tmp. Na maioria dos casos, isso deve ser o correto. É improvável que ele falhe, e não há nenhum problema de segurança.

Agora você pode finalmente criar o arquivo plst launchd. Coloque isso em

~/Library/LaunchAgents/BACKWARDS_HOST_DNS.PATH.sshfs.plist

(Se o caminho do seu host for, digamos, foo.niskala.org e seu PATH for /tmp , o nome do arquivo resultante será org.niskala.foo.tmp.sshfs.plist . Esta é apenas uma convenção, fique à vontade para nomear o arquivo como você quiser, realmente; mas precisa terminar em .plist .)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>Label</key>
        <string>BACKWARDS_HOST_DNS.PATH.sshfs</string>
        <key>ProgramArguments</key>
        <array>
                <string>/opt/local/bin/sshfs-authsock</string>
                <string>USER@HOSTNAME:</string>
                <string>/mnt/HOSTNAME</string>
                <string>-oreconnect,allow_other,volname=VOLUME_NAME</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
</dict>
</plist>

Agora carregue o arquivo plist e execute-o para ver se funciona.

launchctl load ~/Library/LaunchAgents/BACKWARDS_HOST_DNS.PATH.sshfs
launchctl start BACKWARDS_HOST_DNS.PATH.sshfs

Se você não vir mensagens de erro, veja se o volume foi montado corretamente:

ls /mnt/HOSTNAME

Se seus arquivos remotos aparecerem, ótimo! Você está feito!

Se não, use

launchctl unload ~/Library/LaunchAgents/BACKWARDS_HOST_DNS.PATH.sshfs

para descarregar o arquivo antes de editá-lo, use ps auxwww | grep sshfs e kill para localizar e eliminar qualquer sshfs processos antes de tentar novamente.

Referências:

por 06.05.2010 / 23:37
2

Gostaria de atualizar a ótima resposta do dag729. No El Captain OS X com o OS X Fuse 2.8.3 as coisas são um pouco diferentes:

  1. Alguns caminhos são alterados
  2. osxfuse deve ser forçado a ser executado no modo de primeiro plano com -f option
  3. SSH_AUTH_SOCK já está definido, por isso não há mais motivos para criar o sshfs-authsock script

Além disso, aconselho não usar a opção allow_other (por motivos de segurança) e usar a opção auto_cache apenas porque isso é útil. Por favor, verifique opções de montagem do OS X Fuse para detalhes.

Aqui está o arquivo ~/Library/LaunchAgents/NAME.sshfs.plist que eu uso:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>NAME.sshfs</string>
    <key>ProgramArguments</key>
    <array>
            <string>/usr/local/bin/sshfs</string>
            <string>[USER@]HOST:REMOTE_DIR</string>
            <string>MOUNT_DIR</string>
            <string>-oreconnect,auto_cache,volname=FINDER_VOLUME_NAME</string>
            <string>-f</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

Em que NAME é qualquer nome que você gosta e as demais variáveis são bastante autodescritivas.

Se por algum motivo você não tiver SSH_AUTH_SOCK defined (execute o comando launchctl getenv SSH_AUTH_SOCK para verificá-lo), crie um script auxiliar, por exemplo, /usr/local/bin/sshfs-authsock com o seguinte conteúdo:

#!/bin/bash
export SSH_AUTH_SOCK=$(ls -t /tmp/com.apple.launchd.*/Listeners | head -1)
/usr/local/bin/sshfs $*

E execute este script em vez de sshfs do arquivo plist. Então, seu ~/Library/LaunchAgents/NAME.sshfs.plist deve ser:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>NAME.sshfs</string>
    <key>ProgramArguments</key>
    <array>
            <string>/usr/local/bin/sshfs-authsock</string>
            <string>[USER@]HOST:REMOTE_DIR</string>
            <string>MOUNT_DIR</string>
            <string>-oreconnect,auto_cache,volname=FINDER_VOLUME_NAME</string>
            <string>-f</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>
    
por 12.04.2016 / 12:59
1

Gostaria de acrescentar algo à resposta muito completa do dag729.

Se você tem Lion e tem agora OS X Fuse em vez do antigo MacFuse, o procedimento acima não funcionará a caixa porque o caminho do sshfs é diferente.

Se esse for o seu caso, veja onde o sshfs está em sua instalação usando

which sshfs

e coloque esse caminho no script / opt / local / bin / sshfs-authsock.

Na minha instalação, esse caminho é / usr / local / bin / sshfs e, portanto, meu script é:

#!/bin/bash
export SSH_AUTH_SOCK=$( ls -t /tmp/launch-*/Listeners | head -1)
/usr/local/bin/sshfs $*

Posso confirmar que o restante ainda é válido.

    
por 31.01.2013 / 04:05