Samba

在 samba 共享中重新映射 UID

  • July 14, 2019

是否可以重新映射正在報告給 samba 客戶端的 UID(和 GID)?看起來各種idmap選項可能是可能的,但對於我想要完成的簡單重映射來說,它看起來過於復雜,而且我對這是否是正確的方法感到困惑。

考慮兩台機器 A 和 B。機器 A 的使用者smbuser具有 UID 701。機器 B 只有一個root具有 UID 的使用者0

smb.conf機器A的摘錄:

[share1]
 path = /tmp/share1
 valid users = smbuser

在機器 B 上:

mount -t cifs -o username=smbuser,pass=**** //10.1.1.11/share1 /mnt
ls -l /mnt

我懂了:

drwx------  701  701       0 Jan  1 00:00  .
drwx------  root root      0 Jan  1 00:00  ..
-rw-------  701  701      42 Jan  1 00:00  testfile

我想:

drwx------  root root      0 Jan  1 00:00  .
drwx------  root root      0 Jan  1 00:00  ..
-rw-------  root root     42 Jan  1 00:00  testfile

701 -> 0TL;DR:在向客戶端提供目錄列表時,我需要 samba 重新映射 UID 。

您需要uidforceuid和mount 選項gid的組合。forcegid這樣,您可以指示 SMB 客戶端始終分配特定的 UID 和 GID 來擁有文件。另外,您無需為此更改 SMB 伺服器配置。

請參閱https://linux.die.net/man/8/mount.cifscifs.mount的手冊頁:

uid=arg當伺服器不提供所有權資訊時,設置將擁有已安裝文件系統上的所有文件或目錄的 uid。它可以指定為使用者名或數字 uid。未指定時,預設為 uid 0。 mount.cifs 幫助程序必須為 1.10 或更高版本,以支持以非數字形式指定 uid。有關詳細資訊,請參閱下面的文件和目錄所有權和權限部分。

forceuid指示客戶端忽略伺服器為文件和目錄提供的任何 uid,並始終將所有者分配為 uid= 選項的值。有關詳細資訊,請參閱下面的文件和目錄所有權和權限部分。

gid=arg當伺服器不提供所有權資訊時,設置將擁有已安裝文件系統上所有文件或目錄的 gid。它可以指定為組名或數字 gid。未指定時,預設值為 gid 0。 mount.cifs 幫助程序必須為 1.10 或更高版本,以支持以非數字形式指定 gid。有關詳細資訊,請參閱下面的文件和目錄所有權和權限部分。

forcegid指示客戶端忽略伺服器為文件和目錄提供的任何 gid,並始終將所有者分配為 gid= 選項的值。有關詳細資訊,請參閱下面的文件和目錄所有權和權限部分。

在您的情況下,您可以使用(不指定 UID/GID 將使用預設值 0):

mount -t cifs -o username=smbuser,pass=****,uid,forceuid,gid,forcegid //10.1.1.11/share1 /mnt

另請查看dynperm可能對您有用的選項。

作為參考,“文件和目錄所有權和權限”部分了解:

文件和目錄的所有權和權限

核心 CIFS 協議不提供文件和目錄的 unix 所有權資訊或模式。因此,文件和目錄通常會被設置為 uid= 或 gid= 選項的任何值所擁有,並且將具有設置為掛載的預設 file_mode 和 dir_mode 的權限。嘗試通過 chmod/chown 更改這些值將返回成功但沒有效果。

當客戶端和伺服器協商unix擴展時,文件和目錄將被分配伺服器提供的uid、gid和模式。因為 CIFS 掛載通常是單使用者的,並且無論哪個使用者訪問掛載都使用相同的憑據,因此新創建的文件和目錄通常將被授予與用於掛載共享的任何憑據相對應的所有權。

如果客戶端和伺服器上正在使用的 uid 和 gid 不匹配,則 forceuid 和 forcegid 選項可能會有所幫助。但是請注意,沒有相應的選項可以覆蓋該模式。forceuid 或 forcegid 生效時分配給文件的權限可能無法反映真實權限。

當未協商 unix 擴展時,也可以使用“dynperm”掛載選項在伺服器上本地模擬它們。當此掛載選項生效時,新創建的文件和目錄將獲得看似適當的權限。但是,這些權限不會儲存在伺服器上,並且可能在將來的任何時候消失(取決於核心刷新 inode 記憶體的突發奇想)。通常,不鼓勵使用此掛載選項。

也可以通過 noperm 選項完全覆蓋客戶端的權限檢查。不能覆蓋伺服器端權限檢查。伺服器完成的權限檢查將始終與用於掛載共享的憑據相對應,而不一定與正在訪問共享的使用者相對應。

引用自:https://unix.stackexchange.com/questions/530038