linux系统 / perl

ssh ftp故障两例

蚊子最近用perl写了个sftp的脚本用来从远端服务器上每小时获取网络ping测试数据。昨天又拿到了一个机房的测试服务器,按照正常的流程配置了相应的脚本,数据已经都开始收集了,不过从昨天下午,sftp就不能用,看打出的日志,居然报错,报错的内容如下

Request for subsystem ‘sftp’ failed on channel ‘1’ at /usr/lib/perl5/vendor_perl/5.8.8/Net/SFTP.pm line 92

于是就查看了一下STFP.pm的第92行

if ($packet->type == SSH2_MSG_CHANNEL_FAILURE) {

网上搜了一下,找到下面内容

For an SSH user using SFTP, if the SFTP working directory configured for the user on the server is incorrect, the user cannot log in.

In this case, the server will display such debugging information:

Jan 30 17:12:34:891 2008 Server SSH/7/Server_MESSAGE: VTY[0]:SSH_Channel:

Send Message SSH2_MSG_CHANNEL_FAILURE(100):RemoteID=1

意思大概就是说,如果SFTP的工作目录没有配置正确的话,就可能会出现SSH2_MSG_CHANNEL_FAILURE的信息。

所以基本问题定位在了服务器上,于是去检查了一下sshd的配置,在文件的最后一行发现

#Subsystem       sftp    /usr/libexec/openssh/sftp-server

这个是被注释掉的,蚊子我又看了一下正常的服务器的配置,发现正常的服务器这行是非注释的,于是把注释去掉,重启sshd服务,又跑了一次脚本,这个问题被解决了。

可是新的问题又出现了。每次脚本执行的时候都会出现下面的错误

Connection closed by remote host. at /usr/lib/perl5/vendor_perl/5.8.8/Net/SSH/Perl/AuthMgr.pm line 44

由于我我的perl脚本是fork出9个进程来执行对9个机房的sftp,这样每次跑都会出错,首先我对脚本配置文件进行了修改,将其他8个机房的配置内容全部删除,只留这一个报错的,结果发现,报错不出现了。

于是我又恢复配置文件到9个机房,发现问题依旧,于是我又做了另外一种尝试,就是脚本在跑的时候,手动执行sftp去下日志,手动执行的不会出错,但脚本的还是出错,于是初步怀疑是超时造成的

经过对比正常和出错的服务器的ssh配置文件发现,出错的服务器上的配置文件中的

LoginGraceTime 1m

而且正常的都是被注释,那默认就应该是2m,于是我尝试将这个参数改成2m,重启sshd后,运行脚本,这次错误不再出现了。

LoginGraceTime的意思是

Related Post

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.