summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Carr <[email protected]>2025-02-12 15:11:29 -0600
committerJeff Carr <[email protected]>2025-02-12 15:11:29 -0600
commitd70cf82ecc02c5be472c87e2923fab7188f2cdbd (patch)
treec9c2a1c929e4eb965fe1edcb898159dd7bec3711
parent364d666eb6918ac30eae6379ae18fa91879de459 (diff)
sudo with pseudo ttyv0.22.25
-rw-r--r--exec.go56
1 files changed, 56 insertions, 0 deletions
diff --git a/exec.go b/exec.go
index 0bedf1b..c5fb298 100644
--- a/exec.go
+++ b/exec.go
@@ -2,8 +2,10 @@ package shell
import (
"errors"
+ "fmt"
"os"
"os/exec"
+ "syscall"
"go.wit.com/log"
)
@@ -46,3 +48,57 @@ func ExecCheck(args []string) error {
// log.Info("ExecCheck() nil")
return nil
}
+
+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
+}