使用场景
有时候我们希望对某服务器进行一定的操作但又不想在上边装一个服务端程序
解决方案
我找了一些java ssh2的工具,如:Jsch、SSHD、SSHJ。最终选择先试试Jsch来实现远程执行shell指令
吐槽
Jsch 的实例代码和源码写的和shi一样,也可能是我水平不够,理解不了(狗头)
我写了个工具类可以直接使用,生产环境谨慎使用
import com.jcraft.jsch.*; import java.io.InputStream; public class ShellUtil { private final Session session; public ShellUtil(String host, String user, String password, int port) throws JSchException { this.session = new JSch().getSession(user, host, port); session.setPassword(password); session.setConfig("PreferredAuthentications", "password"); //首选通过密码进行身份认证,否则建立连接会花费很久 session.setConfig("StrictHostKeyChecking", "no"); //不进行严格的主机密钥检查 } public String exec(String command) throws Exception { session.connect(); Channel channel = session.openChannel("exec"); ((ChannelExec) channel).setCommand(command); channel.setInputStream(null); ((ChannelExec) channel).setErrStream(System.err); InputStream in = channel.getInputStream(); // Exec thread 启动 channel.connect(10000); //有些 command 可能执行很长时间, 读取执行结果时需要等待 StringBuilder res = new StringBuilder(); byte[] tmp = new byte[1024]; while (in.available() > 0 || !channel.isClosed()) { if (!channel.isClosed()) Thread.sleep(200); res.append(new String(tmp, 0, in.read(tmp, 0, 1024))); } channel.disconnect(); session.disconnect(); return res.toString(); } public static void main(String[] args) throws Exception { ShellUtil shellUtil = new ShellUtil("server", "root", "root", 22); System.out.println(shellUtil.exec("docker ps")); } }
我写的代码也和shi一样,请大佬多指教