在显示目录列表时,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_STAT
和 SSH_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
当您使用 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_STAT
和 SSH_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