-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdd_freebsd.go
45 lines (41 loc) · 1.12 KB
/
dd_freebsd.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//go:build freebsd
// +build freebsd
package dd
import (
"fmt"
"os"
"os/exec"
"strings"
)
// GetDD 返回适用于当前系统的 dd 命令字符串(带不带 sudo)和临时文件路径(用于清理)
func GetDD() (ddCmd string, tempFile string, err error) {
// 优先尝试 sudo dd 是否可用
if path, err := exec.LookPath("dd"); err == nil {
testCmd := exec.Command("sudo", path, "--help")
if err := testCmd.Run(); err == nil {
return "sudo dd", "", nil
}
// 如果 sudo dd 不可用,则尝试直接使用 dd
testCmd = exec.Command(path, "--help")
if err := testCmd.Run(); err == nil {
return "dd", "", nil
}
}
return "", "", fmt.Errorf("无法找到可用的 dd 命令")
}
// ExecuteDD 执行 dd 命令
func ExecuteDD(ddPath string, args []string) error {
var cmd *exec.Cmd
if ddPath == "dd" {
// 使用系统 dd
cmd = exec.Command(ddPath, args...)
} else {
// 使用提取的 coreutils dd
ddCmd := fmt.Sprintf("%s dd %s", ddPath, strings.Join(args, " "))
cmd = exec.Command("sh", "-c", ddCmd)
}
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
return cmd.Run()
}