> 백엔드 개발 > Golang > 내 프로그램이 Linux 및 macOS에서 TTY인 척하도록 하려면 어떻게 해야 합니까?

내 프로그램이 Linux 및 macOS에서 TTY인 척하도록 하려면 어떻게 해야 합니까?

Linda Hamilton
풀어 주다: 2024-12-14 06:11:11
원래의
719명이 탐색했습니다.

How Can I Make My Program Pretend to Be a TTY in Linux and macOS?

TTY인 척: 심층 분석

프로그래밍에서 직면하는 일반적인 문제 중 하나는 입력 소스를 차별하는 프로그램을 다루는 것입니다. (stdin과 같은) 터미널(TTY)인지 파이프인지에 따라 결정됩니다. 이 문제를 해결하려면 프로그램이 TTY인 것처럼 가장해야 할 수도 있습니다. 이 기사에서는 주로 Go에 초점을 맞춰 독립 실행형 바이너리 프로그램을 사용하여 Linux와 macOS에서 이를 달성하는 방법을 살펴보겠습니다.

TTY인 척하는 핵심 아이디어는 의사 터미널(또한 pty로 알려져 있음). pty는 일반 터미널처럼 작동하는 가상 터미널이지만 실제로는 한 쌍의 파일 설명자로 구현됩니다. 이러한 파일 설명자 중 하나는 pty에서 입력을 읽는 데 사용되고 다른 하나는 출력을 쓰는 데 사용됩니다.

다음 Go 코드는 pty를 생성하고 그 안에서 명령을 실행하는 방법에 대한 예를 제공합니다. , 출력 캡처:

package main

import (
    "io"
    "log"
    "os"
    "os/exec"
    "runtime"
)

func main() {
    // Get the current operating system.
    osName := runtime.GOOS

    // Create a master pty.
    master, err := os.OpenFile("/dev/ptmx", os.O_RDWR, 0)
    if err != nil {
        log.Fatal(err)
    }

    // Get the slave pty name.
    slaveName, err := ptsname(master)
    if err != nil {
        log.Fatal(err)
    }

    // Fork a child process.
    child, err := os.ForkExec("/bin/sh", []string{"sh", "-c", "ls -la"}, nil, slaveName, master, master)
    if err != nil {
        log.Fatal(err)
    }

    // Close the master pty.
    master.Close()

    // Read output from the slave pty.
    buf := make([]byte, 1024)
    for {
        n, err := os.Read(child, buf)
        if err == io.EOF {
            break
        }
        if err != nil {
            log.Fatal(err)
        }
        if osName == "linux" {
            // Remove carriage return (CR) characters.
            buf = buf[:n-1]
        }
        os.Stdout.Write(buf)
    }

    // Wait for the child process to exit.
    child.Wait()
}
로그인 후 복사

이 코드는 다음을 사용하여 독립 실행형 바이너리로 컴파일될 수 있습니다. 명령:

go build -o ttypretend main.go
로그인 후 복사

컴파일되면 다음과 같이 프로그램을 실행할 수 있습니다.

./ttypretend
로그인 후 복사

현재 디렉토리의 내용이 출력됩니다.

위 내용은 내 프로그램이 Linux 및 macOS에서 TTY인 척하도록 하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿