在 Windows 上,當我查看遠端資料夾的權限時,帳戶是用電腦名稱或網域限定的,也就是帳戶名稱的權限。
在 Linux 上,如果我有一個掛載到遠端驅動器的虛擬機,並且掛載上的資料夾的所有者是“root”,那麼這是我的根還是遠端系統的根?
在 Linux 上,這一切似乎太簡單了,一旦涉及網路就無法運作。我顯然錯過了一些東西。
路克
答案1
不幸的是,這是 Unix 上檔案共享最令人困惑的事情之一。而且我不擅長解釋令人困惑的事情。
你什麼看在ls -l
輸出中(例如),是從本機系統的角度轉換的遠端使用者的 ID。
當程式像ls
使用標準函數來尋找文件資訊時,檔案系統驅動程式只能為它們提供數位使用者 ID,而不是文字名稱。(到目前為止,與 Windows 沒有太大區別。)若要將 UID 轉換為名稱,ls
需要呼叫完全不同的作業系統元件,即名稱服務庫,該元件不知道 UID 是從哪裡取得的,因此只能轉換作業系統知道的帳戶,但無法返回並詢問檔案系統驅動程序尋求幫助。(這就是差異所在。)
例如,如果伺服器有兩個文件,一個由 root (UID 0) 擁有,另一個由 Luke (UID 1000) 擁有,ls
只會知道它們由「0」和「1000」擁有,並且會查看為了當地的具有相同 UID 的帳戶。 「0」始終是根,但「1000」可能是也可能不是 Luke。如果 UID 屬於儲存在 LDAP、NIS 或 AD 中的帳戶,且用戶端作業系統實際上是配置好的要在 LDAP 中尋找使用者帳戶,它會給予正確的使用者名稱。否則它實際上可能會撒謊,因為本地帳戶 UID(1000、1001...)往往對應於不同電腦上的不同人。
(檔案系統驅動程式可以透過多種方式以「擴展屬性」的形式告訴程式完整的使用者名稱。不幸的是,儘管進行了各種嘗試,但沒有標準的方法可以做到這一點,並且像這樣的程式ls
通常會嘗試避免特定於檔案系統的技巧更不幸的是,並非所有網路檔案系統協定。能傳輸使用者名稱:CIFS aka SMB 可以,NFSv4 可以,大多數其他不能。
但這些都不重要,因為你什麼可以做文件的內容始終取決於伺服器所知道的內容,而不是客戶端所看到的內容。例如,如果您使用sshfs
,它會使用您的使用者名稱(例如 )透過 SSH 登入伺服器sshfs luke@fileserver
,並且伺服器不會讓您執行任何不應該執行的操作。 CIFS、AFS 等也是如此。
答案2
所有者是遠端電腦上的 root 使用者。如果您想以 root 身分在遠端電腦上存取它,則必須將其以 root 身分安裝在遠端電腦上。
換句話說,這應該有效(本地用戶 aye,遠端用戶 root):
aye@ayes-machine$ sshfs root@bees-machine:/path /local-path
這不起作用(本機使用者 root,遠端使用者 bee):
aye@ayes-machine$ sudo sshfs bee@bees-machine:/path /local-path