You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Golang调用lxd-p2c时如何向term.ReadPassword读取的输入传递密码

根因说明

lxd-p2c读取密码用的term.ReadPassword(0)底层不会读取普通标准输入管道,而是直接读取进程绑定的伪终端(PTY)输入流,你之前使用的Stdin重定向、StdinPipe写入的方案都是针对普通标准输入设计的,无法适配PTY读取场景,因此会失效。

可行解决方案

方案1:Go代码中为子进程分配PTY(推荐,无需修改上游源码)

使用Go PTY操作库为lxd-p2c进程分配伪终端,将密码写入PTY即可完成自动输入,示例代码如下:

package main

import (
	"io"
	"os/exec"

	"github.com/creack/pty"
)

func main() {
	// 替换为实际的lxd-p2c路径和执行参数
	cmd := exec.Command("./lxd-p2c", "your_args_here")
	// 为子进程启动绑定PTY
	ptmx, err := pty.Start(cmd)
	if err != nil {
		panic(err)
	}
	defer ptmx.Close()

	// 写入密码,末尾必须加换行符模拟回车确认操作
	_, err = io.WriteString(ptmx, "your_password\n")
	if err != nil {
		panic(err)
	}

	// 等待进程执行完成
	if err = cmd.Wait(); err != nil {
		panic(err)
	}
}

该方案不需要修改lxd-p2c源码,可以直接适配上游官方版本,也支持处理多轮交互场景。

方案2:修改lxd-p2c源码读取逻辑

也就是你当前使用的临时方案,删除源码中的term.ReadPassword(0)逻辑,改为从环境变量、命令行参数或者普通标准输入读取密码,该方案需要自行维护编译后的二进制文件,不适合需要跟进上游版本更新的场景。

方案3:通过expect脚本封装调用

如果你不想在Go代码中引入第三方PTY依赖,可以编写expect脚本封装lxd-p2c的密码输入逻辑,再在Go代码中直接调用该expect脚本即可,适合快速验证的场景。

内容的提问来源于stack exchange,提问作者wineinlib

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 01:54:02