還不會用Java操作遠(yuǎn)程服務(wù)器?
作者:了不起
JSch 是一個純 Java 實現(xiàn)的 SSH2 客戶端庫,它允許 Java 應(yīng)用程序通過 SSH 協(xié)議連接到 SSH 服務(wù)器,并執(zhí)行命令、傳輸文件等。
java操作服務(wù)器
JSch 是一個純 Java 實現(xiàn)的 SSH2 客戶端庫,它允許 Java 應(yīng)用程序通過 SSH 協(xié)議連接到 SSH 服務(wù)器,并執(zhí)行命令、傳輸文件等。JSch 是基于 SSH-2 協(xié)議的一個開源項目,廣泛用于需要遠(yuǎn)程執(zhí)行命令或文件傳輸?shù)?Java 應(yīng)用程序中。
主要特點(diǎn)
- 純 Java 實現(xiàn):不依賴于任何本地庫或第三方工具,完全用 Java 編寫,因此具有很好的跨平臺性。
- SSH2 協(xié)議支持:支持 SSH-2 協(xié)議,包括密鑰認(rèn)證、密碼認(rèn)證、公鑰認(rèn)證等多種認(rèn)證方式。
- 命令執(zhí)行:允許通過 SSH 連接執(zhí)行遠(yuǎn)程命令,并獲取命令的輸出結(jié)果。
- 文件傳輸:支持 SFTP(SSH File Transfer Protocol)協(xié)議,用于在客戶端和服務(wù)器之間安全地傳輸文件。
- 端口轉(zhuǎn)發(fā):支持本地端口轉(zhuǎn)發(fā)和遠(yuǎn)程端口轉(zhuǎn)發(fā),可以用于創(chuàng)建安全的隧道。
- 會話管理:提供會話管理功能,包括會話的創(chuàng)建、認(rèn)證、關(guān)閉等。
使用場景
- 自動化部署:在自動化部署腳本中,使用 JSch 連接到遠(yuǎn)程服務(wù)器,執(zhí)行部署命令。
- 遠(yuǎn)程監(jiān)控:通過 SSH 連接遠(yuǎn)程服務(wù)器,執(zhí)行監(jiān)控命令,并獲取監(jiān)控數(shù)據(jù)。
- 文件同步:使用 SFTP 協(xié)議安全地同步文件到遠(yuǎn)程服務(wù)器或從遠(yuǎn)程服務(wù)器下載文件。
- 遠(yuǎn)程執(zhí)行腳本:在遠(yuǎn)程服務(wù)器上執(zhí)行腳本或程序,并獲取執(zhí)行結(jié)果。
引入依賴
<dependency>
<groupId>com.github.mwiede</groupId>
<artifactId>jsch</artifactId>
<version>0.2.19</version>
</dependency>
創(chuàng)建連接
獲取會話
public Session getSession(){
if( this.session != null ){
return this.session;
}
try {
jsch.getSession(property.getUsername(), property.getHost(), property.getPort());
session = jsch.getSession(property.getUsername(), property.getHost(), property.getPort());
session.setPassword(property.getPassword());
session.setConfig("StrictHostKeyChecking","no");// 設(shè)置第一次登陸的時候提示
session.setConfig("max_input_buffer_size","1024");//
Properties sshConfig = new Properties();
sshConfig.put("StrictHostKeyChecking", "no");
session.setConfig(sshConfig);
session.connect();
return session;
} catch (JSchException e) {
throw new RuntimeException(e);
}
}
獲取Sftp連接
public static ChannelSftp getSftp(Session session){
try {
Channel channel = session.openChannel("sftp");
channel.connect();
ChannelSftp sftp = (ChannelSftp) channel;
sftp.setFilenameEncoding("UTF-8");
return sftp;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
獲取命令執(zhí)行連接
public static ChannelExec getExec(Session session){
try {
Channel channel = session.openChannel("exec");
// channel.connect();
ChannelExec exec = (ChannelExec) channel;
return exec;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
執(zhí)行腳本
public static void execCommand(ChannelExec exec,String command){
try {
exec.setCommand(command);
InputStream in = exec.getInputStream();
exec.connect();
BufferedReader inputReader = new BufferedReader(new InputStreamReader(in, "UTF8"));
String inputLine;
while ((inputLine = inputReader.readLine()) != null) {
System.out.println(inputLine);
}
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
exec.disconnect();
}
}
執(zhí)行文件下載
public static void fileDownload(ChannelSftp sftp, String path,String dist){
try {
InputStream is = sftp.get(path);
FileUtils.copyInputStreamToFile(is, FileUtils.getFile(dist,FilenameUtils.getName(path)));
is.close();
} catch (SftpException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
測試
獲取會話
public static Session getSession(){
ConnectProperty property = new ConnectProperty();
property.setHost("...");
property.setPort(22);
property.setUsername("...");
property.setPassword("...");
ConnectHelper helper = new ConnectHelper(property);
return helper.getSession();
}
下載文件
public static void download(Session session){
ChannelSftp sftp = ConnectHelper.getSftp(session);
ConnectHelper.fileDownload(sftp,"/home/test/1.txt","E:\\home\\tmp");
}
執(zhí)行命令
public static void execCommand(Session session){
ChannelExec exec = ConnectHelper.getExec(session);
ConnectHelper.execCommand(exec, "pwd");
責(zé)任編輯:武曉燕
來源:
Java技術(shù)指北