package main import ( "fmt" "log" "os" "os/signal" "path/filepath" "syscall" "time" "github.com/fsnotify/fsnotify" ) const ( utmpDir = "/dev/pts/" // ANSI转义序列定义颜色 colorReset = "\033[0m" colorRed = "\033[31m" colorGreen = "\033[32m" colorYellow = "\033[33m" colorBlue = "\033[34m" colorPurple = "\033[35m" colorCyan = "\033[36m" colorWhite = "\033[37m" // 样式 bold = "\033[1m" underline = "\033[4m" ) func main() { logFile, err := os.OpenFile("./welcome-service.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) if err != nil { log.Fatal(err) } defer logFile.Close() log.SetOutput(logFile) watcher, err := fsnotify.NewWatcher() if err != nil { log.Fatal(err) } defer watcher.Close() err = watcher.Add(utmpDir) if err != nil { log.Fatal(err) } sigChan := make(chan os.Signal, 1) signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM) checkExistingTerminals() log.Println("Service started") for { select { case event, ok := <-watcher.Events: if !ok { return } if event.Op&fsnotify.Create == fsnotify.Create { go handleNewTerminal(event.Name) } case err, ok := <-watcher.Errors: if !ok { return } log.Printf("Watcher error: %v", err) case sig := <-sigChan: log.Printf("Received signal: %v", sig) return } } } func checkExistingTerminals() { entries, err := os.ReadDir(utmpDir) if err != nil { log.Printf("Error reading %s: %v", utmpDir, err) return } for _, entry := range entries { if !entry.IsDir() { go handleNewTerminal(filepath.Join(utmpDir, entry.Name())) } } } func handleNewTerminal(path string) { time.Sleep(time.Second) f, err := os.OpenFile(path, os.O_WRONLY, 0) if err != nil { log.Printf("Error opening terminal %s: %v", path, err) return } defer f.Close() // 使用颜色和样式的欢迎信息 welcomeMsg := fmt.Sprintf(` %s%s╔════════════════════════════════════════════╗%s %s%s║ Welcome to the System! ║%s %s%s║---------------------------------------- ║%s %s%s║ Terminal: %s%s%-30s%s ║%s %s%s║ Time: %s%s%-35s%s ║%s %s%s╚════════════════════════════════════════════╝%s `, bold, colorCyan, colorReset, bold, colorCyan, colorReset, bold, colorCyan, colorReset, bold, colorCyan, colorGreen, underline, path, colorCyan, colorReset, bold, colorCyan, colorYellow, underline, time.Now().Format("2006-01-02 15:04:05"), colorCyan, colorReset, bold, colorCyan, colorReset, ) // 写入欢迎信息 _, err = f.WriteString(welcomeMsg) if err != nil { log.Printf("Error writing to terminal %s: %v", path, err) return } // 模拟按下回车键 _, err = f.Write([]byte{'\n'}) if err != nil { log.Printf("Error sending newline to terminal %s: %v", path, err) return } log.Printf("Welcome message sent to %s", path) }