web-dev-qa-db-ja.com

起動時にmacfuseを介してsshfsをマウントします

Mac OSXでの起動時にsshfsフォルダーをマウントしたい:現在Macfusionを使用しています。これはMacFUSEのGUIですが、フォルダーを手動でマウントする必要があります。

どうすればそれを達成できますか?

7
dag729

リモートマシンを保守している場合は、そのマシンのファイルシステムをローカルにマウントしてファイルを移動すると非常に便利です。 MacFuseとsshfsを使用すると、これは非常に簡単になりますが、ログイン時に自動的にセットアップしてマウントするのは少し難しい場合があります。

まず、パスワードを入力せずにリモートマシンにSSH接続できることを確認します。 Leopardは最終的にログイン時にssh-agentをサポートします でセットアップを行い、それが機能することを確認します。

ssh USER@HOSTNAME:

パスワードやパスキーの入力を求めずにログインした場合は、続行する準備ができています。

次に、sshfsとMacFuseを OS X Leopard10.5.5にMacFuse1.7を使用してsshfs1.9をインストールする に従ってインストールします。

リモートボリュームをマウントする場所を見つけます。 /Volumesを使用することはお勧めしません。マウントを解除すると、OSXがそこにあるディレクトリを自動的に削除するように見えるからです。代わりに/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を実行すると、リモートファイルが表示されたら、次の手順に進む準備ができています。

マウントしたばかりのボリュームをアンマウントします。

umount/mnt /ホスト名

トリッキーなパーティーがやってきました。ログイン時にボリュームをマウントするには、LaunchAgentアイテムを作成する必要があります。これ自体は非常に簡単です。ただし、システムが私のようなものである場合、このアイテムにはSSH_AUTH_SOCKが適切に設定されていないため、パスワードを使用せずにリモートホストにログインすることはできません。 SSH_AUTH_SOCKを自分で手動で設定する必要があります。

まず、SSH_AUTH_SOCKを設定するsshfsのラッパーを作成します。これをファイルに入れてください。 /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ディレクトリ内の最新のソケットに設定します。ほとんどの場合、これは適切なものである必要があります。失敗する可能性は低く、失敗してもセキュリティ上の問題はありません。

これで、launchdplistファイルを最終的に作成できます。これを入れて

~/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 /ホスト名

リモートファイルが表示されたら、すばらしいです。完了です。

そうでない場合は、

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

ファイルを編集する前にアンロードし、ps auxwww | grep sshfsおよびkillを使用して、sshfsプロセスを見つけて強制終了してから、再試行します。

参照:

6
dag729

Dag729からの素晴らしい答えを更新したいと思います。 El Captain OSXとOSX 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 $*

そして、plistファイルからsshfsの代わりにこのスクリプトを実行します。したがって、~/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
oliora

Dag729の非常に完全な答えに何かを追加したいと思います。

Lionを使用していて、古いMacFuseの代わりに OS X Fuse を使用している場合、sshfsのパスが異なるため、上記の手順はそのままでは機能しません。

その場合は、を使用してインストール内のsshfsがどこにあるかを確認してください。

which sshfs

そして、thatパスを/ 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 $*

残りはまだ有効であることが確認できます。

1
Tex