0

所以我正在阅读nlstNET::FTP 模块(ruby-1.8.6)中方法的文档。显示的源代码是

# File net/ftp.rb, line 602
def nlst(dir = nil)
  cmd = "NLST"
  if dir
    cmd = cmd + " " + dir
  end
  files = []
  retrlines(cmd) do |line|
    files.push(line)
  end
  return files
end

所以命令是按字面意思写在字符串中的cmd,通过执行retrlines并返回文件列表,对吗?

我不明白的是,在我的 windows ftp 服务器上没有这样的命令:

230 User logged in.
Remote system type is Windows_NT.
ftp> nlst
?Invalid command
ftp> 

然而该方法返回文件列表。这怎么可能?源代码似乎对命令没有某种抽象,而且 retrlines 的源代码也没有任何特别之处(对我而言)。

# File lib/net/ftp.rb, line 475
    def retrlines(cmd) # :yield: line
      synchronize do
        with_binary(false) do
          conn = transfercmd(cmd)
          loop do
            line = conn.gets
            break if line == nil
            yield(line.sub(/\r?\n\z/, ""), !line.match(/\n\z/).nil?)
          end
          conn.close
          voidresp
        end
      end
    end

我追溯了sendcmd内部调用的方法,transfercmd但我真的不知道。

4

1 回答 1

3

问题是谁在告诉你?Invalid command

在这种情况下,它是 FTP客户端,而不是服务器。

客户端只是它实现的命令的前端,将这些前端命令转换为服务器的正确 FTP 协议命令字符串。

您正在寻找的是客户端中的nlist(not nlst) 命令,它将NLST向服务器发出 FTP 协议命令。

ftp> help nlst
?Invalid help command nlst
ftp> help nlist
nlist           nlist contents of remote directory
ftp>
于 2012-07-04T12:08:14.917 回答