Смонтировать sshfs через macfuse при загрузке

10017
dag729

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

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

6

3 ответа на вопрос

5
dag729

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

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

ssh USER@HOSTNAME: 

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

Затем установите sshfsMacFuse и установите его в соответствии с разделом Установка 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
oliora

Я хотел бы обновить отличный ответ от 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
Tex

Я хотел бы добавить кое-что к очень полному ответу 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 $* 

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