关于JSCH上传文件到sftp服务器时 [session.connect()] 连接sftp服务器慢的问题

	Session session = null;
	try {
		// 创建JSch对象
		JSch jsch = new JSch();
		// 根据用户名,主机ip,端口获取一个Session对象
		session = jsch.getSession(username, hostname, port);
		if(session==null) {
			System.out.println("-----");
		}
		// 设置密码
		session.setPassword(password);
		Properties configTemp = new Properties();
		configTemp.put("StrictHostKeyChecking", "no");
		// 为Session对象设置properties
		session.setConfig(configTemp);
		// 设置timeout时间
		session.setTimeout(60000);
		System.out.println("=======");
		// 关闭认证
		// session.setConfig("PreferredAuthentications","password");
		//session.setConfig("PreferredAuthentications", "password,gssapi-with-mic,publickey,keyboard-interactive");
		session.connect();
		System.out.println("--------");
	} catch (JSchException e) {
	
	}

每次调用方法到session.connect()时会卡很久。

Linux 输入命令 strace ssh root@10.1.25.42,查看卡住位置,可以看到查询/etc/hosts,然后打开了一个socket,取查询192.168.1.5,这个是我在/etc/resolv.conf里面设置的DNS,因此卡在了sendto函数,一直无法查询到结果。

open("/etc/hosts", O_RDONLY|O_CLOEXEC)  = 4
fstat(4, {st_mode=S_IFREG|0644, st_size=186, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f95a2d2d000
read(4, "127.0.0.1   localhost localhost."..., 4096) = 186
read(4, "", 4096)                       = 0
close(4)                                = 0
munmap(0x7f95a2d2d000, 4096)            = 0
socket(PF_INET, SOCK_DGRAM|SOCK_NONBLOCK, IPPROTO_IP) = 4
connect(4, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("192.168.1.5")}, 16) = 0
gettimeofday({1561445066, 150842}, NULL) = 0
poll([{fd=4, events=POLLOUT}], 1, 0)    = 1 ([{fd=4, revents=POLLOUT}])
sendto(4, "\352\23\1\0\0\1\0\0\0\0\0\0\00213\00218\0011\00210\7in-addr\4"..., 41, MSG_NOSIGNAL, NULL, 0) = 41
poll([{fd=4, events=POLLIN}], 1, 5000)  = 0 (Timeout)
gettimeofday({1561445071, 154888}, NULL) = 0
poll([{fd=4, events=POLLOUT}], 1, 0)    = 1 ([{fd=4, revents=POLLOUT}])
sendto(4, "\352\23\1\0\0\1\0\0\0\0\0\0\00213\00218\0011\00210\7in-addr\4"..., 41, MSG_NOSIGNAL, NULL, 0) = 41
poll([{fd=4, events=POLLIN}], 1, 5000)  = 0 (Timeout)
close(4)                                = 0

因此,问题原因都指向了DNS查询。然而为什么ssh用的是IP而不是域名,还会导致缓慢呢,原因在于:

OpenSSH在用户登录的时候会验证IP,它根据用户的IP使用反向DNS找到主机名,再使用DNS找到IP地址,最后匹配一下登录的IP是否合法。如果客户机的IP没有域名,或者DNS服务器很慢或不通,那么登录就会很花时间。

现在问题比较明确了,解决方法如下:

方案一:直接改善DNS查询 [亲测可用]

将ssh要访问的IP地址与域名添加到 /etc/hosts中,加速查询

输入命令 vim /etc/resolv.conf

# Generated by NetworkManager
domain localdomain
search localdomain
nameserver 192.16*.***.*** [改成自己的ip]

3、检查/etc/nsswitch.conf 文件,确保有hosts: files dns行,代表查询主机会首先查询files(/etc/hosts) ,然后查询DNS(/etc/resolv.conf)。


问题:
重启后发现/etc/resolv.conf又恢复到原来的状态

原因:
直接修改/etc/resolv.conf这个文件是没用的,网络服务重启以后会根据
/etc/sysconfig /network-scripts/ifcfg-eth0来重载配置,如果ifcfg-eth0没有配置DNS,那么resolv.conf会被冲掉,重新变成空值。

解决方法:
vim /etc/sysconfig/network-scripts/ifcfg-eth0
在配置下加入下面的内容

DNS1=192.16*.***.***(默认的ip)
DNS2=192.16*.***.***(自己的ip)

结果:
这样设置后,/etc/resolv.conf里面根本就不需要设置。service network restart 后,可以发现/etc/resolv.conf里面就有两个dns的解析ip了。配置好以后重启网络,cat /etc/resolv.conf,可以看到如下参数:

nameserver 192.16*.***.***
nameserver 192.16*.***.***

DNS解析设置成功。

方案二:改善ssh服务 [我用这个不行]

1、查看ssh 客户端配置文件/etc/ssh/ssh_config(注意不是sshd_config),修改host:GSSAPIAuthentication no,不使用GSSAPI来鉴权。

2、修改sshd_config 添加行UseDNS no关闭ssh的dns查询,然后重启sshd


  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
根据提供的引用内容,你遇到的问题是`Caused by: com.jcraft.jsch.JSchException: Session.connect: java.net.SocketException: Connection reset`。这个错误通常是由于网络连接问题引起的。可能有以下几个原因导致这个错误: 1. 服务器端口未打开或被防火墙阻止:请确保你的SFTP服务器端口已正确打开,并且没有被防火墙阻止。 2. 服务器地址错误:请确保你的SFTP服务器地址是正确的,可以尝试使用ping命令来测试服务器的连通性。 3. 服务器连接:如果服务器连接,可能是由于网络延迟或服务器负载过高导致的。你可以尝试增加连接间或者优化服务器性能。 4. 客户端配置错误:请确保你的Java代码中的SFTP配置是正确的,包括服务器地址、端口、用户名、密码等。 以下是一个示例代码,演示了如何使用JSch库进行SFTP上传文件: ```java import com.jcraft.jsch.*; public class SftpExample { public static void main(String[] args) { String host = "sftp.example.com"; int port = 22; String username = "your-username"; String password = "your-password"; String localFilePath = "/path/to/local/file.txt"; String remoteFilePath = "/path/to/remote/file.txt"; try { JSch jsch = new JSch(); Session session = jsch.getSession(username, host, port); session.setPassword(password); session.setConfig("StrictHostKeyChecking", "no"); session.connect(); ChannelSftp channel = (ChannelSftp) session.openChannel("sftp"); channel.connect(); channel.put(localFilePath, remoteFilePath); channel.disconnect(); session.disconnect(); } catch (JSchException | SftpException e) { e.printStackTrace(); } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值