java这边没有很好的封装工具连接ssh,jsch使用起来只是略微方便一点,使用的时候可以封装成工具自己使用
jsch有2种方式和客户端进行交互==ChannelShell和ChannelExec
ChannelShell和ChannelExec区别?
参考:/u013066244/article/details/70911585
ChannelShell
对于ChannelShell,以输入流的形式,提供命令和输入这些命令,这就像在本地计算机上使用交互式shell(它通常用于:交互式使用)
ChannelExec
对于ChannelExec,在调用connect()方法之前这个命令提供了setCommand()方法,并且这些命令作为输入将以输入流的形式被发送出去。(通常,你只能有调用setCommand()方法一次,多次调用只有最后一次生效),但是你可以使用普通shell的分隔符(&,&&,|,||,; , \n, 复合命令)来提供多个命令。这就像在你本机上执行一个shell脚本一样(当然,如果一个命令本身就是个交互式shell,这样就像ChannelShell)
明显:使用命令通道ChannelShell更容易,因为您不需要处理命令提示符。
ChannelShell的使用步骤
一、导入依赖
<dependency> <groupId></groupId> <artifactId>jsch</artifactId> <version>0.1.54</version> </dependency>
二、实现连接
2.1 连接
public class JSchUtil { private String ipAddress; //主机ip private String username; // 账号 private String password; // 密码 private int port; // 端口号 Session session; public JSchUtil(String ipAddress, String username, String password, int port) { = ipAddress; = username; = password; = port; } /** * 连接到指定的ip */ public void connect() { try { JSch jsch = new JSch(); if (port < 0 || port > 65535){ //连接服务器,如果端口号错误,采用默认端口 session = (username, ipAddress); }else { session = (username, ipAddress, port); } //设置登录主机的密码 (password); //如果服务器连接不上,则抛出异常 if (session == null) { throw new Exception("session is null"); } //设置首次登录跳过主机检查 ("StrictHostKeyChecking", "no"); //设置登录超时时间 (3000); } catch (Exception e) { ((),e); } } }
2.2 执行命令(交互式)
/** * 执行相关的命令(交互式) * @param command * @return */ public int execute(String command) throws IOException { int returnCode = 0; ChannelShell channel = null; PrintWriter printWriter = null; BufferedReader input = null; Vector<String> stdout = new Vector<>(); try { //建立交互式通道 channel = (ChannelShell) ("shell"); (); //获取输入 InputStreamReader inputStreamReader = new InputStreamReader(()); input = new BufferedReader(inputStreamReader); //输出 printWriter = new PrintWriter(()); (command); ("exit"); (); ("The remote command is: "); String line; while ((line = ()) != null) { (line); (line); } } catch (Exception e) { ((),e); return -1; }finally { (); (); if (channel != null) { //关闭通道 (); } } return returnCode; } public void close(){ if (session != null) { (); } }
2.3 上传文件
/* * 上传文件到SFTP服务器 * uploadDire 上传到的服务器文件夹 * uploadFileName 上传后的文件名 lala_new.txt * localFileName D:\lala_upload.txt */ public void sftpput(String uploadDire,String uploadFileName,String localFileName) { Channel channel = null; try { //创建sftp通信通道 channel = (Channel) ("sftp"); (1000); ChannelSftp sftp = (ChannelSftp) channel; //进入服务器指定的文件夹 (uploadDire); //列出服务器指定的文件列表 // Vector v = ("/"); // for(int i=0;i<();i++){ // ((i)); // } //以下代码实现从本地上传一个文件到服务器,如果要实现下载,对换以下流就可以了 OutputStream outstream = (uploadFileName); InputStream instream = new FileInputStream(new File(localFileName)); byte b[] = new byte[1024]; int n; while ((n = (b)) != -1) { (b, 0, n); } (); (); (); } catch (Exception e) { (); } finally { (); (); } }
2.4 下载文件
/* * 从SFTP服务器下载文件 * @param ftpHost SFTP IP地址 * @param ftpUserName SFTP 用户名 * @param ftpPassword SFTP用户名密码 * @param ftpPort SFTP端口 * @param ftpPath SFTP服务器中文件所在路径 格式: ftptest/aa * @param localPath 下载到本地的位置 格式:H:/download * @param fileName 文件名称 */ public void downloadSftpFile(String ftpPath, String localPath, String fileName) throws JSchException { String ftpHost = ; String ftpUserName = ; String ftpPassword = ; int ftpPort = ; Session session = null; Channel channel = null; JSch jsch = new JSch(); session = (ftpUserName, ftpHost, ftpPort); (ftpPassword); (100000); Properties config = new Properties(); ("StrictHostKeyChecking", "no"); (config); (); channel = ("sftp"); (); ChannelSftp chSftp = (ChannelSftp) channel; String ftpFilePath = ftpPath + "/" + fileName; String localFilePath = localPath + + fileName; try { (ftpFilePath, localFilePath); } catch (Exception e) { (); } finally { (); (); (); } }
参考:java程序使用Jsch 实现 ssh连接_渣渣苏的博客-****博客_jsch ssh