java - JSch库中SCP协议(protocol)实现说明

标签 java ssh sftp scp jsch

我正在考虑可以在此处找到的 JSch 库使用示例:
http://www.jcraft.com/jsch/examples/ScpFrom.java.html

我无法理解此示例中的几个代码模式。他们在这里:

  1. 有什么理由更喜欢 SCP 而不是 SFTP,后者可以使用相同的库运行?

  2. 为什么我们运行 scp -f <remote file>在远程主机上而不是简单地运行 scp source_file_path destination_file_path ?为什么在远程主机上执行更好?

  3. 在传输的开头有一行

    while(true){
    int c=checkAck(in);
    if(c!='C'){
        break;
    }
    ...
    

    这个神奇的是什么意思C信?为什么 C ?

  4. 为什么要一直发送这个信号?

    // send '\0'
    buf[0]=0; out.write(buf, 0, 1); out.flush();
    
  5. 这如何读取文件大小?

    long filesize=0L;
    while(true){
        if(in.read(buf, 0, 1)<0){
            // error
            break; 
        }
        if(buf[0]==' ')break;
        filesize=filesize*10L+(long)(buf[0]-'0'); //What is this??
    }
    

最佳答案

  1. Is there any reasons to prefer SCP over SFTP, which can be ran using the same library?

不,SCP 协议(protocol)已经过时。现在你应该总是使用 SFTP。

虽然 SFTP 协议(protocol)的简单实现往往比 SCP 传输速度慢(由于其数据包性质,有效地实现 SFTP 传输并不容易)。

  1. Why we run scp -f <remote file> on remote host instead of running simply scp source_file_path destination_file_path? Why execution on remote host is better?

这就是 SCP 协议(protocol)的工作原理。 OpenSSH scp二进制文件既可以作为服务器也可以作为客户端。所以当你运行 scp在本地,它通过 SSH 连接并运行 scp在服务器上。然后这两个实例相互通信。 JSch 替换了 scp 的本地实例.但它仍然需要远程实例来完成传输。

如果您正在运行 scp在本地,您必须在机器上安装 OpenSSH。什么在 Unix 上可能很常见,但在 Windows 上绝对不是。此外,没有简单/标准化的方法来从 scp 中捕获结果。程序,将它们翻译成 JSch Java 接口(interface)。这与 JSch(或任何其他 SFTP 库)自行实现 SFTP 协议(protocol)而不是使用 sftp 的原因相同。程序。

  1. what is the meaning of this magical C letter? Why C?

SCP 协议(protocol)的每个命令都由一个字符标识。 C代表“文件传输”,D代表“目录传输”,T文件传输前表示下一个传输文件的修改时间等。我不知道为什么它是C而不是例如F .

  1. Why to send this signal all the time?

NULL ( \0 ) 字符命令是对接收命令已完成的其他站点的确认/响应。

  1. how this can read filesize?

C命令具有语法(这是一个人类可读的字符串):

C permissions size filename

例如:

C 0644 153634 index.php

代码中的循环翻译字符串 "153634"到数字 153634。它的实现看起来有点过于复杂,但它确实有效。


另见 How is SCP (secure copy protocol) file transfer working?

关于java - JSch库中SCP协议(protocol)实现说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26220381/

相关文章:

macos - 以最方便的方式进行 SSH,无需每次都输入 ssh 命令

python - 使用 Paramiko 在远程机器上执行命令无效

visual-studio-code - 带有 sftp 插件上传的 Visual Studio Code 忽略了 .git 文件夹和 .gitignore 文件

java - 将 .txt 文件导出到 sFTP 服务器后,换行符不起作用

java.io.IOException - IO 流读取结束

java - Java中的队列/链表序列化

java - 如何在没有警告的情况下创建 JavaFX TableView?

Java如何在 map 中存储 setter/getter

java - 使用二维数组熄灯游戏

git - 在 hooks 中使用 SmartGit 的 SSH 客户端