diff --git a/pkg/agent/config/config.go b/pkg/agent/config/config.go index b919356..d911b95 100644 --- a/pkg/agent/config/config.go +++ b/pkg/agent/config/config.go @@ -9,6 +9,7 @@ import ( "runtime" "time" + "github.com/dushixiang/pika/pkg/agent/utils" "gopkg.in/yaml.v3" ) @@ -107,10 +108,7 @@ func DefaultConfig() *Config { // GetDefaultConfigPath 获取默认配置文件路径 func GetDefaultConfigPath() string { - homeDir, err := os.UserHomeDir() - if err != nil { - homeDir = "." - } + var homeDir = utils.GetSafeHomeDir() return filepath.Join(homeDir, ".pika", "agent.yaml") } diff --git a/pkg/agent/id/id.go b/pkg/agent/id/id.go index 81ac6fc..b4d3032 100644 --- a/pkg/agent/id/id.go +++ b/pkg/agent/id/id.go @@ -6,6 +6,7 @@ import ( "path/filepath" "strings" + "github.com/dushixiang/pika/pkg/agent/utils" "github.com/google/uuid" ) @@ -24,12 +25,7 @@ func NewManager() *Manager { // getIDFilePath 获取 ID 文件路径 func getIDFilePath() string { // 获取用户主目录 - homeDir, err := os.UserHomeDir() - if err != nil { - // 如果无法获取主目录,使用当前目录 - homeDir = "." - } - + var homeDir = utils.GetSafeHomeDir() // 统一使用 ~/.pika/agent.id return filepath.Join(homeDir, ".pika", "agent.id") } diff --git a/pkg/agent/utils/homedir.go b/pkg/agent/utils/homedir.go new file mode 100644 index 0000000..03ad987 --- /dev/null +++ b/pkg/agent/utils/homedir.go @@ -0,0 +1,34 @@ +package utils + +import ( + "os" + "os/user" +) + +func GetSafeHomeDir() string { + // 1. 尝试从环境变量拿(最快,符合大多数 Unix/Windows 惯例) + if h, err := os.UserHomeDir(); err == nil && h != "" { + return h + } + + // 2. 尝试从系统底层数据库拿(绕过环境变量,直接看 /etc/passwd) + if u, err := user.Current(); err == nil && u.HomeDir != "" { + return u.HomeDir + } + + // 3. 特殊环境兜底(针对 OpenWrt/嵌入式等 root 为主的系统) + // 如果是 root 权限运行但没设家目录,通常就是 /root + if os.Getuid() == 0 { + if _, err := os.Stat("/root"); err == nil { + return "/root" + } + } + + // 4. 极端情况兜底:使用当前程序运行目录或临时目录 + // 保证程序至少能跑起来,而不是直接 panic 或报错退出 + if pwd, err := os.Getwd(); err == nil { + return pwd + } + + return "./" +}