使用 sshfs 挂载并写入文件权限

使用 sshfs 挂载并写入文件权限

我尝试 sshfs 挂载远程目录,但挂载的文件不可写。我已经没有想法或方法来调试它了。我应该在远程服务器上检查什么吗?

我使用的是 Xubuntu 14.04。我安装了 14.04 Ubuntu 的远程目录。

local $ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 14.04.3 LTS
Release:    14.04
Codename:   trusty

我更改了/etc/fuse.conf

local $ sudo cat /etc/fuse.conf
# /etc/fuse.conf - Configuration file for Filesystem in Userspace (FUSE)

# Set the maximum number of FUSE mounts allowed to non-root users.
# The default is 1000.
#mount_max = 1000

# Allow non-root users to specify the allow_other or allow_root mount options.
user_allow_other

我的用户在fuse组中

local $ sudo grep fuse /etc/group
fuse:x:105:MY_LOACL_USERNAME

我使用以下命令挂载远程目录(尝试使用/不使用 sudo、default_permissions、allow_other 的组合):

local $sudo sshfs -o allow_other,default_permissions -o IdentityFile=/path/to/ssh_key  REMOTE_USERNAME@REMOTE_HOST:/remote/dir/path/  /mnt/LOCAL_DIR_NAME/

具有REMOTE_USERNAME对目录/文件(在远程服务器上)的写入权限。

我在没有 sudo、default_permissions 的情况下尝试了上面的命令,并且在所有情况下我得到:

local $ ls -al /mnt/LOCAL_DIR_NAME/a_file
-rw-rw-r-- 1 699 699 1513 Aug 12 16:08 /mnt/LOCAL_DIR_NAME/a_file
local $ test -w /mnt/LOCAL_DIR_NAME/a_file && echo "Writable" || echo "Not Writable"
Not Writable

澄清 0

回复用户3188445的评论:

$ whoami
LOCAL_USER
$ cd
$ mkdir test_mnt
$ sshfs -o allow_other,default_permissions -o IdentityFile=/path/to/ssh_key  REMOTE_USERNAME@REMOTE_HOST:/remote/dir/path/ test_mnt/

$ ls test_mnt/
I see the contents of the dir correctly

$ ls -al test_mnt/
total 216
drwxr-xr-x  1 699 699  4096 Aug 12 16:42 .
drwxr----- 58 LOCAL_USER LOCAL_USER  4096 Aug 17 15:46 ..
-rw-r--r--  1 699 699  2557 Jul 30 16:48 sample_file
drwxr-xr-x  1 699 699  4096 Aug 11 17:25 sample_dir


$ touch test_mnt/new_file 
touch: cannot touch ‘test_mnt/new_file’: Permission denied

# extra info: SSH to the remote host and check file permissions
$ ssh REMOTE_USERNAME@REMOTE_HOST
# on remote host
$ ls -al /remote/dir/path/
lrwxrwxrwx 1 root root 18 Jul 30 13:48 /remote/dir/path/ -> /srv/path/path/path/
$ cd /remote/dir/path/
$ ls -al
total 216
drwxr-xr-x 26 REMOTE_USERNAME  REMOTE_USERNAME   4096 Aug 12 13:42 .
drwxr-xr-x  4 root root  4096 Jul 30 14:37 ..
-rw-r--r--  1 REMOTE_USERNAME  REMOTE_USERNAME   2557 Jul 30 13:48 sample_file
drwxr-xr-x  2 REMOTE_USERNAME  REMOTE_USERNAME   4096 Aug 11 14:25 sample_dir

答案1

该问题已得到回答Linux 邮件列表;为了完整性,我在这里发布翻译后的答案。

解决方案

default_permissions解决方案是在安装时不要同时使用这两个选项allow_other(我在最初的实验中没有尝试过)。

解释

问题似乎很简单。当您使用fusermount中的选项时default_permissions,fuse对fuse mount的权限控制由核心而不是由保险丝

这意味着 REMOTE_USER 的 uid/gid 未映射到 LOCAL_USER (sshfs.c IDMAP_NONE)。它的工作方式与简单的 nfs fs 相同,无需映射。

因此,如果 uid/gid 数字不匹配,则禁止访问是有意义的。

如果您有此选项allow_other,则该目录只能由 uid 699 的本地用户写入(如果存在)。

来自保险丝的人:

'default_permissions'

   By default FUSE doesn't check file access permissions, the
   filesystem is free to implement its access policy or leave it to
   the underlying file access mechanism (e.g. in case of network
   filesystems).  This option enables permission checking, restricting
   access based on file mode.  It is usually useful together with the
   'allow_other' mount option.

'allow_other'

   This option overrides the security measure restricting file access
   to the user mounting the filesystem.  This option is by default only
   allowed to root, but this restriction can be removed with a
   (userspace) configuration option.

答案2

不要使用 sudo 运行 sshfs。如果这样做,ssh 将认为该文件系统属于 root。像你自己一样运行它,然后你就可以写入文件了。

澄清

当不使用 sudo 运行时,您需要挂载到您自己的目录,因为您可能无法写入 /mnt。下面是在 /etc/fuse.conf 添加 user_allow_other 后如何使用 sshfs 的示例:

$ cd                      # make sure you are in home directory
$ mkdir mnt               # create empty directory
$ sshfs server.com: mnt   # mount my home directory on server.com on ./mnt
$ ls mnt
[contents of home directory on server]
$ touch mnt/new_file      # no problem creating a new file
$ fusermount -u mnt       # unmount file system
$ rmdir mnt

答案3

造成这种情况的一个可能原因(我遇到的一个原因)是我安装的磁盘上没有更多可用空间。

答案4

如果您在主目录中创建了挂载目录,并假设您是唯一要使用它的人,则无需 sudo 即可运行 sshfs 命令。这样您就拥有挂载目录的必要权限。应该有帮助。示例命令示例“sshfs -o reconnect, follow_synlinks <user@sshIp:<remote_dir>> <mount_dir>”

相关内容