private int timeout = 60 * 60 * 1000;
public DestHost(String host, String username, String password){
this(host, username, password, 22, 60*60*1000);
public DestHost(String host, String username, String password, int timeout){
this(host, username, password, 22, timeout);
public DestHost(String host, String username, String password, int port,
int timeout) {
super();
this.host = host;
this.username = username;
this.password = password;
this.port = port;
this.timeout = timeout;
SSH工具类:
1.JSch 使用shell执行命令,有两种方法:
ChannelExec channelExec = (ChannelExec) session.openChannel("exec");//只能执行一条指令(也可执行符合指令)
一次性执行多条shell的方法:
1)每个命令之间用;隔开
说明:各命令的执行给果,不会影响其它命令的执行。换句话说,各个命令都会执行,但不保证每个命令都执行成功。
2)每个命令之间用&&隔开
说明:若前面的命令执行成功,才会去执行后面的命令。这样可以保证所有的命令执行完毕后,执行过程都是成功的。
3)每个命令之间用||隔开
说明:||是或的意思,只有前面的命令执行失败后才去执行下一条命令,直到执行成功一条命令为止。
ChannelShell channelShell = (ChannelShell) session.openChannel("shell");//可执行多条指令 不过需要输入输出流
public class SSHUtils {
private static final String ENCODING = "UTF-8";
public static Session getJSchSession(DestHost destHost) throws JSchException {
JSch jsch = new JSch();
Session session = jsch.getSession(destHost.getUsername(), destHost.getHost(), destHost.getPort());
session.setPassword(destHost.getPassword());
session.setConfig("StrictHostKeyChecking", "no");//第一次访问服务器不用输入yes
session.setTimeout(destHost.getTimeout());
session.connect();
return session;
public static String execCommandByJSch(Session session, String command, String resultEncoding) throws IOException,JSchException{
//1.默认方式,执行单句命令
ChannelExec channelExec = (ChannelExec) session.openChannel("exec");
InputStream in = channelExec.getInputStream();
channelExec.setCommand(command);
channelExec.setErrStream(System.err);
channelExec.connect();
String result = IOUtils.toString(in, resultEncoding);
channelExec.disconnect();
return result;
下面就是使用“shell”方式进行的调用:
public static String execCommandByShell(Session session)throws IOException,JSchException{
String result = "";
//2.尝试解决 远程ssh只能执行一句命令的情况
ChannelShell channelShell = (ChannelShell) session.openChannel("shell");
InputStream inputStream = channelShell.getInputStream();//从远端到达的数据 都能从这个流读取到
channelShell.setPty(true);
channelShell.connect();
OutputStream outputStream = channelShell.getOutputStream();//写入该流的数据 都将发送到远程端
//使用PrintWriter 就是为了使用println 这个方法
//好处就是不需要每次手动给字符加\n
PrintWriter printWriter = new PrintWriter(outputStream);
printWriter.println("cd /opt/applog/MSISVCServer");
printWriter.println("ls");
printWriter.println("exit");//为了结束本次交互
printWriter.flush();//把缓冲区的数据强行输出
shell管道本身就是交互模式的。要想停止,有两种方式:
一、人为的发送一个exit命令,告诉程序本次交互结束
二、使用字节流中的available方法,来获取数据的总大小,然后循环去读。
为了避免阻塞
byte[] tmp = new byte[1024];
while(true){
while(inputStream.available() > 0){
int i = inputStream.read(tmp, 0, 1024);
if(i < 0) break;
String s = new String(tmp, 0, i);
if(s.indexOf("--More--") >= 0){
outputStream.write((" ").getBytes());
outputStream.flush();
System.out.println(s);
if(channelShell.isClosed()){
System.out.println("exit-status:"+channelShell.getExitStatus());
break;
try{Thread.sleep(1000);}catch(Exception e){}
outputStream.close();
inputStream.close();
channelShell.disconnect();
session.disconnect();
System.out.println("DONE");
return result;
准备目标登录主机信息:public class DestHost { private String host = ""; private String username = ""; private String password = ""; private int port = 22; private int timeout = 60 * 60 * 1000; public ...
ChannelShell、ChannelExec、ChannelSftp,前两类用于执行命令(命令可以是shell语句,也可以是python xxx.py),后一种是用于上传下载文件。
ChannelShell和ChannelExec的区别: 前者是交互式的,在channel.connect()之前,需要获取outputStream和inputStream,然后outputstream发送命令,从instream中读取命令的结果(注意,发送命令之后,读取命令之前要等待一会儿,一般需要写个循环判断,每秒读一次
项目需要连接到linux服务器,去获取服务器的品牌及型号,原有的实现是通过命令查/var/log/dmesg,但普适性着实不高,考虑使用dmidecode命令获取。
但dmidecode默认需要root权限,我们项目不能使用root用户去连接服务器,且连接的用户只能使用交互式密码形式使用sudo命令,故有此文。
解决方式
本文的解决方案参考了:使用JSch sudo示例和Channel.setPty在远程主机上运行sudo命令 - Thinb...
Jsch是JAVA的SSH客户端,使用的目的是执行远程服务器上的命令。
关于Session的使用,创建连接后这个session是一直可用的,所以不需要关闭。由Session中open的Channel在使用后应该关闭。
测试了exec的方式,具体参考jsch自带example中的Exec.java。
有两个问题:
1、无法执行多条命令,每...
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import java.util.Properties;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputSt
赠送jar包:
jsch-0.1.54.jar;
赠送原API文档:
jsch-0.1.54-javadoc.jar;
赠送源代码:
jsch-0.1.54-sources.jar;
赠送Maven依赖信息文件:
jsch-0.1.54.pom;
包含翻译后的API文档:
jsch-0.1.54-javadoc-API文档-
中文(简体)版.zip;
Maven坐标:com.jcraft:
jsch:0.1.54;
标签:jcraft、
jsch、
中文文档、jar包、java;
使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。
人性化翻译,文档
中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
今天和大家分享的是在工作中通过通过JSCH第三方链接linux执行相应命令,在等待读取返回结果流时阻塞,一直不返回,导致程序挂死的情况,
首先问题发生的原因,服务器大范围SSH版本升级导致
解决办法首先想到的就是升级jar包,但是升级jar包后并没有什么用。后来通过不断的百度,在官网上给了点提示,最后得到解决。
出问题的代码如下:
public String runTopShell(String...
System.out.println("in.available="+in.available());
while(in.available()>0){//in是InputStream字节流
int len=in.read(buf,0,b
JMeter是一个广泛使用的性能测试工具,自带了很多插件,但如果需要进行一些高级的任务,就需要使用额外的插件,其中一个非常常用的插件就是jsch插件。
jsch插件是JMeter的SSH通道,它允许用户通过Secure Shell(SSH)协议与远程服务器建立连接,并且可以执行各种命令。它是一个强大的插件,可以通过它来测试各种不同的系统,包括Linux、Unix和Windows等。
使用jsch插件来进行性能测试需要:
1.安装jsch插件
在JMeter的插件管理器中搜索“jsch”,并将其安装。
2.建立SSH通道
在测试计划中添加“SSH命令”Sampler,并输入要连接的服务器的IP、端口、用户名和密码。
3.执行命令
在SSH命令Sampler的命令窗口中输入需要执行的命令,并且可以将结果保存为变量以便进行断言。
4.添加断言
通过添加逻辑控制器和断言,可以对执行命令后的结果进行验证,以确保测试质量。
总之,JMeter的jsch插件使得用户可以方便地建立SSH通道并执行命令,从而更加全面地实现性能测试的覆盖。
解决org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.spring
82792
解决org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.spring
Abro.:
fastdfs下载文件重命名
git_2147483647:
fastdfs下载文件重命名
weixin_47278775:
Java内存泄露原因以及解决方法
git_2147483647:
Java内存泄露原因以及解决方法
weixin_45795054: