執(zhí)行sudo命令時(shí)command not found的解決辦法

問題的原因: 在編譯sudo包的時(shí)候默認(rèn)開啟了- -with-secure-path選項(xiàng)。

方法1: 在/etc/sudoers文件內(nèi)增加這么一行:Defaults secure_path=”/bin:/usr/bin:/usr/local/bin:…”, 把要用的命令path包括進(jìn)去。

方法2: 用命令的絕對(duì)路徑。

方法3: 使用sudo的env選項(xiàng),像這樣sudo env PATH=$PATH cmd.sh。

方法4: 把腳本拷貝或鏈接到系統(tǒng)$PATH中。

方法5: 重新編譯sudo,不帶–with-secure-path選項(xiàng)了.(終極解決辦法)。

在非root下,可以執(zhí)行很多命令。在root命令下,卻提示 command not found。例如 使用adb
現(xiàn)象: 當(dāng)我們用sudo來(lái)執(zhí)行cd、ls等命令時(shí),會(huì)出現(xiàn)command not found的提示 在執(zhí)行Linux命令時(shí),如果在其前面加上sudo,就表示以root權(quán)限執(zhí)行。但是這其實(shí)是有一個(gè)前提的,就是只有那些Linux內(nèi)置系統(tǒng)命令才可以用如此的形式來(lái)執(zhí)行,而對(duì)于Shell內(nèi)置命令或其他用戶自定義命令、別名等,是不能用sudo來(lái)使用root權(quán)限的。為什么呢?詳細(xì)說(shuō)一下sudo幕后隱藏的過程才能明白。

因?yàn)楫?dāng)在Linux下用sudo執(zhí)行某一命令時(shí),是在原進(jìn)程(parent process)的基礎(chǔ)上fork出來(lái)一個(gè)子進(jìn)程(child process),這個(gè)子進(jìn)程是以root權(quán)限執(zhí)行的。然后在子進(jìn)程中,執(zhí)行你在sudo后面跟的命令。
在子進(jìn)程中是無(wú)法調(diào)用涉及到父進(jìn)程的狀態(tài)的一些命令的,所以非系統(tǒng)內(nèi)置命令會(huì)被拒絕。這就是為什么會(huì)出現(xiàn)command not found的提示。

解決:先用絕對(duì)路徑執(zhí)行吧

原因英文版
Path used for every command run from sudo(8). If you don’t trust the people running sudo to have a sane PATH environment variable you may want to use this. Another use is if you want to have the “root path” be separate from the “user path.” You will need to customize the path for your site. NOTE: this is not applied to users in the group specified by –with-exemptgroup. If you do not specify a path, “/bin:/usr/ucb:/usr/bin:/usr/sbin:/sbin:/usr/etc:/etc” is used.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容