web-dev-qa-db-ja.com

sshfsがSFTPサーバーからのシンボリックリンクを破壊する

シンボリックリンクで作業できるように、SSHFS経由でリモートSFTPパスをマウントする方法を誰かが知っていますか?これを行うと、作成したすべてのシンボリックリンクが間違ったファイルをポイントします(リンクしたものではありません)。関心のあるすべてのシンボリックリンクは相対(絶対ではない)であるため、リモートマシンで行うのとまったく同じように表示されます。理想的です。

デフォルトのマウントオプションでsshfsを使用すると、現在のディレクトリにある別のファイルへのシンボリックリンクを作成できません。

$ cd /mnt/path/to/sshfs/mount
$ ln -s ./test ./test2
$ ls test2
lrwxrwxrwx 1 root webusers   11 Jul  3 09:11 test2 -> /test

リンクターゲットが現在のディレクトリ(./test)にあるため、これは明らかに正しくありませんが、sshfsが/testへのリンクを作成していることがわかります。これは正しくありません。リンクターゲットは/mnt/path/to/sshfs/mount/testではなく/testです。

Sshfsファイルシステムをマウントするときにtransform_symlinksオプションを追加すると、代わりに同じコマンドで相対リンクが取得されますが、それでも間違った場所を指しています。

$ cd /mnt/path/to/sshfs/mount
$ ln -s ./test ./test2
$ ls test2
lrwxrwxrwx 1 root webusers   11 Jul  3 09:13 test2 -> ../../../test

ここでは、現在のディレクトリの./testにリンクしようとしましたが、代わりに3レベル上の../../../testへのリンクを取得しました。

ただし、sshfsでマウントする代わりに、コマンドラインSFTPクライアントsftpで接続しても機能します。

sftp> open ...
sftp> symlink test test2
...
$ cd /mnt/path/to/sshfs/mount
$ ls test2
lrwxrwxrwx 1 root webusers   11 Jul  3 09:13 test2 -> test

したがって、これはリモートSFTPサーバーが正常に機能していることを示しています(専用のSFTPクライアントでシンボリックリンクを作成できるため)が、何らかの理由でsshfsを介して機能するシンボリックリンクを作成できません。

奇妙なことに、sshfsを使用してシェルアクセスを提供するSSHサーバーにパスをマウントすると(SFTPのみのサーバーではなく)、シンボリックリンクは正常に機能し、正しく作成できます。 SFTPのみのサーバーに接続されている場合にのみ問題があるようです。

何が悪いのですか? SFTPサーバーに接続してシンボリックリンクを機能させるときに、sshfsに渡す必要がある特別なオプションはありますか?

16
Malvineous

リモートアブソリュート(/で始まる)シンボリックリンクをsshfsマウントポイントに関連するように変換するには、follow_symlinksオプションを使用します。

sshfs -o follow_symlinks ...

transform_symlinksオプションは何もしません。 この問題 を参照してください。

13
Tom Hale

先ほど説明した動作を確認しましたが、これをテストすると、sshfsがマウントされたディレクトリにシンボリックリンクを作成できます。

$ touch T
$ ln -s T L
$ ls -l T L
lrwxrwxrwx 1 user user 1 Apr  9 16:10 L -> T
-rw-rw-r-- 1 user user 0 Apr  9 16:10 T

$ echo hello >> L
$ cat T
hello
$ pwd
/home/user/Oak/tmp
$ mount | grep Oak
user@Oak: on /home/user/Oak type Fuse.sshfs (rw,nosuid,nodev,user=user)

約4か月前にリモートでsshdをアップグレードしました。古いバージョンは数年前のものでした。たぶん、アップグレードで問題が解決したのかもしれません。これは、私が現在使用しているものについていくつかの手掛かりを与えるかもしれません:

$ ssh Oak 'ident $(which sshd)' | grep ssh
/usr/sbin/sshd:
 $NetBSD: sshd.c,v 1.13.4.1 2015/04/30 06:07:31 riz Exp $
 $NetBSD: sshpty.c,v 1.2.26.1 2015/04/30 06:07:31 riz Exp $
 $NetBSD: sshlogin.c,v 1.4.22.1 2015/04/30 06:07:31 riz Exp $

Ubuntuが自動的に行うことを除いて、私はsshfsを変更するために何もしていません。
HTH。

1
James K. Lowden