背景
基于apache的ssh客户端连接远端30s就会断开,需要排查。
日志没有错误输出,tcpdump抓包显示我们先发送FIN断开连接,手上的资料排查不出问题。
线上环境重启开启debug日志需要重启服务,影响大。想的是先排除我们业务代码的影响,直接调用第三方包提供的ssh客户端做连接测试,看看能不能排除第三方的问题。
实现
最开始是打算自己编写j测试代码到线上环境测试,编写过程中发现apache的ssh客户端中带了main方法,而且通过命令行可以直接调通。一下子就省了很多事。
MINA-SSHD
sshd源码地址:https://github.com/apache/mina-sshd
sshd客户端main源码地址:https://github.com/apache/mina-sshd/blob/master/sshd-cli/src/main/java/org/apache/sshd/cli/client/SshClientMain.java
java -cp
调用jar包的main函数通过 java -cp
命令实现
第一版(报错)
注意带有main函数的类在命令行中要带上package,main函数接受的参数跟在类完整路径后面
java -cp xx.jar org.apache.sshd.cli.client.SshClientMain [args]
调用失败,缺少slf4j
第二版(无日志输出)
添加slf4j的jar包
java -cp slf4j-api-1.7.31.jar:xx.jar org.apache.sshd.cli.client.SshClientMain [args]
基本达到预期,成功运行,但是没有日志输出
第三版(日志输出控制台)
添加logback的两个jar包
java -cp logback-classic-1.2.3.jar:logback-core-1.2.3.jar:slf4j-api-1.7.31.jar:xx.jar org.apache.sshd.cli.client.SshClientMain [args]
运行后,我要的内容全拿到了,可以到线上环境使用了。就是不太方便,默认级别是DEBUG,日志全部输出到控制台看着很乱。
第四版(可控的日志输出)
添加logback.xml文件所在路径path
java -cp path:logback-classic-1.2.3.jar:logback-core-1.2.3.jar:slf4j-api-1.7.31.jar:xx.jar org.apache.sshd.cli.client.SshClientMain [args]
成功实现通过修改logback.xml控制日志输出。
中间其实有个3.5版在jar包所在路径添加了logback.xml文件但是不生效,经过多番查找,发现是要将logback.xml所在路径加到命令参数,这点是比较关键的。
参考
https://www.cnblogs.com/grub007/p/14217116.html
https://www.cnblogs.com/klb561/p/10850803.html