程序介绍
要在Java中远程SSH登录服务器并检测文件是否存在于指定路径中,你可以使用JSch库来实现。下面是两个java示例程序都可以满足需求,一个是通过SFTP的方式一个是远程执行shell命令的方式进行检测,可以使用JSch库远程登录服务器,并在指定路径中批量检测文件是否存在,首先,确保已经将JSch库添加到项目的类路径中。
通过SFTP方式
import com.jcraft.jsch.*;
public class RemoteFileChecker {
public static void main(String[] args) {
String host = "服务器IP";
int port = 22;
String username = "用户名";
String password = "密码";
String remotePath = "/path/to/files/";
String[] fileNames = {"file1.txt", "file2.txt", "file3.txt"};
JSch jsch = new JSch();
try {
Session session = jsch.getSession(username, host, port);
session.setPassword(password);
session.setConfig("StrictHostKeyChecking", "no");
session.connect();
Channel channel = session.openChannel("sftp");
channel.connect();
ChannelSftp sftpChannel = (ChannelSftp) channel;
for (String fileName : fileNames) {
String filePath = remotePath + fileName;
try {
sftpChannel.stat(filePath);
System.out.println(fileName + " exists.");
} catch (SftpException e) {
System.out.println(fileName + " does not exist.");
}
}
sftpChannel.disconnect();
session.disconnect();
} catch (JSchException e) {
e.printStackTrace();
}
}
}
在上述代码中,我们首先定义了远程服务器的主机名(IP地址)、端口、用户名、密码,以及要检查的文件所在的远程路径。然后,我们遍历每个文件名,在远程服务器上构建文件的完整路径。我们使用JSch库来建立SSH会话并连接到远程服务器。然后,我们打开一个SFTP通道,并使用stat方法尝试获取文件的属性。如果获取成功,则表示文件存在于指定路径中;否则,文件不存在。
请确保替换host、port、username、password为你的服务器信息,并将remotePath变量替换为你要检测的远程路径,将fileNames数组替换为你要检测的文件名列表。
需要注意的是,该示例程序仅适用于SFTP协议,如果你需要使用其他协议(例如SSH执行命令),请参考JSch库的文档和示例代码进行相应的调整。
通过远程shell方式
import com.jcraft.jsch.*;
public class SSHExample {
public static void main(String[] args) {
String host = "your_remote_host";
String user = "your_username";
String password = "your_password";
String remoteDirectory = "/path/to/remote/directory";
String[] fileNames = {"file1.txt", "file2.txt", "file3.txt"};
try {
JSch jsch = new JSch();
Session session = jsch.getSession(user, host, 22);
session.setPassword(password);
// Avoid asking for key confirmation
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
System.out.println("Connected");
ChannelExec channelExec = (ChannelExec) session.openChannel("exec");
channelExec.setCommand("cd " + remoteDirectory + " && ls -1 " + String.join(" ", fileNames));
channelExec.setErrStream(System.err);
InputStream in = channelExec.getInputStream();
channelExec.connect();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line.trim() + " exists");
}
channelExec.disconnect();
session.disconnect();
} catch (JSchException | IOException e) {
e.printStackTrace();
}
}
}
在上述代码中,host、user、password 分别表示远程服务器的主机地址、登录用户名和登录密码。remoteDirectory 表示远程路径,fileNames 数组存储了需要检查的文件列表。通过在 SSH 连接的基础上使用 ChannelExec 执行命令,首先进入指定目录,然后使用 ls 命令批量检查文件是否存在。
请注意,上述代码前提是使用 SSH 协议连接到远程服务器,并执行基于 Unix/Linux 系统的命令。在使用 JSch 连接 SSH 服务器之前,确保已经添加了 JSch 库到你的项目中。同时,根据实际情况修改远程服务器的连接信息和路径信息。