我想在 Mac OSX 下启动时挂载一个 sshfs 文件夹:我现在正在使用 Macfusion,这是 MacFUSE 的 GUI,但我必须手动挂载该文件夹。
我怎样才能实现这个目标?
答案1
如果您维护一台远程机器,那么在本地安装该机器的文件系统来移动文件会非常有用。MacFuse 使sshfs
这变得非常简单,尽管在登录时自动设置和安装它可能有点棘手。
首先,确保你无需输入密码即可通过 ssh 连接到远程计算机。在Leopard 终于支持登录时的 ssh-agent并验证其是否有效:
ssh USER@HOSTNAME:
如果您登录时没有提示输入密码或密钥,则您可以继续。
接下来,sshfs
按照步骤安装 MacFuse在 OS X Leopard 10.5.5 上安装 sshfs 1.9 和 MacFuse 1.7。
确定要将远程卷挂载到何处。我不建议使用,/Volumes
因为 OS X 似乎会在您卸载东西时自动删除其中的目录。因此,我改用/mnt/HOSTNAME
mkdir -p /mnt/主机名
(显然,你会替换HOSTNAME
替换为您的远程服务器的名称。)
然后确保您可以将远程站点作为卷挂载,而无需使用以下命令指定密码sshfs
:
sshfs USER@HOSTNAME:PATH /mnt/HOSTNAME -oreconnect,allow_other,volname=VOLUME_NAME
将 VOLUME_NAME 设置为您希望在 Finder 中为卷命名的任何名称。我使用了 HOSTNAME。PATH 是可选的;将其设置为您想要在远程主机上挂载的任何目录。如果未设置,它将使用您的主目录。
如果您没有收到任何错误消息,并且在执行操作时 显示远程文件,那么您就可以继续下一步了。ls /mnt/HOSTNAME
卸载刚刚挂载的卷:
卸载 /mnt/主机名
现在到了棘手的部分。您需要创建一个 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
如果您没有看到错误消息,请查看卷是否已正确安装:
/mnt/ 复制代码主机名
如果您的远程文件出现了,那就太好了!您大功告成了!
如果没有,请使用
launchctl unload ~/Library/LaunchAgents/BACKWARDS_HOST_DNS.PATH.sshfs
在对文件进行编辑之前卸载该文件,然后使用ps auxwww | grep sshfs
和kill
查找并终止所有sshfs
进程,然后再试一次。
参考:
答案2
我想更新 dag729 的精彩回答。在装有 OS X Fuse 2.8.3 的 El Captain OS X 上,情况略有不同:
- 一些路径被改变
-f
必须使用选项强制 osxfuse 在前台模式下运行SSH_AUTH_SOCK
已经定义,因此没有理由再创建sshfs-authsock
脚本
此外,我建议不要使用allow_other
选项(出于安全原因),而auto_cache
只是因为它听起来有用就使用选项。请检查OS X Fuse 安装选项了解详情。
这是~/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>
答案3
我想对 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 $*
我可以确认其余部分仍然有效。