JSch jsch
=
new
JSch
(
)
;
session
=
jsch
.
getSession
(
username
,
hostname
,
port
)
;
if
(
session
==
null
)
{
System
.
out
.
println
(
"-----"
)
;
session
.
setPassword
(
password
)
;
Properties configTemp
=
new
Properties
(
)
;
configTemp
.
put
(
"StrictHostKeyChecking"
,
"no"
)
;
session
.
setConfig
(
configTemp
)
;
session
.
setTimeout
(
60000
)
;
System
.
out
.
println
(
"======="
)
;
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