如何解决Golang SFTP 目录观察器执行 Lstat 失败
我有一个极其罕见的错误,在为远程目录 (SFTP) 实施观察程序时,它在尝试执行 Lstat 命令时给我一个系统调用错误。
错误如下:
golang.org/x/sys/unix.ENOENT (2)
lstat /home/user/directory: no such file or directory
这是给出错误的行:
_,_,e1 := syscall(funcPC(libc_lstat64_trampoline),uintptr(unsafe.Pointer(_p0)),uintptr(unsafe.Pointer(stat)),0)
观看的目录路径为/home/user/directory,实现如下:
SFTP 连接
func StartSFTPConnection() *sftp.Client {
// SFTP connection data
host := os.Getenv("FTP_HOST")
port := os.Getenv("FTP_PORT")
user := os.Getenv("FTP_USER")
pass := os.Getenv("FTP_PASSWORD")
hostKey := getHostKey(host)
if _,err := fmt.Fprintf(os.Stdout,"Connecting to %s ...\n",host); err != nil {
log.Fatal(err)
}
var auths []ssh.AuthMethod
// Try to use $SSH_AUTH_SOCK which contains the path of the unix file socket that the sshd agent uses
// for communication with other processes.
if aconn,err := net.Dial("unix",os.Getenv("SSH_AUTH_SOCK")); err == nil {
auths = append(auths,ssh.PublicKeysCallback(agent.NewClient(aconn).Signers))
}
// Use password authentication if provided
if pass != "" {
auths = append(auths,ssh.Password(pass))
}
// Initialize client configuration
config := ssh.ClientConfig{
User: user,Auth: auths,HostKeyCallback: ssh.FixedHostKey(hostKey),}
addr := fmt.Sprintf("%s:%s",host,port)
// Connect to server
conn,err := ssh.Dial("tcp",addr,&config)
if err != nil {
if _,err := fmt.Fprintf(os.Stderr,"Failed to connecto to [%s]: %v\n",err); err != nil {
log.Fatal(err)
}
}
// Create new SFTP client
sc,err := sftp.NewClient(conn)
if err != nil {
if _,"Unable to start SFTP subsystem: %v\n",err); err != nil {
log.Fatal(err)
}
}
return sc
}
观察者
// FileWatcher checks for new files in a folder
func FileWatcher() (err error) {
var sc = sftp2.StartSFTPConnection()
watcher,_ = fsnotify.NewWatcher()
defer func(watcher *fsnotify.Watcher) {
if err := watcher.Close(); err != nil {
log.Fatal(err)
}
}(watcher)
wk := sc.Walk(os.Getenv("WATCH_DIR"))
for wk.Step() {
if wk.Err() != nil {
continue
}
if err := watchDir(wk.Path(),wk.Stat()); err != nil {
fmt.Println("There are some errors in FTP Watcher.")
}
}
done := make(chan bool)
// watch for changes in folder
go func() {
for {
select {
// watch for events
case event := <-watcher.Events:
fmt.Printf("New file added in `WATCH` path. Event %#v.\n",event.Op)
switch {
case event.Op&fsnotify.Write == fsnotify.Write:
fmt.Printf("Write: %s: %s",event.Op,event.Name)
case event.Op&fsnotify.Create == fsnotify.Create:
fmt.Printf("Create: %s: %s",event.Name)
parser.FileParser(event.Name)
case event.Op&fsnotify.Remove == fsnotify.Remove:
fmt.Printf("Remove: %s: %s",event.Name)
case event.Op&fsnotify.Rename == fsnotify.Rename:
fmt.Printf("Rename: %s: %s",event.Name)
case event.Op&fsnotify.Chmod == fsnotify.Chmod:
fmt.Printf("Chmod: %s: %s",event.Name)
}
// watch for errors
case err := <-watcher.Errors:
fmt.Println(err)
}
}
}()
<-done
// return
return nil
}
// watchDir gets run as a walk func,searching for directories to add watchers to
func watchDir(path string,fi os.FileInfo) error {
// since fsnotify can watch all the files in a directory,watchers only need to be added to each nested directory
if fi.Mode().IsDir() {
return watcher.Add(path)
}
return nil
}
可能有什么问题?此外,该目录是普通目录,而不是符号链接。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。