Я хочу смонтировать папку sshfs при загрузке под Mac OSX: я сейчас использую Macfusion, это графический интерфейс для MacFUSE, но я должен смонтировать папку вручную.
Как я могу этого достичь?
Если вы поддерживаете удаленный компьютер, может быть очень полезно смонтировать файловую систему этого компьютера для перемещения файлов. 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
прежде чем пытаться снова.
Рекомендации:
Я хотел бы обновить отличный ответ от dag729. На El Captain OS X с OS X Fuse 2.8.3 все немного по-другому:
-f
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>
Я хотел бы добавить кое-что к очень полному ответу 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 $*
Я могу подтвердить, что остальное все еще в силе.