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 = &quot;&quot;;	private String username = &quot;&quot;;	private String password = &quot;&quot;;	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是一直可用的,所以不需要关闭。由Sessionopen的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.: thanks!表情包 fastdfs下载文件重命名 git_2147483647: org.apache.commons.io fastdfs下载文件重命名 weixin_47278775: 哥这个是什么包的呀IOUtils.toByteArray Java内存泄露原因以及解决方法 git_2147483647: 所以这是转载,开头附上了原文链接 Java内存泄露原因以及解决方法 weixin_45795054: “另一个是给对象赋予了新值,这样重新分配了内存空间。”你能不能手动实践一下再抄袭别人的?