我用腻子工具pscp遇到问题。
我检查Linux VM(Red Hat Enterprise Linux Server 7.4)“ TARGET”是否仍在运行,并将时间戳记存储在TARGET中的文件中。我从Windows VM(Windows Server 2016)“ SOURCE”完成所有这十个任务。通过以下代码使用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操作,往返时间没有明显变化。
这里有两个日志文件,第一个来自成功的手动连接(我到达需要提供密码的地方终止了它)和一个用于挂起连接的日志(在恢复连接之前提取)。
成功
事件日志:将新的会话日志(SSH数据包模式)写入文件:C:\ Users \ Me \ putty.log 事件日志:查找主机“ TARGET” 事件日志:连接到XXX.XXX.XXX.XXX端口YYYY 事件日志:我们声明版本:SSH-2.0-PuTTY_Release_0.64 事件日志:服务器版本:SSH-2.0-OpenSSH_7.4 事件日志:使用SSH协议版本2 传出封包#0x0,类型20 / 0x14(SSH2_MSG_KEXINIT) 传入数据包#0x0,类型20 / 0x14(SSH2_MSG_KEXINIT) 事件日志:将Diffie-Hellman与标准组“ group14”一起使用 事件日志:使用哈希SHA-1进行Diffie-Hellman密钥交换 传出封包#0x1,类型30 / 0x1e(SSH2_MSG_KEXDH_INIT) 传入数据包#0x1,类型31 / 0x1f(SSH2_MSG_KEXDH_REPLY) 事件日志:主机密钥指纹为: 事件日志:ssh-rsa 2048 XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX 传出封包#0x2,类型21 / 0x15(SSH2_MSG_NEWKEYS) 事件日志:初始化的AES-256 SDCTR客户端->服务器加密 事件日志:初始化的HMAC-SHA-256客户端->服务器MAC算法 传入数据包#0x2,类型21 / 0x15(SSH2_MSG_NEWKEYS) 事件日志:初始化的AES-256 SDCTR服务器->客户端加密 事件日志:初始化的HMAC-SHA-256服务器->客户端MAC算法 传出封包#0x3,类型5 / 0x05(SSH2_MSG_SERVICE_REQUEST) 传入数据包#0x3,类型6 / 0x06(SSH2_MSG_SERVICE_ACCEPT) 传出封包#0x4,类型50 / 0x32(SSH2_MSG_USERAUTH_REQUEST) 传入数据包#0x4,类型51 / 0x33(SSH2_MSG_USERAUTH_FAILURE) 事件日志:使用来自SECUR32.DLL的SSPI 事件日志:尝试GSSAPI身份验证 传出封包#0x5,类型50 / 0x32(SSH2_MSG_USERAUTH_REQUEST) 传入数据包#0x5,键入60 / 0x3c(SSH2_MSG_USERAUTH_GSSAPI_RESPONSE) 事件日志:GSSAPI身份验证初始化失败 事件日志:无法识别目标。 传出封包#0x6,类型50 / 0x32(SSH2_MSG_USERAUTH_REQUEST) 事件日志:尝试进行键盘交互式身份验证 传入数据包#0x6,键入60 / 0x3c(SSH2_MSG_USERAUTH_INFO_REQUEST)
失败
事件日志:将新的会话日志(SSH数据包模式)写入文件:C:\ Users \ Me \ putty.log 事件日志:查找主机“ TARGET” 事件日志:连接到XXX.XXX.XXX.XXX端口YYYY 事件日志:我们声明版本:SSH-2.0-PuTTY_Release_0.64 事件日志:服务器版本:SSH-2.0-OpenSSH_7.4 事件日志:使用SSH协议版本2 传出封包#0x0,类型20 / 0x14(SSH2_MSG_KEXINIT) 传入数据包#0x0,类型20 / 0x14(SSH2_MSG_KEXINIT) 事件日志:将Diffie-Hellman与标准组“ group14”一起使用 事件日志:使用哈希SHA-1进行Diffie-Hellman密钥交换 传出封包#0x1,类型30 / 0x1e(SSH2_MSG_KEXDH_INIT) 传入数据包#0x1,类型31 / 0x1f(SSH2_MSG_KEXDH_REPLY) 事件日志:主机密钥指纹为: 事件日志:ssh-rsa 2048 XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX 传出封包#0x2,类型21 / 0x15(SSH2_MSG_NEWKEYS) 事件日志:初始化的AES-256 SDCTR客户端->服务器加密 事件日志:初始化的HMAC-SHA-256客户端->服务器MAC算法 传入数据包#0x2,类型21 / 0x15(SSH2_MSG_NEWKEYS) 事件日志:初始化的AES-256 SDCTR服务器->客户端加密 事件日志:初始化的HMAC-SHA-256服务器->客户端MAC算法 传出封包#0x3,类型5 / 0x05(SSH2_MSG_SERVICE_REQUEST) 传入数据包#0x3,类型6 / 0x06(SSH2_MSG_SERVICE_ACCEPT) 传出封包#0x4,类型50 / 0x32(SSH2_MSG_USERAUTH_REQUEST) 传入数据包#0x4,类型51 / 0x33(SSH2_MSG_USERAUTH_FAILURE) 事件日志:使用来自SECUR32.DLL的SSPI 事件日志:尝试GSSAPI身份验证 传出封包#0x5,类型50 / 0x32(SSH2_MSG_USERAUTH_REQUEST) 传入数据包#0x5,键入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之后应该不是那么稳定,对吧?) 我希望任何人都可以帮助我解决这个问题,因为我对继续调试的过程不甚了解。
出于安全原因,我可能不会使用“只是任何库”。 Nativ功能和完善的程序是我的主要选择。