package shell import ( "fmt" "os" "os/exec" "syscall" ) func SudoRaw(c []string) { args := []string{"-S"} args = append(args, c...) cmd := exec.Command("sudo", args...) // Assign the current process's standard input, output, and error cmd.Stderr = os.Stderr cmd.Stdout = os.Stdout cmd.Stdin = os.Stdin // Ensure the process has a terminal session cmd.SysProcAttr = &syscall.SysProcAttr{ Setsid: true, // Start a new session } err := cmd.Run() if err != nil { fmt.Println("Command execution failed:", err) } } func Sudo(c []string) error { args := []string{"-S"} // args := []string{} args = append(args, c...) cmd := exec.Command("sudo", args...) // Open the terminal device directly to preserve input/output control tty, err := os.OpenFile("/dev/tty", os.O_RDWR, 0) if err != nil { fmt.Println("Failed to open /dev/tty:", err) return err } defer tty.Close() // Assign the TTY explicitly cmd.Stdin = tty cmd.Stdout = tty cmd.Stderr = tty // Ensure the new process gets its own session cmd.SysProcAttr = &syscall.SysProcAttr{ Setsid: true, // Start a new session } // Run the command if err := cmd.Run(); err != nil { fmt.Println("Command execution failed:", err) } fmt.Println("\nProcess finished. TTY restored.") return nil }