在显示目录列表时,WinSCP 如何知道符号链接链接到什么?

How does WinSCP know what a symlink links to when showing directory listings?

当您使用 WinSCP 连接到包含符号链接的目录时,它会使用略有不同的图标向您显示它是一个符号链接。例如。而不仅仅是一个文件夹,它将是一个带有箭头或类似内容的文件夹。

我的问题是...WinSCP 如何知道符号链接是文件夹的符号链接?

当您通过 SFTP 进入目录时,客户端会发送一个 SSH_FXP_READDIR 数据包。服务器响应 SSH_FXP_NAME 数据包。在我的测试中,这个数据包中的数据似乎对应于 lstat - 而不是 stat。 IE。如果您使用 1111 0000 0000 0000 和权限属性,您将获得 1010 0000 0000 0000(符号链接)而不是 0100 0000 0000 0000(目录)。

我的猜测是 WinSCP 然后为这些符号链接中的每一个发送一个 SSH_FXP_STAT,但也许它正在执行 SSH_FXP_READLINK。如果是后者,服务器将以 SSH_FXP_NAME 响应 - 如果是前者,服务器将以 SSH_FXP_ATTRS 响应(对于一个文件而不是 x 个文件,这几乎是一个 SSH_FXP_NAME )。但话又说回来,也许它完全在做其他事情。

记得 WinSCP 使用 PuTTY,我试图通过使用 PuTTY 创建一个会话来查看它在做什么,该会话将 "Session logging" 设置为 "SSH packets"。然后我尝试使用 WinSCP 连接到该会话,但没有创建 putty.log 文件。我没有在最初 运行 PuTTY 更新会话的目录中看到它,也没有在 C:\Program Files (x86)\WinSCP 中看到它。所以我不知道它在哪里。

有什么想法吗?

WinSCP 发送 SSH_FXP_STATSSH_FXP_READLINK

SSH_FXP_STAT查找,如果symlink指向文件或目录。

SSH_FXP_READLINK找出link目标。


参见WinSCP log

. 2015-07-20 11:00:15.837 Listing directory "...".
> 2015-07-20 11:00:15.837 Type: SSH_FXP_OPENDIR, Size: 53, Number: 11275
< 2015-07-20 11:00:15.894 Type: SSH_FXP_HANDLE, Size: 13, Number: 11275
> 2015-07-20 11:00:15.894 Type: SSH_FXP_READDIR, Size: 13, Number: 11532
< 2015-07-20 11:00:15.950 Type: SSH_FXP_NAME, Size: 431, Number: 11532
> 2015-07-20 11:00:15.950 Type: SSH_FXP_READDIR, Size: 13, Number: 11788
. 2015-07-20 11:00:15.950 Reading symlink "link".
> 2015-07-20 11:00:15.950 Type: SSH_FXP_READLINK, Size: 58, Number: 12051
> 2015-07-20 11:00:15.950 Type: SSH_FXP_STAT, Size: 58, Number: 12305
< 2015-07-20 11:00:16.005 Type: SSH_FXP_STATUS, Size: 28, Number: 11788
. 2015-07-20 11:00:16.005 Storing reserved response
< 2015-07-20 11:00:16.062 Type: SSH_FXP_NAME, Size: 41, Number: 12051
. 2015-07-20 11:00:16.062 Link resolved to "target.txt".
< 2015-07-20 11:00:16.062 Type: SSH_FXP_ATTRS, Size: 37, Number: 12305
< 2015-07-20 11:00:16.063 Status code: 1
> 2015-07-20 11:00:16.063 Type: SSH_FXP_CLOSE, Size: 13, Number: 12548