相关文章推荐
安静的柚子  ·  c++ ...·  6 月前    · 
挂过科的太阳  ·  c++ 共享内存实现-掘金·  1 年前    · 
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

Session session = null; try { // 创建JSch对象 JSch jsch = new JSch(); // 根据用户名,主机ip,端口获取一个Session对象 session = jsch.getSession(username, hostname, port); if(session==null) { System.out.print...
根据提供的方案二:修改java调用,及openSSH配置文件,已经连接成功了,谢谢。 (openssh版本7.6p1) 的/etc/ssh/sshd_config添加:KexAlgorithms +diffie-hellman-group1-sha1 openssh版本7.9的添/etc/ssh/sshd_config添加了参数: KexAlgorithms diffie-hellm...
//两种获取session方式 Session session = currentSession(); Session session = getSessionFactory().getCurrentSession();
最近导师项目,需要搞一个web server,需要在浏览器端控制底层虚拟机部署应用。于是有两个想法。 一、虚拟机的镜像已经部署好所有的应用,这个项目下,用户需要的应用是固定的,就那么几种,所以可以考虑直接镜像上直接安装好所有的应用。当然这个方法有点蠢,太不灵活了。 二、通过编写java程序,通过ssh远程登录到虚拟机来执行命令。于是在网上找到了Jsch。下面是网上转载的简单例子:import j
脑阔疼,有段间没用Finalshell了,嗯哼,GG了。 Finalshell连接报错:Session.connect: java.net.ConnectException: Connection 1.首先检查一下是不是服务器问题,去别人电脑连接一下就知道了。(我这里测过了,在别人电脑上是可以连... 用finalshell远程连接服务器,一段间后卡死,系统管理器强制关闭客户端后,再次远程连接服务器连接不上。 finalshell报错Session.connect: java.net.ConnectException: Connection xshell报错Connection closed by foreign host 运维人员直接拔电源重启,没看到重启之前的...
sftp上传服务器没报错,但是图片清空会显示com.jcraft.jsch.JSchException:Session.connect:java.net.SocketException:Connectionreset 原因是因为加了黑白名单 解决方式就是新增dockertomcat容器的ipsshd:172.21.0.3/32:allow到"/etc/hosts.allow"里面(允许访问本机的客户端列表),ip可能会变,但是等保不允许加入一个网段,等等保过了可以新增允许一个网段sshd:...
因为使用java链接ftp报一下错误 org.apache.commons.net.MalformedServerReplyException: Could not parse response code. Server Reply: SSH-2.0-OpenSSH_5.3 在网上找了一会发现一个兄弟写的帮助了我  http://www.cnblogs.com/chen1987lei/ar
我这边的需求是一台服务器作为主服务器,需要部署多个模块到各个服务器上,所以脚本中需要用到大量的scp命令和ssh命令,scp将软件压缩包复制到目标服务器上,然后ssh命令执行解压命令,以及执行压缩包内的shell脚本,达到远程一键部署软件安装包的目的。 这个过程中发现ssh完后不退出,导致下一个命令无法执行,找了好久,最后发现是一个保护脚本,这个脚本使用while true死循环执行,这个脚本使用nohup执行,输出到/dev/null。原来是这么写的: nohup${SHELL_FOLDER}/ke.
session = getSession(); session.setConfig("PreferredAuthentications","password"); session.setConfig("StrictHostKeyChecking", "no"); session.setPassword(password); session.connect(); channel = (ChannelSftp) sess