在Go 中使用sudo 執行Shell 指令
在Go 中執行指令時,重要的是要考慮exec.Command() 的限制。函數直接執行進程,而某些命令可能需要 shell 腳本來解釋。
exec.Command() 和Shell 指令
在給定的程式碼中,指令正在執行的是一個複雜的shell 腳本:
sudo find /folder -type f | while read i; do sudo -S chmod 644 "$i"; done
exec.Command() 無法直接解釋此腳本,因為它期望執行單一進程。要在 Go 中執行 shell 腳本,我們需要使用不同的方法。
使用 /bin/sh
一種解決方案是使用 /bin/sh,它是 Unix 系統上的預設 shell,用於解釋腳本。我們可以透過將 /bin/sh 作為第一個參數傳遞給 exec.Command() 來做到這一點,然後傳遞 -c 標誌來指示我們正在傳遞要執行的命令。例如:
cmd := exec.Command("/bin/sh", "-c", "sudo find ...")
透過這種方法,shell 將執行作為第三個參數傳遞的命令,讓我們可以使用 exec.Command() 執行 shell 腳本。
處理執行錯誤
處理執行失敗時,exec.Command() 只提供通用的「退出狀態 1」 錯誤訊息。若要取得更詳細的錯誤訊息,請考慮使用 exec.ExitError 類型。此類型提供對命令退出狀態代碼和可選退出訊息的存取。例如:
if err, ok := err.(*exec.ExitError); ok { fmt.Printf("Exit status: %d\n", err.ExitCode()) if err.ExitCode() == 1 { // Handle exit status 1 error here. } }
這允許您處理特定的退出代碼並提供更詳細的錯誤訊息。
以上是如何在 Go 中安全執行複雜的 Shell 命令,包括'sudo”?的詳細內容。更多資訊請關注PHP中文網其他相關文章!