事故背景
生产环境的某项目上访问SFTP服务时出现异常,导致无法访问。
com.jcraft.jsch.JSchException: java.io.IOException: Pipe closed
at com.jcraft.jsch.ChannelSftp.start(ChannelSftp.java:315)
at com.jcraft.jsch.Channel.connect(Channel.java:152)
at com.jcraft.jsch.Channel.connect(Channel.java:145)
at com.firefly.xxxxx.module.isoc.util.SFtpOperatorImpl.getConnectAndChannel(SFtpOperatorImpl.java:54)
at com.firefly.xxxxx.module.isoc.util.SFtpOperatorImpl.getConnectAndChannel(SFtpOperatorImpl.java:41)
at com.firefly.xxxxx.module.isoc.util.SFtpOperatorImpl.<init>(SFtpOperatorImpl.java:34)
at com.firefly.xxxxx.module.isoc.service.gd.AssetFileService.analysisFTPFile(AssetFileService.java:182)
at com.firefly.venus.module.isoc.service.gd.AssetFileService$$FastClassBySpringCGLIB$$d5abc9e4.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:749)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:294)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)
事故分析
1、于是,我登陆生产设备上通过手工访问sftp
sftp 帐号@设备IP
输入密码后出现Connection closed.
2、思考一番,既然能够输入密码,那说明sftp服务是可用的。这个时候,我能够想到的是重启一下ssh服务,看看能不能恢复过来。(注:设备系统是centos6.5)
service sshd restart
如果是centos7的话,则使用
systemctl restart sshd.service
3、但是结果还是悲剧的,这个时候又在想,既然网络ping通,telnet 22端口也是通,那会是什么问题导致的?因为这个线上的sftp服务一直在使用,用了将近2-3个月了。想到2-3个月的时候,突然想一下会不会这个sftp帐号自身的问题导致的?难道是密码过期?
4、于是,我通过命令:
chage -l sftp帐号(XXXXXXX)
如下图所示,原来当前sftp帐号的密码早在2020年9月16号过期了。
解决方案
1、既然是帐号密码过期了,但是这个密码已跟多个厂家协商好的,所以万万不能擅自修改密码,于是,把密码的过期期限暂定修改为never,操作如下。
chage -M 99999 sftp帐号(XXXXXX)
于是,再一次输入命令 :
chage -l sftp帐号(XXXXXXX)
如下图所示:
现在重新使用当前帐号访问sftp,连接成功。