6

Я хочу смонтировать папку sshfs при загрузке под Mac OSX: я сейчас использую Macfusion, это графический интерфейс для MacFUSE, но я должен смонтировать папку вручную.

Как я могу этого достичь?

3 ответа3

5

Если вы поддерживаете удаленный компьютер, может быть очень полезно смонтировать файловую систему этого компьютера для перемещения файлов. MacFuse и sshfs делают это действительно легко, хотя настроить и смонтировать его автоматически при входе в систему может быть немного сложно.

Во-первых, убедитесь, что вы можете подключиться к удаленному компьютеру без ввода пароля. Выполните настройку в Leopard, наконец, поддерживая ssh-agent при входе в систему и убедитесь, что он работает:

ssh USER@HOSTNAME:

Если он вошел в систему без запроса пароля или пароля, вы готовы продолжить.

Затем установите sshfs и MacFuse в соответствии с установкой sshfs 1.9 с MacFuse 1.7 в OS X Leopard 10.5.5.

Выясните, где вы хотите смонтировать удаленный том. Я бы не рекомендовал использовать /Volumes так как кажется, что OS X автоматически удаляет каталоги там, когда вы размонтируете вещи. Поэтому вместо этого я использовал /mnt/HOSTNAME

mkdir -p /mnt/HOSTNAME

(Очевидно, вы замените HOSTNAME вашего удаленного сервера.)

Затем убедитесь, что вы можете подключить удаленный сайт как том без указания пароля с помощью sshfs:

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

Установите для VOLUME_NAME любое имя, которое вы хотите назвать в Finder. Я использовал HOSTNAME. PATH является необязательным; установите его в любой каталог, который вы хотите смонтировать на удаленном хосте. Если он не установлен, он будет использовать ваш домашний каталог.

Если вы не получаете сообщений об ошибках, и когда вы делаете ls /mnt/HOSTNAME удаленные файлы, тогда вы готовы перейти к следующему шагу.

Размонтируйте только что смонтированный том:

umount /mnt/HOSTNAME

Теперь начинается хитрая вечеринка. Вам нужно будет создать элемент LaunchAgent для монтирования вашего тома при входе в систему. Это само по себе довольно легко. Однако, если ваша система похожа на мою, у этого элемента не будет правильно настроен SSH_AUTH_SOCK, поэтому он не сможет войти на удаленный хост без использования пароля. Вам придется вручную установить SSH_AUTH_SOCK.

Сначала создайте оболочку для sshfs , которая установит для вас SSH_AUTH_SOCK. Поместите это в файл, где вы хотите.  Я предлагаю /opt/local/bin/sshfs-authsock .

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

По сути, этот файл устанавливает SSH_AUTH_SOCK на самый последний сокет в вашем каталоге tmp.  В большинстве случаев это должно быть правильным. Это вряд ли даст сбой, и нет проблем с безопасностью, если это произойдет.

Теперь вы можете, наконец, создать файл launchd plist. Поместите это в

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

(Если путь вашего хоста, скажем, foo.niskala.org и ваш PATH был /tmp , то полученное имя файла будет org.niskala.foo.tmp.sshfs.plist .  Это просто соглашение, не стесняйтесь называть файл как угодно; но это должно заканчиваться на .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>

Теперь загрузите файл plist и запустите его, чтобы увидеть, работает ли он.

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

Если вы не видите сообщений об ошибках, посмотрите, правильно ли смонтирован том:

ls /mnt/HOSTNAME

Если ваши удаленные файлы появляются, то отлично! Вы сделали!

Если нет, используйте

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

чтобы выгрузить файл, прежде чем вносить в него изменения, затем используйте ps auxwww | grep sshfs и kill чтобы найти и уничтожить все процессы sshfs прежде чем пытаться снова.

Рекомендации:

2

Я хотел бы обновить отличный ответ от dag729. На El Captain OS X с OS X Fuse 2.8.3 все немного по-другому:

  1. Некоторые пути изменены
  2. Необходимо запустить osxfuse в режиме переднего плана с опцией -f
  3. SSH_AUTH_SOCK уже определен, поэтому больше нет причин создавать сценарий sshfs-authsock

Также я бы посоветовал не использовать параметр allow_other (по соображениям безопасности) и использовать параметр auto_cache только потому, что это звучит полезно. Пожалуйста, проверьте опции установки предохранителя OS X для деталей.

Вот файл ~/Library/LaunchAgents/NAME.sshfs.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>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>

Где NAME - это любое имя, которое вам нравится, а остальные переменные довольно информативны.


Если по какой-то причине у вас не определен SSH_AUTH_SOCK (для его проверки запустите команду launchctl getenv SSH_AUTH_SOCK ), создайте вспомогательный сценарий, например /usr/local/bin/sshfs-authsock со следующим содержимым:

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

И запустите этот скрипт вместо sshfs из plist-файла. Поэтому ваш ~/Library/LaunchAgents/NAME.sshfs.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>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>
1

Я хотел бы добавить кое-что к очень полному ответу dag729.

Если у вас Lion и у вас теперь OS X Fuse вместо старого MacFuse, то описанная выше процедура не будет работать из коробки, потому что путь к sshfs другой.

Если это так, посмотрите, где находится sshfs в вашей установке, используя

which sshfs

и поместите этот путь в скрипт /opt /local /bin /sshfs-authsock.

В моей установке этот путь - /usr /local /bin /sshfs, и поэтому мой скрипт:

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

Я могу подтвердить, что остальное все еще в силе.

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