好吧,我以为这会更容易,但我就是不知道我想要的是否可行。
我想从 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 ..