ls 顯示“沒有這樣的文件”,但為什麼呢?
我有一些我不明白的奇怪行為。我只是想列出目錄中的一些文件:
sudo find /home/vsts/work/_temp/tmp.Q8K2bSeNVV/root/home/root
產生:/home/vsts/work/_temp/tmp.Q8K2bSeNVV/root/home/root/ /home/vsts/work/_temp/tmp.Q8K2bSeNVV/root/home/root/.gnupg /home/vsts/work/_temp/tmp.Q8K2bSeNVV/root/home/root/.gnupg/trustdb.gpg /home/vsts/work/_temp/tmp.Q8K2bSeNVV/root/home/root/.gnupg/private-keys-v1.d /home/vsts/work/_temp/tmp.Q8K2bSeNVV/root/home/root/.gnupg/S.gpg-agent /home/vsts/work/_temp/tmp.Q8K2bSeNVV/root/home/root/.gnupg/S.gpg-agent.extra /home/vsts/work/_temp/tmp.Q8K2bSeNVV/root/home/root/.gnupg/pubring.kbx~ /home/vsts/work/_temp/tmp.Q8K2bSeNVV/root/home/root/.gnupg/S.gpg-agent.browser /home/vsts/work/_temp/tmp.Q8K2bSeNVV/root/home/root/.gnupg/pubring.kbx /home/vsts/work/_temp/tmp.Q8K2bSeNVV/root/home/root/.gnupg/S.gpg-agent.ssh
所以我知道 .gnupg 目錄存在,並且裡面有文件。
sudo ls -la /home/vsts/work/_temp/tmp.Q8K2bSeNVV/root/home/root
產生:total 12 drwx------ 3 root root 4096 Sep 21 14:54 . drwxr-xr-x 3 root root 4096 Aug 24 18:30 .. drwxr-xr-x 3 root root 4096 Sep 21 14:54 .gnupg
所以目錄本身就有 rwx 權限。
但命令
sudo ls -la /home/vsts/work/_temp/tmp.Q8K2bSeNVV/root/home/root/.gnupg/*
給出:ls: cannot access '/home/vsts/work/_temp/tmp.Q8K2bSeNVV/root/home/root/.gnupg/*': No such file or directory
我一遍又一遍地檢查路徑,看不出有什麼問題。我有 rwx 權限和根級訪問權限。還有什麼可以阻止我列出這個目錄?
我的最終目標是做一個
chmod 600 /home/vsts/work/_temp/tmp.Q8K2bSeNVV/root/home/root/.gnupg/*
,這也失敗了。但現在我會滿足於ls。編輯:它剛剛擊中了我。這是否與文件萬用字元有關。* 是否在 sudo 之前擴展,因此沒有 root 訪問權限?
正如您正確指出的那樣,擴展順序是您問題的根源。與文件名 glob 相關的步驟是“文件名擴展”。雖然它在擴展順序上相當晚(參見這裡例如),但它是在實際呼叫命令*之前執行的。*這意味著例如
ls *
在包含 的目錄中file1.txt
,file2.txt
並且file3.txt
實際上被稱為ls file1.txt file2.txt file3.txt
。現在的問題是呼叫使用者沒有進入
.gnupg
目錄的必要權限。因此,*
文件名 glob 的擴展將失敗。在這種情況下,除非設置了特定的 shell 選項,否則*
將在命令行上保持原義,以便 shell 會嘗試在ls
原名為*
. 因此錯誤消息cannot access '/home/vsts/work/_temp/tmp.Q8K2bSeNVV/root/home/root/.gnupg/*'
如您所見,它嘗試訪問名為
*
inside的文件/home/vsts/work/_temp/tmp.Q8K2bSeNVV/root/home/root/.gnupg/
。您可以做的是編寫一個執行相關操作的 shell 腳本,然後將其呼叫為
root
usingsudo
。您需要將腳本放置在可從任何地方訪問的路徑下,例如/usr/local/bin
.