java - Jsch ScpTo 示例说明

标签 java tcp scp jsch

我一直在阅读 Jsch ScpTo Example ,但我无法理解他们正在做的部分事情。更具体地说,我无法理解 checkAck 方法的工作原理。

checkAck 方法:

static int checkAck(InputStream in) throws IOException{
    int b=in.read();
    // b may be 0 for success,
    //          1 for error,
    //          2 for fatal error,
    //          -1
    if(b==0) return b;
    if(b==-1) return b;

    if(b==1 || b==2){
        StringBuffer sb=new StringBuffer();
        int c;
        do {
            c=in.read();
            sb.append((char)c);
        }
        while(c!='\n');
        if(b==1){ // error
            System.out.print(sb.toString());
        }
        if(b==2){ // fatal error
            System.out.print(sb.toString());
        }
    }
    return b;
}

这似乎是在引用 TCP 协议(protocol)中的 ACK 标志。然而,阅读 TCP 协议(protocol),似乎在 TCP header 中发送了相当多的内容。然而,当调用该方法时,它不必对所有这些进行排序并提取标志。它只是假定 ACK 标志将是流中的下一个整数。

谁能给我解释一下以下哪一项适用:

  1. 为什么这个假设是有效的,
  2. 提取标志的正确方法,
  3. 他们如何确保在调用方法之前输入流始终位于正确的标志上,或者
  4. 如果这与 TCP ACK 标志无关,那么它与什么有关?

最佳答案

ScpTo.javaSCP protocol 的一个实现.

标志,checkAck 方法读取,是来自服务器的 SCP 协议(protocol)响应 (ack)。

它与 TCP 无关,它位于协议(protocol)栈的下面两层,对您隐藏,不仅通过 JSch 中的 SSH 层,而且主要通过 Java 和 OS。

我相信不幸的是,没有 SCP 协议(protocol)的规范。您只能引用 OpenSSH scp 代码中 SCP 的规范实现来理解该协议(protocol)。

很快:对于客户端发送的每条命令,服务器都以单字节“ack”进行响应,其中:

  • 0x00 成功
  • 0x01 错误
  • 0x02 是 fatal error

如果可能的话,我强烈建议你不要使用 SCP。使用 JSch(和其他 SSH 实现)原生支持的 SFTP

关于java - Jsch ScpTo 示例说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29264296/

相关文章:

c - 使用 recv 通过网络接收字符串

Jenkins sshagent 执行不工作

java - java中如何处理极小的数字

java - 如何关闭 Apache Kafka 连接器任务?

java - 如何检查 fragment 中的权限

linux - 使用 expect 脚本自动化包含多个文件的 SCP

sftp - 复制时重命名文件

java - 非类 BroadcastReceiver 的显式 Intent

java - 安卓 : Keep socket open to read message from server

http - 如何让 netcat 通过多个 TCP 段发送 HTTP header ?