我正在考虑可以在此处找到的 JSch 库使用示例:
http://www.jcraft.com/jsch/examples/ScpFrom.java.html
我无法理解此示例中的几个代码模式。他们在这里:
有什么理由更喜欢 SCP 而不是 SFTP,后者可以使用相同的库运行?
为什么我们运行
scp -f <remote file>
在远程主机上而不是简单地运行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?? }
最佳答案
- Is there any reasons to prefer SCP over SFTP, which can be ran using the same library?
不,SCP 协议(protocol)已经过时。现在你应该总是使用 SFTP。
虽然 SFTP 协议(protocol)的简单实现往往比 SCP 传输速度慢(由于其数据包性质,有效地实现 SFTP 传输并不容易)。
- Why we run
scp -f <remote file>
on remote host instead of running simplyscp 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
的原因相同。程序。
- what is the meaning of this magical C letter? Why C?
SCP 协议(protocol)的每个命令都由一个字符标识。 C
代表“文件传输”,D
代表“目录传输”,T
文件传输前表示下一个传输文件的修改时间等。我不知道为什么它是C
而不是例如F
.
- Why to send this signal all the time?
NULL ( \0
) 字符命令是对接收命令已完成的其他站点的确认/响应。
- how this can read filesize?
C
命令具有语法(这是一个人类可读的字符串):
C permissions size filename
例如:
C 0644 153634 index.php
代码中的循环翻译字符串 "153634"
到数字 153634。它的实现看起来有点过于复杂,但它确实有效。
关于java - JSch库中SCP协议(protocol)实现说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26220381/