gpt4 book ai didi

linux - 从Golang更改Linux用户密码无效

转载 作者:行者123 更新时间:2023-12-01 21:17:21 25 4
gpt4 key购买 nike

我需要从go例程中获取一个代码来更改linux中用户的密码。
从命令行运行的命令:

      echo 'pgc:password' | sudo chpasswd  //"pgc" is the username and "password" 
// is the password I'm changing it to.
但这在我的Go程序中不起作用。我尝试用其他单行命令代替,例如:
drm file.txt,触摸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上找到了一些类似的示例,但是我使用的是在那找到的解决方案,但它没有用。

最佳答案

documentation说“使用给定的参数执行命名程序”。甚至有一个特定的段落:

Unlike the "system" library call from C and other languages, the os/exec package intentionally does not invoke the system shell and does not expand any glob patterns or handle other expansions, pipelines, or redirections typically done by shells.


因此,问题中的代码将使用参数 echo'pgc:password'|sudo执行 chpasswd。这是成功的,因为 echo可以完全打印出这四个字符串。
解决方案是直接启动 chpasswd并写入其标准输入。这是一个最小的示例:
func main() {
cmd := exec.Command("chpasswd")
stdin, err := cmd.StdinPipe()
io.WriteString(stdin, "pgc:password")
}
我建议调整官方 example中显示的代码,以通过错误检查来获得安全代码。
您也可以使用 sudo chpasswd代替 chpasswd。请记住,在这种情况下 sudo将无法要求输入密码。一种解决方法是在适当的地方使用NOPASSWD配置sudoer。

关于linux - 从Golang更改Linux用户密码无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64059115/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com