Bash
使用 sudo -u <username> 命令時如何在路徑中轉義萬用字元
我需要訪問打開根壁球的 NFS 文件伺服器上的文件。我在 Arch Linux 上使用 bash。我正在使用這種類型的命令:
# sudo -u authduser ls /mounted/filesystem/path/aa.user.js
這成功了,輸出是:
/mounted/filesystem/path/aa.user.js
但是,有多個文件,例如 bb.user.js。當我嘗試以下命令時,它失敗了:
# sudo -u authduser ls /mounted/filesystem/path/*.user.js
輸出是:
ls: 無法訪問’/mounted/filesystem/path/*.user.js’: 沒有這樣的文件或目錄
我嘗試過引用、轉義和其他各種事情,但都沒有成功。正確的方法是什麼?
萬用字元的問題是它在執行
sudo
命令之前由 shell 擴展。如果 only
authduser
能夠列出 下的文件/mounted/filesystem/path/
,但不能列出正在執行該sudo
命令的使用者,那麼 shell 將無法擴展萬用字元並且將不加修改地傳遞它。由於ls
本身不擴展萬用字元,這將導致您看到的錯誤。請參閱為什麼使用萬用字元的 sudo mv 操作不起作用?有關詳細資訊。
為了解決這個問題,你可以使用sudo
’-s
參數,它會生成一個 shell 作為目標使用者(而不是簡單地直接執行命令),在這種情況下,如果你也給它一個命令,它將被傳遞給 shell使用-c
選項(這是 shell 解釋和執行命令的常用選項,包括萬用字元擴展。)在這種情況下,您需要將命令放在引號內(最好是單引號),以便執行
sudo
命令的 shell 不會嘗試解釋命令,只會解釋sudo
作為目標使用者生成的命令:# sudo -u authduser -s 'ls /mounted/filesystem/path/*.user.js'
有關更多詳細資訊,請參閱sudo 的手冊頁,特別是查看該
-s
選項。**更新:**這裡真的不可能使用
sudo -s
命令。有關更多詳細資訊,請參閱“sudo -s”在 shell 中執行命令,但萬用字元或元字元不起作用。