`
vilight
  • 浏览: 36855 次
文章分类
社区版块
存档分类
最新评论

java 远程执行linux shell (基于JSCH)

 
阅读更多

1. pom.xml

<dependency>
			<groupId>com.jcraft</groupId>
			<artifactId>jsch</artifactId>
			<version>0.1.50</version>
		</dependency>

 

2. 

package xxxxx;

import java.io.InputStream;
import java.util.Vector;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.ChannelSftp.LsEntry;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;
import com.jcraft.jsch.UserInfo;

public class JschShellUtil {
	private final Logger LOGGER = LoggerFactory.getLogger(JschShellUtil.class);
	private String host;
	private String user;
	private String password;
	private int port;
	private int maxWaitTime;
	private String keyfile;
	private String passphrase;
	private boolean sshKey;
	private ChannelSftp sftp;
	private ChannelExec exec;

	private Session session;

	public JschShellUtil(String host, String user, String password, int port, int maxWaitTime) {
		this.host = host;
		this.user = user;
		this.password = password;
		this.port = port;
		this.maxWaitTime = maxWaitTime;
		this.keyfile = null;
		this.passphrase = null;
		this.sshKey = false;
	}

	public JschShellUtil(String host, String user, int port, int maxWaitTime, String keyfile, String passphrase) {
		this.host = host;
		this.user = user;
		this.password = null;
		this.port = port;
		this.maxWaitTime = maxWaitTime;
		this.keyfile = keyfile;
		this.passphrase = passphrase;
		this.sshKey = true;
	}

	public void open() throws JSchException {
		JSch client = new JSch();
		if (sshKey && keyfile != null && keyfile.length() > 0) {
			client.addIdentity(this.keyfile, this.passphrase);
		}
		session = client.getSession(this.user, this.host, this.port);
		session.setUserInfo(new UserInfo() {
			public String getPassphrase() {
				return null;
			}

			public String getPassword() {
				return password;
			}

			public boolean promptPassphrase(String arg0) {
				return true;
			}

			public boolean promptPassword(String arg0) {
				return true;
			}

			public boolean promptYesNo(String arg0) {
				return true;
			}

			public void showMessage(String arg0) {
			}
		});
		session.setTimeout(maxWaitTime);
		session.connect();
		Channel channel = session.openChannel("sftp");
		channel.connect();
		sftp = (ChannelSftp) channel;
	}

	public void close() {
		if (sftp != null) {
			sftp.disconnect();
			sftp = null;
		}
		if (session != null) {
			session.disconnect();
			session = null;
		}

	}

	public void cd(String path) throws SftpException {
		sftp.cd(path);
	}

	public String pwd() throws SftpException {
		String pwd = sftp.pwd();
		LOGGER.info(sftp.pwd());
		return pwd;

	}

	public void ls() throws SftpException {
		Vector<?> vector = sftp.ls(".");
		for (Object object : vector) {
			if (object instanceof LsEntry) {
				LsEntry entry = LsEntry.class.cast(object);
				LOGGER.info(entry.getFilename());
			}
		}
	}

	public void ls(String path) throws SftpException {
		Vector<?> vector = sftp.ls(path);
		for (Object object : vector) {
			if (object instanceof LsEntry) {
				LsEntry entry = LsEntry.class.cast(object);
				LOGGER.info(entry.getFilename());
			}
		}
	}

	public void rename(String oldPath, String newPath) throws SftpException {
		sftp.rename(oldPath, newPath);
	}

	public void cp(String src, String dest) throws SftpException {
		int lastSlash = src.lastIndexOf("/");
		String srcFile = src;
		String srcDir = ".";
		if (lastSlash > -1) {
			srcFile = src.substring(lastSlash + 1);
			srcDir = src.substring(0, lastSlash);
		}
		String temp = srcDir + "/temp_" + srcFile;
		rename(src, temp);
		rename(temp, dest);
	}

	public void rm(String file) throws SftpException {
		sftp.rm(file);
	}

	public void mv(String src, String dest) throws SftpException {
		rename(src, dest);
	}

	public void rmdir(String path) throws SftpException {
		sftp.rmdir(path);
	}

	public void mkdir(String path) throws SftpException {
		sftp.mkdir(path);
	}

	public void chmod(int permissions, String path) throws SftpException {
		sftp.chmod(permissions, path);
	}

	/**
	 * 执行一次shell命令,之后连接就关闭
	 * @param cmd
	 * @return
	 * @throws Exception
	 */
	public int runCmd(String cmd) throws Exception {
		exec = (ChannelExec) session.openChannel("exec");
		exec.setCommand(cmd);
		exec.setInputStream(null);
		exec.setErrStream(System.err);
		InputStream in = exec.getInputStream();
		exec.connect();

		int res = -1;
		StringBuffer buf = new StringBuffer(1024);
		byte[] tmp = new byte[1024];
		while (true) {
			while (in.available() > 0) {
				int i = in.read(tmp, 0, 1024);
				if (i < 0)
					break;
				buf.append(new String(tmp, 0, i));
			}
			if (exec.isClosed()) {
				res = exec.getExitStatus();
				LOGGER.info("Exit-status: " + res);
				break;
			}
		}
		LOGGER.info(buf.toString());
		exec.disconnect();
		return res;
	}

	public static void main(String[] args) throws Exception {
		String host = "10.121.163.112 ";
		String user = "admin";
		String password = "admin";
		int port = 22;
		int maxWaitTime = 0;
		JschShellUtil jsch = new JschShellUtil(host, user, password, port, maxWaitTime);
		jsch.open();
	

		String filename = "dubbo-demo-provider-2.5.3-assembly.tar.gz";
		jsch.runCmd("cd /home/admin/vlt/dubbo-demo-provider-2.5.3/bin; ./stop.sh");
		
		jsch.close();
	}

}

 

分享到:
评论

相关推荐

    如何用java程序(JSch)运行远程linux主机上的shell脚本

    以下是如何使用JSch在Java程序中运行远程Linux主机上的shell脚本的详细步骤: 首先,你需要在项目中引入JSch的依赖。在Maven项目中,可以在pom.xml文件中添加以下依赖: ```xml &lt;groupId&gt;com.jcraft&lt;/groupId&gt; ...

    Java 调用 Linux shell 命令执行框架:sshxcute

    sshxcute 就是这样一个框架工具集,它基于 JSCH 构建,允许工程师利用Java 代码通过 SSH 连接远程批量执行 Linux/UNIX 系统上的命令或者脚本,同时加入了判断成功与否,取回输出等多种实用功能。sshxcute 不管是针对...

    详解Java使用Jsch与sftp服务器实现ssh免密登录

    Jsch(Java Secure Channel)是一个纯Java语言编写的库,它能够实现SSH(Secure Shell)功能。SSH是一种安全协议,它主要用于在不同的系统或服务器间建立安全的连接,并在传输数据的过程中对数据进行加密。在Java中...

    java 远程调用Shell脚本客户端包

    总的来说,Java远程调用Shell脚本客户端包简化了开发人员在Java应用程序中集成远程系统管理操作的过程,提高了开发效率并保证了安全性。通过理解和运用上述技术,开发者能够更好地利用这个工具包实现各种复杂的远程...

    java控制台输入cmd命令, ssh远程linux shell命令, 并打印命令输出到控制台

    在Java编程中,有时我们需要与操作系统进行交互,执行系统级别的命令,例如在控制台执行CMD命令或者通过SSH连接远程Linux服务器执行shell命令。这在自动化脚本、系统管理或者远程监控等场景中非常常见。本篇文章将...

    java使用JSCH进行连接远程服务器Demo

    Java使用JSCH(Java Secure Channel)库连接远程服务器是一个常见的任务,特别是在自动化运维、文件传输或者执行远程命令等场景中。JSCH是一个纯Java实现的SSH2库,它提供了连接到支持SSH协议的服务器的能力,如...

    linux shell的java操作实现

    下面是一段基本的Java代码示例,展示了如何使用JSch连接到远程Linux服务器并执行一个简单的Shell命令: ```java import com.jcraft.jsch.*; public class SSHExecutor { public static void main(String[] args) ...

    java开发的swing客户端,远程执行linux命令.zip

    具体来说,开发者可能使用了Java的SSH(Secure Shell)库,如JSch或者Apache MINA,这些库提供了与远程Linux服务器安全连接并执行命令的能力。 SSH协议是一种在网络上传输数据的安全方式,通常用于远程登录、文件...

    Java实现Linux的远程拷贝

    首先,要实现Linux的远程拷贝,我们需要用到Java的SSH(Secure Shell)库,例如JSch。JSch是Java的一个开源库,提供了SSH2协议的实现,允许我们通过SSH连接执行命令、传输文件等操作。在项目中引入JSch库后,我们就...

    java执行远程linux服务器命令

    总结,通过Java执行远程Linux服务器命令主要涉及到SSH协议、JSch库的使用,以及可能的工具类库如Apache Commons Exec。这些技术在日常的系统管理和自动化任务中扮演着重要角色,帮助开发者实现远程操作和管理。

    JAVA操作linux服务器,本文用于启动shell脚本并返回数据,简单易懂,可随时修改

    总之,通过Java操作Linux服务器并执行shell脚本,可以实现自动化运维、远程数据获取等多种功能。结合Apache Commons库,我们可以编写出高效、可靠的远程管理工具。在实际开发中,一定要注意安全性,例如使用密钥对...

    Java远程连接Linux服务器并执行命令及上传文件功能

    首先,要实现Java远程连接Linux服务器并执行命令及上传文件的功能,通常需要借助一些第三方库。其中JSch库是一个常用的、完全用Java写成的SSH2客户端,可以帮助我们安全地连接到SSH服务器。而Apache Commons Logging...

    Java实现windows下远程调用shell脚本

    该工具是基于SSH2协议的实现,在使用它的过程中非常容易,只需要指定合法的用户名口令,或者授权认证文件,就可以创建到远程Linux主机的连接,在建立起来的会话中调用该Linux主机上的脚本文件,执行相关操作。

    java应用程序远程登录linux并执行其命令

    在Java编程环境中,远程登录Linux系统并执行命令是一项常见的任务,尤其在自动化运维、系统管理以及分布式系统中。本文将详细讲解如何实现这一功能,并基于给出的“AutoStart”文件名,推测这是一个自动启动相关服务...

    java代码在window获取linux文件

    `JSch`库提供了一个这样的解决方案,它是一个纯Java实现的SSH2库,允许开发者连接到远程计算机并执行命令,传输文件等。本篇将详细介绍如何使用Java和JSch在Windows上实现对Linux服务器的文件获取。 首先,我们需要...

    java操作Linux环境

    4. **执行远程脚本**:除了直接执行单个命令,还可以通过JSCH执行存储在远程服务器上的shell脚本。这通常涉及创建一个`Channel.exec()`通道,然后将脚本的路径作为命令传递。 在实际应用中,"synclinux"可能是一个...

    java远程连接ssh

    在IT行业中,Java远程连接SSH是一项重要的技能,特别是在管理和维护基于Linux系统的服务器时。SSH(Secure Shell)是一种网络协议,用于安全地远程控制操作系统,执行命令,传输数据。本篇文章将详细探讨Java如何...

    jsch-0.1.55.jar java语言linux系统文件安全传输工具包 - 亲测可用,请放心下载

    此外,由于JSch支持shell命令执行,因此还可以扩展到执行远程系统的各种管理任务。 **使用步骤** 1. **添加依赖**:首先,将`jsch-0.1.55.jar`文件添加到项目类路径中,如果是Maven或Gradle项目,需要在相应的构建...

Global site tag (gtag.js) - Google Analytics