在启动时通过 macfuse 挂载 sshfs

在启动时通过 macfuse 挂载 sshfs

我想在 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 sshfskill查找并终止所有sshfs进程,然后再试一次。

参考:

答案2

我想更新 dag729 的精彩回答。在装有 OS X Fuse 2.8.3 的 El Captain OS X 上,情况略有不同:

  1. 一些路径被改变
  2. -f必须使用选项强制 osxfuse 在前台模式下运行
  3. 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 $*

我可以确认其余部分仍然有效。

相关内容