SSHFS

提供: ArchWiki
2018年11月2日 (金) 14:07時点におけるR6eve (トーク | 投稿記録)による版 (誤字修正)
ナビゲーションに移動 検索に移動

関連記事

sshfs を使うことで (SSH でアクセスできる) リモートシステムをローカルフォルダにマウントすることができます。ツールを使ってマウントしたファイルを様々に操作することが可能です (コピー、名前を変更、vim で編集など)。基本的に shfs の代わりに sshfs を使うことが推奨されます。shfs の新しいバージョンは2004年からリリースされていません。

インストール

公式リポジトリから sshfsインストールしてください。

マウント

ディレクトリをマウントする前に、対象のディレクトリのファイルパーティションが正しく設定されているか (ユーザーがアクセスできるか) 確認してください。マウントするには、sshfs を実行してリモートディレクトリをマウントします:

$ sshfs [user@]host:[dir] mountpoint [options]

例:

$ sshfs sessy@mycomputer:/remote/path /local/path -C -p 9876 -o allow_other

-p 9876 はポート番号、-C は圧縮の使用、-o allow_other は root 以外のユーザーの読み書きの許可です。

ノート:
  • allow_other オプションはデフォルトで無効になっています。有効にするには /etc/fuse.confuser_allow_other 行をアンコメントして root 以外のユーザーが allow_other マウントオプションを使えるようにしてください。
  • -p スイッチを使うのが面倒な場合、~/.ssh/config でホストごとに非標準ポートを定義することもできます。詳しくは Secure Shell#ssh の設定に接続データを保存する を参照。

必要であれば、SSH はパスワードを尋ねます。何度もパスワードを入力したくない場合は、SSH 鍵を読んでください。

ヒント: Google Authenticator を使うことで sshfs のセキュリティを向上させることができます。

アンマウント

リモートシステムをアンマウントするには:

$ fusermount -u local_mount_point

例:

$ fusermount -u /mnt/sessy

Chroot

(特定の) ユーザーをディレクトリに閉じ込めたい場合、/etc/ssh/sshd_config を編集してください:

/etc/ssh/sshd_config
.....
Match User someuser 
       ChrootDirectory /chroot/%u
       ForceCommand internal-sftp #to restrict the user to sftp only
       AllowTcpForwarding no
       X11Forwarding no
.....
ノート: chroot ディレクトリの所有者は root である必要があります。そうでない場合、接続ができません。詳しくは man ページで Match, ChrootDirectoryForceCommand を確認してください。

ヘルパー

sshfs ファイルシステムを頻繁にマウントする必要がある場合、sftpman などの sshfs ヘルパーを使うと良いでしょう。

コマンドラインと GTK のフロントエンドが入っており、マウントやアンマウントをワンクリックで行うことができるようになります。

自動マウント

起動時や、必要に応じて (ディレクトリのアクセス時に)、自動マウントを行うことができます。どちらにしても、セットアップは /etc/fstab で行います。

ノート: 自動マウントは root ユーザーによって行われるため、通常ユーザーの .ssh/config で設定した Hosts は使えなくなります。root ユーザーで通常ユーザーの SSH 鍵を使うときは、IdentityFile オプションにフルパスを指定してください。そして、ホストの署名が .ssh/known_hosts ファイルに追加されるように root で一度は手動で sshfs マウントを使用します。

必要に応じてマウント

/etc/fstab エントリを使うことで systemd でオンデマンドのマウントを行えます。

例:

user@host:/remote/folder /mount/point  fuse.sshfs noauto,x-systemd.automount,_netdev,users,idmap=user,IdentityFile=/home/user/.ssh/id_rsa,allow_other,reconnect 0 0

ここで重要なマウントオプションは noauto,x-systemd.automount,_netdev です。

  • noauto で起動時にマウントしないように設定します。
  • x-systemd.automount によって必要になったときにマウントします。
  • _netdev はブロックデバイスではなくネットワークデバイスであることを指定します (_netdev がないと "No such device" エラーが発生します)。
ヒント: autosshfs-gitAUR は新しいマウントポイントを追加するのに /etc/fstab を編集する必要がなくなり、(autosshfs が有効になった) 通常ユーザーがアクセスしようとしただけで作成されます (例: ls ~/mnt/ssh/[user@]yourremotehost[:port])。autosshfs-gitAUR は AutoFS を使います。autosshfs-user で使用するユーザーを有効にする必要があります。

起動時にマウント

/etc/fstab で sshfs を使ってリモートのファイルシステムをマウントする例:

USERNAME@HOSTNAME_OR_IP:/REMOTE/DIRECTORY  /LOCAL/MOUNTPOINT  fuse.sshfs  defaults,_netdev  0  0

fstab の行の例:

llib@192.168.1.200:/home/llib/FAH  /media/FAH2  fuse.sshfs  defaults,_netdev  0  0

ユーザーの SSH 鍵を使っている場合、自動的に動作するようになります。SSH 鍵を見て下さい。

複数のユーザーで sshfs を使いたい場合:

user@domain.org:/home/user  /media/user   fuse.sshfs    defaults,allow_other,_netdev    0  0

マウントする前にネットワークが有効になっていることを確認するために _netdev マウントオプションを設定することが重要です。

ユーザーアクセスのセキュア化

/etc/fstab で自動マウントする場合、ファイルシステムは基本的に root によってマウントされます。デフォルトでは、通常ユーザーとしてアクセスして他のユーザーのアクセスを制限したいときに予期しない結果を招くことがあります。

マウントポイントの設定例:

USERNAME@HOSTNAME_OR_IP:/REMOTE/DIRECTORY  /LOCAL/MOUNTPOINT  fuse.sshfs noauto,x-systemd.automount,_netdev,user,idmap=user,follow_symlinks,identityfile=/home/USERNAME/.ssh/id_rsa,allow_other,default_permissions,uid=USER_ID_N,gid=USER_GID_N 0 0

オプションの説明:

  • allow_other - root 以外のユーザーが共有フォルダにアクセスすることを許可します。
  • default_permissions - カーネルからパーミッションを確認することを許可します。リモートファイルシステムの実際のパーミッションが使われます。allow_other によって許可されたユーザー以外にも制限的なアクセスを許可します。
  • uid, gid - ファイルの所有権を特定の値に設定します。uid にはユーザーの ID、gid にはユーザーのグループ ID を指定します。

オプション

sshfs はローカル・リモートのユーザー ID を自動的に変換することができます。

idmap オプションを user に設定することで接続するユーザーの UID が変換されます:

# sshfs -o idmap=user sessy@mycomputer:/home/sessy /mnt/sessy -C -p 9876

上記のコマンドはリモートのユーザー "sessy" の UID をプロセスを実行しているローカルユーザーにマッピングします (上記の例では "root")。GID は変わりません。UID と GID 変換を細かく制御する必要がある場合、idmap=file オプションと uidfilegidfile を見てください。

トラブルシューティング

チェックリスト

SSH のチェックリストを最初に読んで、以下を確認してください:

1. SSH ログインでサーバーの /etc/issue ファイルから情報を送信している場合、SSHFS が混乱してしまいます。サーバーの /etc/issue ファイルは無効にしてください:

$ mv /etc/issue /etc/issue.orig

2. ウェブ上の SSH 関連のトラブルシューティング記事のほとんどは Systemd を考慮していません。/etc/fstab の定義が sshfs#user@host:/mnt/server/folder ... fuse ... から始まる間違ったものであることはしばしばで、user@host:/mnt/server/folder ... fuse.sshfs ... x-systemd, ... が正しい構文になります。

3. サーバーのソースフォルダとコンテンツがサーバーのユーザーによって所有されていることを確認してください。

$ chown -R USER_S: /mnt/servers/folder

4. サーバーのユーザー ID とクライアントのユーザー ID が異なっている可能性があります。当然ユーザー名は同一である必要があります。クライアントのユーザー ID に注意してください。SSHFS は以下のマウントオプションで UID を変換します:

uid=USER_C_ID,gid=GROUP_C_ID

5. クライアントのターゲットマウントポイント (フォルダ) がクライアントのユーザーによって所有されていることを確認してください。SSHFS のマウントオプションで指定したユーザー ID と同じである必要があります。

$ chown -R USER_C: /mnt/client/folder

6. クライアントのマウントポイント (フォルダ) が空であることを確認してください。デフォルトでは SSHFS のフォルダを空でないフォルダにマウントすることはできませ。

7. /etc/fstab で SSH 公開鍵認証を使って SSH 共有を自動マウントしたい場合、以下のように設定してください:

USER_S@SERVER:/mnt/on/server      /nmt/on/client        fuse.sshfs      x-systemd.automount,_netdev,user,idmap=user,transform_symlinks,identityfile=/home/USER_C/.ssh/id_rsa,allow_other,default_permissions,uid=USER_C_ID,gid=GROUP_C_ID,umask=0   0 0

設定例:

SERVER = Server host name (serv)
USER_S = Server user name (pete)
USER_C = Client user name (pete)
USER_S_ID = Server user ID (1004)
USER_C_ID = Client user ID (1000)
GROUP_C_ID = Client user's group ID (100)

クライアントユーザーの ID とグループ ID は以下のコマンドで確認できます:

$ id USERNAME

実際に /etc/fstab に設定する行は以下のようになります:

pete@serv:/mnt/on/server      /nmt/on/client        fuse.sshfs      x-systemd.automount,_netdev,user,idmap=user,transform_symlinks,identityfile=/home/pete/.ssh/id_rsa,allow_other,default_permissions,uid=1004,gid=1000,umask=0   0 0

8. チェックリストに追加するべきことが他にもあるのであれば追加してください。

ピアによって接続がリセットされる

  • ホストネームを使ってリモートマシンにアクセスしようとしている場合、ドメイン名が解決できないのが原因かもしれないので、IP アドレスを使って接続してみてください。/etc/hosts を編集してサーバーの設定が正しいことを確認してください。
  • デフォルトではないキーの名前を使っている場合、-i .ssh/my_key と指定しても意味がありません。-o IdentityFile=/home/user/.ssh/my_key のようにキーのフルパスを使う必要があります。
  • sshfs_debug オプションを追加することで問題の解決に役に立つ情報が得られます (sshfs -o sshfs_debug user@server ...)。
  • 何も有用な情報が得られないときは、debug オプションも追加してみてください。
  • sshfs で DD-WRT などが動作しているルーターに接続する場合、こちら に解決方法が載っています (dropbear にパッチをあてるかわりに sshfs コマンドで -osftp_server=/opt/libexec/sftp-server オプションを使うこともできます)。
  • 古いフォーラムスレッド: sshfs: Connection reset by peer
  • ユーザーを使ってサーバーにログインできることを確認してください (特に AllowUsers を使用する場合)。
  • /etc/ssh/sshd_configSubsystem sftp /usr/lib/ssh/sftp-server が有効になっていることを確認してください。
ノート: sshfs に複数のオプションを指定する場合、カンマで区切る必要があります。例: sshfs -o sshfs_debug,IdentityFile=</path/to/key> user@server ...

Remote host has disconnected

sshfs を使おうとした直後にこのメッセージが表示される場合:

  • まずリモートマシンに sftp がインストールされていることを確認してください。インストールしていないと、動作しません。
ヒント: リモートサーバーで OpenWRT を動かしている場合: opkg install openssh-sftp-server でインストールできます。
  • それから、リモートマシンの /etc/ssh/sshd_config に記載されている Subsystem のパスが正しいかどうか確認してください。パスは find / -name sftp-server で確認できます。

Arch Linux では /etc/ssh/sshd_config のデフォルト値は Subsystem sftp /usr/lib/ssh/sftp-server です。

Thunar と FAM のリモートファイルの問題

リモートフォルダが表示されず、ホームディレクトリに戻ってしまう場合、あるいは Thunar で他のリモートファイルにアクセスできない場合、FAM を gamin で置き換えてください。Gamin は FAM の後継です。

アプリがフリーズする (例: Nautilus, Gedit)

ノート: 下記の設定をすると最近使用したファイルのリストが作られなくなります。また、書き込みエラーが発生することがあります。

アプリケーションがフリーズする (反応しなくなる) 場合、~/recently-used.xbel の書き込み権限を無効化する必要があるかもしれません:

# chattr +i /home/USERNAME/.local/share/recently-used.xbel

詳しくは次の バグレポート を見て下さい。

sshfs をマウントされているときにシャットダウンでフリーズ

sshfs を手動でマウントして、シャットダウン前にアンマウントしていなかった場合、systemd がシャットダウン時にフリーズすることがあります。この問題を解決するには、以下のファイルを (root で) 作成してください:

/etc/systemd/system/killsshfs.service
[Unit]
After=network.target

[Service]
RemainAfterExit=yes
ExecStart=-/bin/true
ExecStop=-/usr/bin/pkill -x sshfs

[Install]
WantedBy=multi-user.target

そしてサービスを有効化します: systemctl enable killsshfs.service

fstab によるマウントの問題

詳細な出力を得たい場合、マウントオプションに以下を追加してください:

ssh_command=ssh\040-vv,sshfs_debug,debug
ノート: 上記の \040 は fstab でフィールドを区切るのに使うスペースを意味します。

mount -av を実行してデバッグ出力を確認するために、以下のオプションを削除してください:

noauto,x-systemd.automount

参照