2

我有一个腻子工具 pscp 的问题。

我检查 Linux VM(Red Hat Enterprise Linux Server 7.4)“TARGET”是否存在,并将 TARGET 上的时间戳存储在文件中。我从 Windows 虚拟机(Windows 服务器 2016)“SOURCE”做这 10 秒。该过程是通过以下代码在 Java 中启动的:

// get a Process executing the instruction with cmd and 
terminate the process after 5s.
String instruction = "pscp.exe  -batch -i  C:\\User\\Me 
\\keys \\privatekey_Me.ppk -sshlog >C:\\User\\Me 
\\putty.log -scp TARGET:~/dir/file.txt file.txt"
Process p = Runtime.getRuntime().exec(instruction,null,dir);
if(!p.waitFor(3, TimeUnit.MINUTES)) { //I want this to be 
5s instead of 3m, but for the question on >stackoverflow 
3m is clearer.
    p.destroy();
    throw new Exception("Connection took too long.");
  }

一般来说,它有效。

但它在 2m-10m 之后也一直失败(绝对最大 20m——一个极端的异常值,中值是 4m)。对于 5s-2m pscp 挂起,而不是崩溃,挂起,最终它恢复并继续,就像什么都没发生一样。这种行为也可以通过手动启动 pscp.exe 来观察——然后批处理脚本和手动连接将同时成功。

为了清楚起见:

>10:00:00 start, connection & copy success
>10:00:10 start, connection & copy success
>10:00:20 start, hanging
>10:00:30 hanging
>…
>10:01:30 connection & copy success
>10:01:40 start, connection & copy success

在此挂起期间,我 ping 了两个方向(TARGET SOURCE、SOURCE TARGET),往返时间没有明显变化。

这里有两个日志文件,第一个来自成功的手动连接(我在到达需要提供密码的点时终止了它)和一个挂起连接的日志(在连接恢复之前提取)。

成功

类型 60 / 0x3c (SSH2_MSG_USERAUTH_GSSAPI_RESPONSE) 事件日志:GSSAPI 身份验证初始化失败事件日志:无法识别目标。传出数据包 #0x6,类型 50 / 0x32 (SSH2_MSG_USERAUTH_REQUEST) 事件日志:尝试键盘交互式身份验证传入数据包 #0x6,类型 60 / 0x3c (SSH2_MSG_USERAUTH_INFO_REQUEST)

失败

类型 60 / 0x3c (SSH2_MSG_USERAUTH_GSSAPI_RESPONSE) 事件日志:GSSAPI 身份验证初始化失败事件日志:无法识别目标。传出数据包 #0x6,类型 50 / 0x32 (SSH2_MSG_USERAUTH_REQUEST) 事件日志:尝试键盘交互式身份验证

长日志短:两者相同,除了最后一行仅在成功日志中:

传入数据包 #0x6,类型 60 / 0x3c (SSH2_MSG_USERAUTH_INFO_REQUEST)

看来这个数据包会导致问题。也许它有时会丢失?(但是在 2m-10m 之后它不应该如此一致,对吗?)我希望任何人都可以帮助我解决这个问题,因为我对继续调试的过程没有深入的了解。

出于安全原因,我可能不会使用“just any library”。Nativ 功能和完善的程序是我的主要选择。

4

0 回答 0