2 回答

TA貢獻1801條經驗 獲得超8個贊
文檔說“使用給定的參數執行命名程序”。甚至還有一個特定的段落:
與來自 C 和其他語言的“系統”庫調用不同,os/exec 包有意不調用系統 shell,也不擴展任何 glob 模式或處理通常由 shell 完成的其他擴展、管道或重定向。
因此問題中的代碼echo使用參數'pgc:password'、|、sudo和執行chpasswd。這是成功的,因為echo可以完全打印這四個字符串。
解決方案是chpasswd直接啟動并寫入其標準輸入。這是一個最小的例子:
func main() {
cmd := exec.Command("chpasswd")
stdin, err := cmd.StdinPipe()
io.WriteString(stdin, "pgc:password")
}
我建議將官方示例中顯示的代碼調整為帶有錯誤檢查的安全代碼。
您也可以使用sudo chpasswd代替chpasswd. 請記住,sudo在這種情況下將無法要求輸入密碼。一種解決方法是在適當的情況下使用 NOPASSWD 配置 sudoers。

TA貢獻1841條經驗 獲得超3個贊
謝謝赫爾曼。我的誤解有點微妙。我花了很長時間試圖得到你引導我工作的例子。直到一位同事建議我在參數傳遞給命令后拋出一個 \n ,它才最終起作用。
所以有效的代碼(基本上是那個標準輸入的例子,有一點改變):
cmd := exec.Command("sudo", "chpasswd")
stdin, err := cmd.StdinPipe()
if err != nil {
log.Fatal(err)
}
go func() {
defer stdin.Close()
io.WriteString(stdin, "pgc:password\n")
}()
out, err := cmd.CombinedOutput()
if err != nil {
log.Fatal(err)
}
- 2 回答
- 0 關注
- 278 瀏覽
添加回答
舉報