JSch库中SCP协议实现的说明
我正在考虑一个JSch库使用的例子,可以在这里找到:
http://www.jcraft.com/jsch/examples/ScpFrom.java.html
我无法理解此示例中的几种代码模式。 他们来了:
-
是否有任何理由偏爱SF而不是SFTP,可以使用同一个库运行?
-
为什么我们在远程主机上运行
scp -f
而不是简单地运行scp source_file_path destination_file_path
? 为什么在远程主机上执行更好? -
在转移的开始有一条线
while(true){ int c=checkAck(in); if(c!='C'){ break; } ...
这个神奇的
C
字母是什么意思? 为何选择C
? -
为什么要一直发送这个信号?
// send '\0' buf[0]=0; out.write(buf, 0, 1); out.flush();
-
这怎么可以读取文件大小?
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?? }
- 是否有任何理由偏爱SF而不是SFTP,可以使用同一个库运行?
不,SCP协议已经过时了。 你现在应该总是使用SFTP。
尽管SFTP协议的简单实现往往比SCP具有更慢的传输(由于其数据包性质,很难有效地实现SFTP传输)。
- 为什么我们在远程主机上运行
scp -f
而不是简单地运行scp source_file_path destination_file_path
? 为什么在远程主机上执行更好?
这是SCP协议的工作方式。 OpenSSH scp
二进制文件既可用作服务器,也可用作客户端。 因此,当您在本地运行scp
,它通过SSH连接并在服务器上运行scp
。 然后这两个实例相互通信。 JSch替换了scp
的本地实例。 但它仍然需要远程实例来完成传输。
如果您在本地运行scp
,则必须在计算机上安装OpenSSH。 什么在Unix上可能很常见,但绝对不是在Windows上。 此外,没有简单/标准化的方法来捕获scp
程序的结果,将它们转换为JSch Java接口。 这与JSch(或任何其他SFTP库)自己实现SFTP协议的原因相同,而不是使用sftp
程序。
- 这个神奇的C字母是什么意思? 为何选择C?
SCP协议的每个命令都由一个字符标识。 C
表示“文件传输”, D
表示“目录传输”,文件传输之前的T
表示下一个传输文件的修改时间等。我不知道为什么它是C
而不是例如F
- 为什么要一直发送这个信号?
NULL( \0
)字符命令是对收到的命令完成的其他站点的确认/响应。
- 这怎么可以读取文件大小?
C
命令有语法(它是一个人类可读的字符串):
C permissions size filename
例如:
C 0644 153634 index.php
代码中的循环将字符串"153634"
转换为数字153634.它看起来有点太复杂的实现,但它的工作原理。