Bash

使用 sudo -u <username> 命令時如何在路徑中轉義萬用字元

  • November 27, 2018

我需要訪問打開根壁球的 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 擴展。

如果 onlyauthduser能夠列出 下的文件/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 中執行命令,但萬用字元或元字元不起作用

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