【问题标题】:How to return the system type in an SFTP?如何在 SFTP 中返回系统类型?
【发布时间】:2018-03-22 02:02:01
【问题描述】:

FTP 和 SFTP 是不同的,但我想知道 FTP 中是否有等效于 SFTP 的“SYST”命令。如果我有一个使用 JSch 的 SFTP 连接并且我想返回系统类型,我该怎么做?我正在将 FTP 连接转换为 SFTP。如果无法使用 SFTP,是否有解决方法?

public String getSystemType()
        throws IOException, FtpException
{
    if(out == null)
        return null;
    acquire();    // Acquire the object

    try {
        ftpCommand("SYST");             //sends command to FTP to retrieve the system type.
        if(!reply.substring(0, 3).equals("215"))
            throw new FtpException(reply);
    } finally { 
        release();    // Release the object
    }

    return reply.substring(4);
}

我需要这种“系统类型”来解析来自某个位置的文件或目录信息的结果。它可以是 Windows 服务器或 UNIX 服务器。根据我需要解析它来检索

1) 名称
* 2) 权限..在 MSDOS 格式列表中不可用
* 3) 类型
* 4) Owner ..在 MSDOS 格式列表中不可用
* 5) Group ..在 MSDOS 格式列表中不可用
* 6) 尺寸

* Parse a UNIX format list. With skipping number of lines.
     * The columns of a typical UNIX format list is like:
     * drwxr-xr-x   6 appli    appli        1024 May 17 20:33 java
     * -rw-------   1 appli    appli        1005 May  1 21:21 mp3list
     * drwxr-xr-x   5 appli    appli        1024 May 17 16:56 perl
     * drwxr-xr-x   6 appli    appli        1024 Apr 30 23:18 public_html

// Some UNIX format list doesn't contain the column for group like this:
            // -rw-r--r--   1 daemon         0 Dec  7 10:15 .notar
            // -r--r--r--   1 daemon       828 Mar 30  1995 HOW_TO_SUBMIT
            // -r--r--r--   1 daemon       627 Mar 30  1995 README
            // -r--r--r--   1 daemon       876 Mar 30  1995 WELCOME
            // drwxr-xr-x   2 ftp          512 Oct 13  1999 bin

【问题讨论】:

  • 您真的需要那种系统类型,还是只是提供信息?你可以用一些虚拟文本替换返回值并且它仍然可以工作吗?因为依赖于远程服务器系统描述的代码对我来说似乎有点脆弱。
  • @cello 还有另一个函数,它执行“LIST”以返回有关文件或目录的信息。它用于解析返回字符串,我在旧的 FTP 类中有一个方法,它可以验证它是 UNIX 格式还是 MS-DOS 格式。我不确定 SFTP 中是否需要这样做。我只是试图保持方法不变,只将其中的进程转换为 SFTP。
  • 我不明白您的编辑(关于解析有关文件或目录的信息)与您的问题有什么关系。
  • @MartinPrikryl 我的意思是,根据系统类型,我会以不同的方式解析数据,因为每个系统发送文件和目录信息的方式略有不同。我会确定它是哪个系统,所以如果是 UNIX,那么我知道它有 9 列,如果是 Windows,那么只能从中获得 3 列,名称、类型和大小。

标签: java ssh ftp sftp jsch


【解决方案1】:

部署最广泛的 SFTP 服务器是 server 包含在 OpenSSH 中。它实现了version 3 draft 2。 Jsch 还实现了该版本的 SFTP。

FTP SYST 命令返回一个描述服务器系统类型的字符串。 Sftp 版本 3 草案 2 没有实现我可以看到的 FTP SYST 命令之类的任何东西。没有返回服务器操作系统或一组功能的命令。

如果不知道您为什么需要这些信息,就不可能说出如何解决这个问题。

【讨论】:

    【解决方案2】:

    您可以使用 SSH 版本字符串。

    是这样的:

    • SSH-2.0-OpenSSH_5.3
    • SSH-2.0-7.34 FlowSsh:Bitvise SSH 服务器 (WinSSHD) 7.34
    • SSH-2.0-1.36_sshlib GlobalSCAPE
    • SSH-2.0-mod_sftp/0.9.8

    在 JSch 中,您可以使用 Session.getServerVersion 检索它。


    SFTP 本身仅使用optional extension "vendor-id" 提供有关远程系统的信息,这很少得到支持。 JSch 本身和最广泛的 SFTP 服务器实现 OpenSSH 绝对不支持它。


    虽然请注意,使用 SFTP,您通常不需要解析目录列表。在 SFTP 中,大多数列表数据以二进制结构的形式出现,而不是像 FTP 那样的文本列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-02
      • 2013-06-05
      • 2021-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-23
      相关资源
      最近更新 更多