以非 root 身份从命令行挂载 Samba,可读/写,无需 fstab?

以非 root 身份从命令行挂载 Samba,可读/写,无需 fstab?

好吧,我以为这会更容易,但我就是不知道我想要的是否可行。

我想从 Ubuntu 20.04(MATE)中的命令行挂载网络 Samba 共享——最好不要更改文件或在某处保存设置;只需一个命令行。

因此我首先尝试:

sudo mount -t cifs -o user=MYSMBUSER //192.0.2.1/myshare /tmp/myshare

这很有效 - 从挂载、列出文件和提供对文件的只读访问的意义上来说;但它不允许写入文件(权限被拒绝)。

这似乎是因为:

https://unix.stackexchange.com/questions/68079/mount-cifs-network-drive-write-permissions-and-chown

您正在以 root 身份挂载 CIFS 共享(因为您使用了 sudo),因此您无法以普通用户身份写入。如果您的 Linux 发行版及其内核足够新,您可以以普通用户身份挂载网络共享(但位于用户拥有的文件夹下),您将拥有正确的凭据来写入文件

是的,我确实想“以普通用户身份挂载网络共享”,这似乎是一个选择 - 但是,我在 Ubuntu 上的用户名与 Samba 用户名不同,因此:

另一种方法是指定已安装网络共享应使用的用户和组 ID,这将允许该特定用户和潜在组写入共享。将以下选项添加到您的安装中:...


第一个问题 - 如何卸载上述内容;我已经完成了:

$ sudo umount /tmp/myshare
$ 

...并且由于它没有报告任何错误,我认为它完成得很好,但是然后我尝试:

$ ls /tmp/myshare
file_from_share01.txt  file_from_share02.txt ...

...文件仍然列出,因此共享已安装;事实证明(通过https://stackoverflow.com/questions/74626/how-do-you-force-a-cifs-connection-to-unmount)要卸载它,我必须执行以下操作:

$ sudo umount -a -t cifs -l

这里有一个棘手的部分——如果我想以普通用户身份挂载,但指定 SMB 用户名,我必须编写与上面相同的命令,但不包含sudo

$ mount -t cifs -o user=MYUSER //192.0.2.1/myshare /tmp/myshare
mount: only root can use "--options" option

所以,也许我可以以非 root 身份运行此程序,如果我本来不必使用该user选项 - 但我确实使用了。因此我实际上无法使用该命令。

解决此问题的一个建议是在 fstab 中指定选项 - 通过 无需 sudo 即可挂载共享 cifs 文件夹

为了能够以普通用户身份挂载该文件夹,请在配置文件 /etc/fstab 中包含 cifs 文件夹的挂载选项,并添加选项 noauto,user,

然而,我确实不是想要这样做,因为我不想在我的计算机上保留 SMB 凭据的记录 - 如果我必须编辑 fstab,那么我有责任在完成后从 fstab 中删除该条目,而且通常在那个时候我很累,我可能会忘记,等等。

我发现这可能是某种安全功能:

https://unix.stackexchange.com/questions/365308/use-mount-o-with-a-non-root-user

-o 限制(只有 root 可以指定)是为了保护系统:管理员可以设置任何必要的选项,可以直接使用 -o 或使用 /etc/fstab;用户只能挂载或卸载用户可控制的文件系统,而无需指定选项,因为文件系统选项允许许多不利的情况。因此,某些文件系统支持其他设置某些选项的方式,例如上面用于 CIFS 的 USER 环境变量。

嗯,是的,但对我来说,根本不输入任何 SMB 路径更安全/etc/fstab

所以,我真的很想安装只是使用命令行没有更改任何地方的任何配置文件(包括/etc/fstab)。

我希望有另一个命令,我发现了gvfs-mount- 但我有同样的问题从命令行使用 gvfs 挂载 SMB 共享

$ dbus-launch bash
$  gvfs-mount smb://192.0.2.1/myshare
This tool has been deprecated, use 'gio mount' instead.
See 'gio help mount' for more info.

Password required for share myshare on 192.0.2.1
User [locuser]: MYUSER
Domain [WORKGROUP]:
Password:
$

此时,看上去似乎已经安装完毕,但实际上并没有:

$ ls /run/user/1000/gvfs/
$

...通过gvfs-mount -l,我们可以看到没有相应的挂载点:

$ gvfs-mount -l
...
Volume(3): test_nfs
  Type: GProxyVolume (GProxyVolumeMonitorUDisks2)
  Mount(0): test_nfs -> file:///tmp/test_nfs
    Type: GProxyMount (GProxyVolumeMonitorUDisks2)
Mount(0): myshare on 192.0.2.1 -> smb://192.0.2.1/myshare/
  Type: GDaemonMount

...因此无论如何我们都无法通过此“挂载”访问任何文件。


再次,你如何卸载它-你不能这样做umount /tmp/myshare,它甚至不被认为是安装的;发现这里卸载 gvfs samba 共享并打开文件

$ ls ~/.gvfs
ls: cannot access '~/.gvfs': No such file or directory

$ gvfs-mount -u smb://192.0.2.1/myshare
This tool has been deprecated, use 'gio mount' instead.
See 'gio help mount' for more info.

此后,通过检查确认gvfs-mount -l共享确实消失了)


并解决所提到的问题gio mount- 首先要注意的是,如果不启动 dbus 会话,它会失败:

$ gio mount smb://192.0.2.1
gio: smb://192.0.2.1: volume doesn’t implement mount

...然后,在由 启动的 shell 中dbus-launch bash,它的行为与 完全相同gvfs-mount

$ gio mount smb://192.0.2.1/myshare
Password required for share myshare on 192.0.2.1
User [locuser]: MYUSER
Domain [WORKGROUP]:
Password:
$

看起来它已经安装好了,但是:

$ gio mount -l
...
Volume(3): test_nfs
  Type: GProxyVolume (GProxyVolumeMonitorUDisks2)
  Mount(0): test_nfs -> file:///tmp/test_nfs
    Type: GProxyMount (GProxyVolumeMonitorUDisks2)
Mount(0): myshare on 192.0.2.1 -> smb://192.0.2.1/myshare/
  Type: GDaemonMount

... 再次没有本地目录挂载点。


上面说的是:是否可以从命令行挂载 SMB 共享,而无需更改任何本地文件(例如,尤其是/etc/fstab),无需 sudo,并且具有 r/w 权限(我已经在 Windows 中确认,SMB 用户 MYUSER 具有该权限) - 如果可以,如何操作?

答案1

好吧,把这个作为答案发布出来,因为事实证明,其中一些gvfs/gio命令显然起作用了——我只是显然没有查看正确的挂载文件夹;显然在我的 Ubuntu 20.04 中不是这样:

$ ls ~/.gvfs
ls: cannot access '~/.gvfs': No such file or directory

... 但反而:

$ ls ~/.cache/gvfs/
'smb-share:server=192.0.2.1,share=myshare'

...文件就在那里,我可以读/写...现在我很困惑它怎么还在那里,因为我想我已经卸载它了...哦,好吧。

好吧,经过这几十年的发展,我很高兴文件共享现在变得如此简单!期待进一步的变化,希望我们能看到~/.cache/.etc/gvfs-2/实际应用,这样我们就会得到更多的破坏和更多无用的答案,我们将来不得不花费数小时来搜索!技术的发展不是很棒吗?:)

答案2

挂载点不在〜/ .缓存/ gvfs /它在/运行/用户/1000/gvfs

将 1000 替换为你自己的 uid 号

我将挂载我自己的一份股份:

~$ gio mount smb://vubmate2004.local/Private
Password required for share private on vubmate2004.local
User [tester]: tester
Domain [WORKGROUP]: 
Password: 

我将检查它是否已安装:

~$ ls -al /run/user/1000/gvfs
total 0
dr-x------  3 tester tester   0 Jan  5 15:08  .
drwx------ 10 tester tester 300 Jan  5 15:13  ..
drwx------  1 tester tester   0 Jan  5 15:14 'smb-share:server=vubmate2004.local,share=private'

我将检查已安装共享的内容:

~$ ls -al /run/user/1000/gvfs/smb-share:server=vubmate2004.local,share=private
total 0
drwx------ 1 tester tester 0 Jan  5 15:14  .
dr-x------ 3 tester tester 0 Jan  5 15:08  ..
-rwx------ 1 tester tester 0 Jan  5 15:14 'new file'

我将卸载共享:

~$ gio mount -u smb://vubmate2004.local/Private

我将检查它是否仍然安装:

~$ ls -al /run/user/1000/gvfs
total 0
dr-x------  2 tester tester   0 Jan  5 15:08 .
drwx------ 10 tester tester 300 Jan  5 15:13 ..

相关内容