Maison > développement back-end > Golang > Comment puis-je faire en sorte que mon programme se fasse passer pour un ATS sous Linux et macOS ?

Comment puis-je faire en sorte que mon programme se fasse passer pour un ATS sous Linux et macOS ?

Linda Hamilton
Libérer: 2024-12-14 06:11:11
original
721 Les gens l'ont consulté

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

Faire semblant d'être un ATS : une plongée plus approfondie

L'un des défis courants rencontrés en programmation est de gérer des programmes qui discriminent les sources d'entrée (comme stdin) selon qu'il s'agit d'un terminal (TTY) ou d'un tube. Pour résoudre ce problème, vous devrez peut-être faire en sorte que votre programme se fasse passer pour un ATS. Dans cet article, nous explorerons comment y parvenir sous Linux et macOS à l'aide de programmes binaires autonomes, en nous concentrant principalement sur Go.

L'idée clé derrière le fait de se faire passer pour un TTY est de créer un pseudo-terminal (également connu sous le nom de PTY). Un pty est un terminal virtuel qui agit comme un terminal ordinaire, mais il est en réalité implémenté sous la forme d'une paire de descripteurs de fichiers. L'un de ces descripteurs de fichier est utilisé pour lire les entrées du pty, tandis que l'autre est utilisé pour y écrire la sortie.

Le code Go suivant fournit un exemple de la façon de créer un pty et d'exécuter une commande à l'intérieur. , capturant sa sortie :

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()
}
Copier après la connexion

Ce code peut être compilé en un binaire autonome à l'aide de la commande suivante :

go build -o ttypretend main.go
Copier après la connexion

Une fois compilé, vous pouvez exécutez le programme comme suit :

./ttypretend
Copier après la connexion

Et il affichera le contenu du répertoire actuel.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal