亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從 Golang 更改 linux 用戶密碼不起作用

從 Golang 更改 linux 用戶密碼不起作用

Go
料青山看我應如是 2022-07-04 10:41:31
我需要一個 goroutine 內部的單行代碼來更改 linux 中的用戶密碼。從命令行運行的命令:      echo 'pgc:password' | sudo chpasswd  //"pgc" is the username and "password"                                            // is the password I'm changing it to. 但這不適用于我的 Go 程序。我嘗試過替換其他單行命令,例如:drm file.txt、touch file.txt 等。這些都有效。Go 程序位于一個大項目的一個包中,但我現在只是嘗試直接從命令行運行它(不用作函數,而是一個獨立的 .go 文件)。我的代碼:    //I have tried changing back and forth between the package that changesystempassword.go is in     // and main, but that has no effect    package main //one-liners DON'T WORK if package is the package this go file is in    import (        "fmt"        "os/exec"        //"time"    )    func main() {        err := exec.Command("echo", "'pgc:password'", "|", "sudo", "chpasswd).Run()        //time.sleep(time.Second) - tried adding a sleep so it would have time?        if err != nil {            fmt.Println("Password change unsuccessful"        } else {            fmt.Println("Password change successful")        }    }程序運行時的結果(命令行中的./changesystempassword)是命令行顯示“密碼更改成功”。但猜猜怎么了。它沒有改變。我在網上和 Stack Exchange 上找到了一些類似的示例,但我使用的是在那里找到的解決方案,但它不起作用。
查看完整描述

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。


查看完整回答
反對 回復 2022-07-04
?
偶然的你

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)

}


查看完整回答
反對 回復 2022-07-04
  • 2 回答
  • 0 關注
  • 278 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號