63 lines
1.3 KiB
Go
63 lines
1.3 KiB
Go
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
|
|
}
|