從命令列以非 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 中指定選項 - via 無需 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-session,它就會失敗:

$ 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

掛載點不在下面〜/.cache/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 ..

相關內容