最近再開發中遇到需要將文件上傳到linux服務器上,至此整理代碼筆記。
此種連接方法中有考慮到并發問題,在進行創建ftp連接的時候將每一個連接對象存放至
threadlocal<ftp> 中以確保每個線程之間對ftp的打開與關閉互不影響。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
|
package com.test.utils; import java.io.bufferedinputstream; import java.io.file; import java.io.filefilter; import java.io.fileinputstream; import java.io.inputstream; import java.util.arraylist; import java.util.date; import java.util.list; import org.apache.commons.logging.log; import org.apache.commons.logging.logfactory; import com.jcraft.jsch.channelsftp; import com.jcraft.jsch.jsch; import com.jcraft.jsch.session; public class ftp { //打印log日志 private static final log logger = logfactory.getlog(ftp. class ); private static date last_push_date = null ; private session sshsession; private channelsftp channel; private static threadlocal<ftp> sftplocal = new threadlocal<ftp>(); private ftp(string host, int port, string username, string password) throws exception { jsch jsch = new jsch(); jsch.getsession(username, host, port); //根據用戶名,密碼,端口號獲取session sshsession = jsch.getsession(username, host, port); sshsession.setpassword(password); //修改服務器/etc/ssh/sshd_config 中 gssapiauthentication的值yes為no,解決用戶不能遠程登錄 sshsession.setconfig( "userauth.gssapi-with-mic" , "no" ); //為session對象設置properties,第一次訪問服務器時不用輸入yes sshsession.setconfig( "stricthostkeychecking" , "no" ); sshsession.connect(); //獲取sftp通道 channel = (channelsftp)sshsession.openchannel( "sftp" ); channel.connect(); logger.info( "連接ftp成功!" + sshsession); } /** * 是否已連接 * * @return */ private boolean isconnected() { return null != channel && channel.isconnected(); } /** * 獲取本地線程存儲的sftp客戶端 * * @return * @throws exception */ public static ftp getsftputil(string host, int port, string username, string password) throws exception { //獲取本地線程 ftp sftputil = sftplocal.get(); if ( null == sftputil || !sftputil.isconnected()) { //將新連接防止本地線程,實現并發處理 sftplocal.set( new ftp(host, port, username, password)); } return sftplocal.get(); } /** * 釋放本地線程存儲的sftp客戶端 */ public static void release() { if ( null != sftplocal.get()) { sftplocal.get().closechannel(); logger.info( "關閉連接" + sftplocal.get().sshsession); sftplocal.set( null ); } } /** * 關閉通道 * * @throws exception */ public void closechannel() { if ( null != channel) { try { channel.disconnect(); } catch (exception e) { logger.error( "關閉sftp通道發生異常:" , e); } } if ( null != sshsession) { try { sshsession.disconnect(); } catch (exception e) { logger.error( "sftp關閉 session異常:" , e); } } } /** * @param directory 上傳ftp的目錄 * @param uploadfile 本地文件目錄 * */ public void upload(string directory, string uploadfile) throws exception { try {<br> //執行列表展示ls 命令 channel.ls(directory);<br> //執行盤符切換cd 命令 channel.cd(directory); list<file> files = getfiles(uploadfile, new arraylist<file>()); for ( int i = 0 ; i < files.size(); i++) { file file = files.get(i); inputstream input = new bufferedinputstream( new fileinputstream(file)); channel.put(input, file.getname()); try { if (input != null ) input.close(); } catch (exception e) { e.printstacktrace(); logger.error(file.getname() + "關閉文件時.....異常!" + e.getmessage()); } if (file.exists()) { boolean b = file.delete(); logger.info(file.getname() + "文件上傳完畢!刪除標識:" + b); } } } catch (exception e) { logger.error( "【子目錄創建中】:" ,e); //創建子目錄 channel.mkdir(directory); } } //獲取文件 public list<file> getfiles(string realpath, list<file> files) { file realfile = new file(realpath); if (realfile.isdirectory()) { file[] subfiles = realfile.listfiles( new filefilter() { @override public boolean accept(file file) { if ( null == last_push_date ) { return true ; } else { long modifydate = file.lastmodified(); return modifydate > last_push_date.gettime(); } } }); for (file file : subfiles) { if (file.isdirectory()) { getfiles(file.getabsolutepath(), files); } else { files.add(file); } if ( null == last_push_date) { last_push_date = new date(file.lastmodified()); } else { long modifydate = file.lastmodified(); if (modifydate > last_push_date.gettime()) { last_push_date = new date(modifydate); } } } } return files; } } |
總結
以上所述是小編給大家介紹的java遠程連接linux服務器并執行命令及上傳文件,希望對大家有所幫助如果大家有任何疑問歡迎給我留言,小編會及時回復大家的!
原文鏈接:https://www.cnblogs.com/staticking/p/9082648.html