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
|
||
|
}
|