JSch库中SCP协议实现的说明

时间:2014-10-06 16:14:15

标签: java ssh sftp scp jsch

我正在考虑JSch库使用的一个例子,可以在这里找到:
http://www.jcraft.com/jsch/examples/ScpFrom.java.html

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

  1. 是否有理由偏爱SF而不是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 个答案:

答案 0 :(得分:10)

  
      
  1. 是否有任何理由偏爱SF而不是SFTP,可以使用相同的库运行?
  2.   

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

尽管SFTP协议的简单实现往往比SCP具有更慢的传输(由于其数据包性质,它不容易有效地实现SFTP传输)。

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

SCP协议的工作原理。 OpenSSH scp二进制文件既可用作服务器,也可用作客户端。因此,当您在本地运行scp时,它将通过SSH连接并在服务器上运行scp。然后这两个实例相互通信。 JSch替换了scp的本地实例。但它仍然需要远程实例来完成转移。

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

  
      
  1. 这个神奇的C字母是什么意思?为什么选择C?
  2.   

SCP协议的每个命令都由一个字符标识。 C代表&#34;文件传输&#34;,D代表&#34;目录传输&#34;,T在文件传输之前指示下次传输的修改时间文件等我不知道为什么它是C而不是F

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

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

  
      
  1. 这怎么能读取文件大小?
  2.   

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

C permissions size filename

例如:

C 0644 153634 index.php

代码中的循环将字符串"153634"转换为数字153634.它看起来有点过于复杂,但它确实有效。