
在Go语言开发中,有时候我们可能会遇到从"HijackedResponse"中删除光标位置的ANSI转义代码的需求。这些转义代码通常用于在终端上展示彩色文本或者控制光标位置,但是在某些情况下,我们可能需要将其删除。本文将介绍如何通过使用Go语言的字符串操作函数以及正则表达式,从"HijackedResponse"中删除这些ANSI转义代码。无论您是Go语言初学者还是有一定经验的开发者,本文都将帮助您解决这一问题。
我正在尝试使用 go 执行(交互)一个 docker 容器。 这是我正在使用的代码:
func (docker *docker) redirectresponsetooutputstream(outputstream, errorstream io.writer, resp io.reader) error {
_, err := stdcopy.stdcopy(outputstream, errorstream, resp)
return err
}
func (docker *docker) holdhijackedconnection(inputstream io.reader, outputstream, errorstream io.writer, resp types.hijackedresponse) error {
receivestdout := make(chan error)
if outputstream != nil || errorstream != nil {
go func() {
receivestdout <- docker.redirectresponsetooutputstream(outputstream, errorstream, resp.reader)
}()
}
stdindone := make(chan struct{})
go func() {
if inputstream != nil {
io.copy(resp.conn, inputstream)
}
resp.closewrite()
close(stdindone)
}()
select {
case err := <-receivestdout:
return err
case <-stdindone:
if outputstream != nil || errorstream != nil {
return <-receivestdout
}
}
return nil
}
...并在此处调用 holdhijackedconnection:
func (docker *Docker) ContainerExec(ctx context.Context, container *injection.Container) error {
createResponse, err := docker.client.ContainerExecCreate(ctx, container.ID, types.ExecConfig{
AttachStdout: true,
AttachStderr: true,
AttachStdin: true,
Detach: true,
Tty: true,
Cmd: []string{"sh"},
})
if err != nil {
return err
}
stream, err := docker.client.ContainerExecAttach(ctx, createResponse.ID, types.ExecStartCheck{})
if err != nil {
return err
}
defer stream.Close()
docker.holdHijackedConnection(os.Stdin, os.Stdout, os.Stderr, stream)
return nil
}
一些注意事项:
sh 是必需的,它是高山图像injection.container 只是保存有关容器的信息,它是一个自定义结构体docker 是一个结构体,用于保存 docker 客户端(来自 github.com/docker/docker/client 的 client 的实例)如果我执行我的应用程序,我得到的 cli 结果是这样的:
/usr/app $ ^[[43;12r
Easily find JSON paths within JSON objects using our intuitive Json Path Finder
193
据我所知,^[[43;12r 是光标位置的 ansi 转义码。
我可以执行命令,例如 ls 或 npm i 等,但我总是找回这些 ansi 转义码。
我的问题是,有没有办法从标准输出中删除它们?
我最终发现了。
问题是,我应该使用 github.com/docker/cli/cli/command 包及其 dockercli 而不是 os.std...。这可以通过设置输出、错误和输入流来为我管理这个问题,如下所示:
func (docker *Docker) holdHijackedConnection(resp types.HijackedResponse) error {
cli, _ := command.NewDockerCli()
outputStream := cli.Out()
errorStream := cli.Err()
inputStream := cli.In()
inputStream.SetRawTerminal()
defer inputStream.RestoreTerminal()
receiveStdout := make(chan error)
if outputStream != nil || errorStream != nil {
go func() {
receiveStdout <- docker.redirectResponseToOutputStream(outputStream, errorStream, resp.Reader)
}()
}
stdinDone := make(chan struct{})
go func() {
if inputStream != nil {
io.Copy(resp.Conn, inputStream)
}
resp.CloseWrite()
close(stdinDone)
}()
select {
case err := <-receiveStdout:
return err
case <-stdinDone:
if outputStream != nil || errorStream != nil {
return <-receiveStdout
}
}
return nil
}如果要添加ctrl+c转义,需要在containerexeccreate处的execconfig中设置detachkeys。否则执行 exit 将分离它。
以上就是如何从 Go 中的“HijackedResponse”中删除光标位置 ANSI 转义代码?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号