java使用Jsch实现远程操作linux服务器进行文件上传、下载,删除和显示目录信息

1、java使用Jsch实现远程操作linux服务器进行文件上传、下载,删除和显示目录信息。

参考链接:https://www.cnblogs.com/longyg/archive/2012/06/25/2556576.html

https://www.cnblogs.com/longyg/archive/2012/06/25/2561332.html

https://www.cnblogs.com/qdwyg2013/p/5650764.html#top

引入jar包的maven依赖如下所示:

1 <!-- https://mvnrepository.com/artifact/com.jcraft/jsch -->
2 <dependency>
3     <groupId>com.jcraft</groupId>
4     <artifactId>jsch</artifactId>
5     <version>0.1.54</version>
6 </dependency>

具体演示代码如下所示:

  1 package com.fline.aic.utils;
  2
  3 import java.io.BufferedReader;
  4 import java.io.File;
  5 import java.io.FileInputStream;
  6 import java.io.FileNotFoundException;
  7 import java.io.IOException;
  8 import java.io.InputStream;
  9 import java.io.InputStreamReader;
 10 import java.util.Properties;
 11 import java.util.Vector;
 12
 13 import com.jcraft.jsch.Channel;
 14 import com.jcraft.jsch.ChannelExec;
 15 import com.jcraft.jsch.ChannelSftp;
 16 import com.jcraft.jsch.JSch;
 17 import com.jcraft.jsch.JSchException;
 18 import com.jcraft.jsch.Session;
 19 import com.jcraft.jsch.SftpException;
 20
 21 /**
 22  *
 23  * @Description TODO
 24  * @author biehl
 25  * @Date 2018年10月11日 上午10:20:11
 26  *
 27  * 说明:exec用于执行命令;sftp用于文件处理
 28  */
 29 public class SSHRemoteCall {
 30
 31     // 私有的对象
 32     private static SSHRemoteCall sshRemoteCall;
 33
 34     /**
 35      * 私有的构造方法
 36      */
 37     private SSHRemoteCall() {
 38     }
 39
 40     // 懒汉式,线程不安全,适合单线程
 41     public static SSHRemoteCall getInstance() {
 42         if (sshRemoteCall == null) {
 43             sshRemoteCall = new SSHRemoteCall();
 44         }
 45         return sshRemoteCall;
 46     }
 47
 48     // 懒汉式,线程安全,适合多线程
 49     public static synchronized SSHRemoteCall getInstance2() {
 50         if (sshRemoteCall == null) {
 51             sshRemoteCall = new SSHRemoteCall();
 52         }
 53         return sshRemoteCall;
 54     }
 55
 56     private static final int DEFAULT_PORT = 22;// 默认端口号
 57     private int port;// 端口号
 58
 59     private static String ipAddress = "192.168.110.130";// ip地址
 60     private static String userName = "root";// 账号
 61     private static String password = "hadoop";// 密码
 62
 63     private Session session;// JSCH session
 64     private boolean logined = false;// 是否登陆
 65
 66     /**
 67      * 构造方法,可以直接使用DEFAULT_PORT
 68      *
 69      * @param ipAddress
 70      * @param userName
 71      * @param password
 72      */
 73     public SSHRemoteCall(String ipAddress, String userName, String password) {
 74         this(ipAddress, DEFAULT_PORT, userName, password);
 75     }
 76
 77     /**
 78      * 构造方法,方便直接传入ipAddress,userName,password进行调用
 79      *
 80      * @param ipAddress
 81      * @param port
 82      * @param userName
 83      * @param password
 84      */
 85     public SSHRemoteCall(String ipAddress, int port, String userName, String password) {
 86         super();
 87         this.ipAddress = ipAddress;
 88         this.userName = userName;
 89         this.password = password;
 90         this.port = port;
 91     }
 92
 93     /**
 94      * 远程登陆
 95      *
 96      * @throws Exception
 97      */
 98     public void sshRemoteCallLogin(String ipAddress, String userName, String password) throws Exception {
 99         // 如果登陆就直接返回
100         if (logined) {
101             return;
102         }
103         // 创建jSch对象
104         JSch jSch = new JSch();
105         try {
106             // 获取到jSch的session, 根据用户名、主机ip、端口号获取一个Session对象
107             session = jSch.getSession(userName, ipAddress, DEFAULT_PORT);
108             // 设置密码
109             session.setPassword(password);
110
111             // 方式一,通过Session建立连接
112             // session.setConfig("StrictHostKeyChecking", "no");
113             // session.connect();
114
115             // 方式二,通过Session建立连接
116             // java.util.Properties;
117             Properties config = new Properties();
118             config.put("StrictHostKeyChecking", "no");
119             session.setConfig(config);// 为Session对象设置properties
120             // session.setTimeout(3000);// 设置超时
121             session.connect();//// 通过Session建立连接
122
123             // 设置登陆状态
124             logined = true;
125         } catch (JSchException e) {
126             // 设置登陆状态为false
127             logined = false;
128             throw new Exception(
129                     "主机登录失败, IP = " + ipAddress + ", USERNAME = " + userName + ", Exception:" + e.getMessage());
130         }
131     }
132
133     /**
134      * 关闭连接
135      */
136     public void closeSession() {
137         // 调用session的关闭连接的方法
138         if (session != null) {
139             // 如果session不为空,调用session的关闭连接的方法
140             session.disconnect();
141         }
142
143     }
144
145     /**
146      * 执行相关的命令
147      *
148      * @param command
149      * @throws IOException
150      */
151     public void execCommand(String command) throws IOException {
152         InputStream in = null;// 输入流(读)
153         Channel channel = null;// 定义channel变量
154         try {
155             // 如果命令command不等于null
156             if (command != null) {
157                 // 打开channel
158                 //说明:exec用于执行命令;sftp用于文件处理
159                 channel = session.openChannel("exec");
160                 // 设置command
161                 ((ChannelExec) channel).setCommand(command);
162                 // channel进行连接
163                 channel.connect();
164                 // 获取到输入流
165                 in = channel.getInputStream();
166                 // 执行相关的命令
167                 String processDataStream = processDataStream(in);
168                 // 打印相关的命令
169                 System.out.println("1、打印相关返回的命令: " + processDataStream);
170             }
171         } catch (JSchException e) {
172             e.printStackTrace();
173         } catch (IOException e) {
174             e.printStackTrace();
175         } catch (Exception e) {
176             e.printStackTrace();
177         } finally {
178             if (in != null) {
179                 in.close();
180             }
181             if (channel != null) {
182                 channel.disconnect();
183             }
184         }
185
186     }
187
188     /**
189      * 对将要执行的linux的命令进行遍历
190      *
191      * @param in
192      * @return
193      * @throws Exception
194      */
195     public String processDataStream(InputStream in) throws Exception {
196         StringBuffer sb = new StringBuffer();
197         BufferedReader br = new BufferedReader(new InputStreamReader(in));
198         String result = "";
199         try {
200             while ((result = br.readLine()) != null) {
201                 sb.append(result);
202                 // System.out.println(sb.toString());
203             }
204         } catch (Exception e) {
205             throw new Exception("获取数据流失败: " + e);
206         } finally {
207             br.close();
208         }
209         return sb.toString();
210     }
211
212     /**
213      * 上传文件 可参考:https://www.cnblogs.com/longyg/archive/2012/06/25/2556576.html
214      *
215      * @param directory
216      *            上传文件的目录
217      * @param uploadFile
218      *            将要上传的文件
219      */
220     public void uploadFile(String directory, String uploadFile) {
221         try {
222             // 打开channelSftp
223             ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp");
224             // 远程连接
225             channelSftp.connect();
226             // 创建一个文件名称问uploadFile的文件
227             File file = new File(uploadFile);
228             // 将文件进行上传(sftp协议)
229             // 将本地文件名为src的文件上传到目标服务器,目标文件名为dst,若dst为目录,则目标文件名将与src文件名相同.
230             // 采用默认的传输模式:OVERWRITE
231             channelSftp.put(new FileInputStream(file), directory, ChannelSftp.OVERWRITE);
232             // 切断远程连接
233             channelSftp.exit();
234             System.out.println("2、" + file.getName() + " 文件上传成功.....");
235         } catch (JSchException e) {
236             e.printStackTrace();
237         } catch (SftpException e) {
238             e.printStackTrace();
239         } catch (FileNotFoundException e) {
240             e.printStackTrace();
241         }
242
243     }
244
245     /**
246      * 下载文件 采用默认的传输模式:OVERWRITE
247      *
248      * @param src
249      *            linux服务器文件地址
250      * @param dst
251      *            本地存放地址
252      * @throws JSchException
253      * @throws SftpException
254      */
255     public void fileDownload(String src, String dst) throws JSchException, SftpException {
256         // src 是linux服务器文件地址,dst 本地存放地址
257         ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp");
258         // 远程连接
259         channelSftp.connect();
260         // 下载文件,多个重载方法
261         channelSftp.get(src, dst);
262         // 切断远程连接,quit()等同于exit(),都是调用disconnect()
263         channelSftp.quit();
264         // channelSftp.disconnect();
265         System.out.println("3、" + src + " ,下载文件成功.....");
266     }
267
268     /**
269      * 删除文件
270      *
271      * @param directory
272      *            要删除文件所在目录
273      * @param deleteFile
274      *            要删除的文件
275      * @param sftp
276      * @throws SftpException
277      * @throws JSchException
278      */
279     public void deleteFile(String directoryFile) throws SftpException, JSchException {
280         // 打开openChannel的sftp
281         ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp");
282         // 远程连接
283         channelSftp.connect();
284         // 删除文件
285         channelSftp.rm(directoryFile);
286         // 切断远程连接
287         channelSftp.exit();
288         System.out.println("4、" + directoryFile + " 删除的文件.....");
289     }
290
291     /**
292      * 列出目录下的文件
293      *
294      * @param directory
295      *            要列出的目录
296      * @param sftp
297      * @return
298      * @throws SftpException
299      * @throws JSchException
300      */
301     public Vector listFiles(String directory) throws JSchException, SftpException {
302         ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp");
303         // 远程连接
304         channelSftp.connect();
305         // 显示目录信息
306         Vector ls = channelSftp.ls(directory);
307         System.out.println("5、" + ls);
308         // 切断连接
309         channelSftp.exit();
310         return ls;
311     }
312
313     public static void main(String[] args) {
314         // 连接到指定的服务器
315         try {
316             // 1、首先远程连接ssh
317             SSHRemoteCall.getInstance().sshRemoteCallLogin(ipAddress, userName, password);
318             // 打印信息
319             System.out.println("0、连接192.168.110.130,ip地址: " + ipAddress + ",账号: " + userName + ",连接成功.....");
320
321             // 2、执行相关的命令
322             // 查看目录信息
323             // String command = "ls /home/hadoop/package ";
324             // 查看文件信息
325             // String command = "cat /home/hadoop/package/test ";
326             // 查看磁盘空间大小
327             // String command = "df -lh ";
328             // 查看cpu的使用情况
329             // String command = "top -bn 1 -i -c ";
330             // 查看内存的使用情况
331             String command = "free ";
332             SSHRemoteCall.getInstance().execCommand(command);
333
334             // 3、上传文件
335             String directory = "/home/hadoop/package/poi.xlsx";// 目标文件名
336             String uploadFile = "E:\\poi.xlsx";// 本地文件名
337             SSHRemoteCall.getInstance().uploadFile(directory, uploadFile);
338
339             // 4、下载文件
340             // src 是linux服务器文件地址,dst 本地存放地址,采用默认的传输模式:OVERWRITE
341             //test为文件名称哈
342             String src = "/home/hadoop/package/test";
343             String dst = "E:\\";
344             SSHRemoteCall.getInstance().fileDownload(src, dst);
345
346             // 5、刪除文件
347             String deleteDirectoryFile = "/home/hadoop/package/test";
348             SSHRemoteCall.getInstance().deleteFile(deleteDirectoryFile);
349
350             // 6、展示目录下的文件信息
351             String lsDirectory = "/home/hadoop/package";
352             SSHRemoteCall.getInstance().listFiles(lsDirectory);
353
354             // 7、关闭连接
355             SSHRemoteCall.getInstance().closeSession();
356         } catch (Exception e) {
357             // 打印错误信息
358             System.err.println("远程连接失败......");
359             e.printStackTrace();
360         }
361     }
362
363 }

运行效果如下所示:

0、连接192.168.110.130,ip地址: 192.168.110.130,账号: root,连接成功.....
1、打印相关返回的命令:              total       used       free     shared    buffers     cachedMem:       1030616     840144     190472          0      34672     636228-/+ buffers/cache:     169244     861372Swap:      2064376          0    2064376
2、poi.xlsx 文件上传成功.....
3、/home/hadoop/package/test ,下载文件成功.....
4、/home/hadoop/package/test 删除的文件.....
5、[drwxrwxrwx    2 root     root         4096 Oct 12 05:37 ., -rw-r--r--    1 root     root         4770 Oct 12 05:37 poi.xlsx, drwx------   27 hadoop   hadoop       4096 Oct 11 21:05 ..]

待续.....

原文地址:https://www.cnblogs.com/biehongli/p/9780652.html

时间: 2024-12-20 01:20:59

java使用Jsch实现远程操作linux服务器进行文件上传、下载,删除和显示目录信息的相关文章

java操作FTP,实现文件上传下载删除操作

上传文件到FTP服务器: /** * Description: 向FTP服务器上传文件 * @param url FTP服务器hostname * @param port FTP服务器端口,如果默认端口请写-1 * @param username FTP登录账号 * @param password FTP登录密码 * @param path FTP服务器保存目录 * @param filename 上传到FTP服务器上的文件名 * @param input 输入流 * @return 成功返回t

Android与Asp.Net Web服务器的文件上传下载BUG汇总【更新】

遇到的问题: 1.java.io.IOException: open failed: EINVAL (Invalid argument)异常,在模拟器中的sd卡创建文件夹和文件时报错 出错原因可能是:(1)文件名称中含有不符合规范的字符,比如“:”,“?”或者空格等.(2)需要先创建文件夹目录再创建文件,不能直接创建文件. 2. android.os.NetworkOnMainThreadException异常,从服务器请求数据后,写入文件时报错 出错原因:在主线程内执行了访问http的操作,最

linux命令行模式下对FTP服务器进行文件上传下载

参考源:点击这里查看 1. 连接ftp服务器 格式:ftp [hostname| ip-address]a)在linux命令行下输入: ftp 192.168.1.1 b)服务器询问你用户名和密码,分别输入用户名和相应密码,待认证通过即可. 2. 下载文件 下载文件通常用get和mget这两条命令.a) get 格式:get [remote-file] [local-file]将文件从远端主机中传送至本地主机中.如要获取远程服务器上/usr/your/1.htm,则 ftp> get /usr/

java中TCP两个例子大写服务器和文件上传

大写服务器的实例: package com.core.net; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; class

“通过jumpserver远程登录linux服务器,rz上传文件速度过慢”问题的解决

问题: windows通过jumpserver远程登录到linux服务器,使用rz上传jar包,速度太慢(10k以内). 解决方案: 思路:通过ssh直接登录远程服务器 1.secureCRT-> tools->create public key 2.新建登录远程服务器的session 3.设置session的property,将authentication中的password选项去除,并将publickey选项的properties设置成identity 4.通过jumpserver登录远程

linux下将文件上传到svn服务器

linux下将文件上传到svn服务器 摘自:https://blog.csdn.net/sky_yangge/article/details/41544773 2014年11月27日 16:47:57 sky样 阅读数 7526 1.首先将svn的所指定的目录checkout到本地目录下: 使用svn co +服务器的地址(path),输入服务器的密码即可,此时会自动在本地目录下同步服务器你所指定的目录及里面所有的文件(其中co 即是 checkout的简写) 例如:svn co hettp:/

关于使用SecureCRT 实现 WIN7 与 Linux 双向通信的问题及文件上传下载

Linux 版本:Cent 6.5 X86 VMware workstation 10.0 win7 Ultimate x86 ,Linux 均可以正常链接网络[采用桥接方式] 遇到问题: win7 可以 ping 通linux及网关,linux不能ping通网关及win7,但能链接网络. 前提: 需要手动配置linux的IP为静态,WIN7的可以随意,但是一般在一个网段(不然配置较复杂了),保证可以正常通信访问. 解决: 通过手动改ip及相关配置的方法之后,仍然未能ping通,改链接方式为NA

java web 文件上传下载

文件上传下载案例: 首先是此案例工程的目录结构: 处理上传: FileUploadServlet.java 1 package fnz.fileUploadTest; 2 3 import java.io.File; 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.io.PrintWriter; 7 import java.text.SimpleDateFormat; 8 import java.

28、java文件上传下载、邮件收发

文件上传下载 前台: 1. 提交方式:post 2. 表单中有文件上传的表单项: <input type="file" /> 3. 指定表单类型: 默认类型:enctype="application/x-www-form-urlencoded" 文件上传类型:multipart/form-data FileUpload 文件上传功能开发中比较常用,apache也提供了文件上传组件! FileUpload组件: 1. 下载源码 2. 项目中引入jar文件