1. ホーム
  2. エラー

Jschエラー: com.jcraft.jsch.JSchException: セッションがダウンしています。

2022-02-27 21:25:22

機密情報の漏洩を防ぐために、和解ファイルの内容をフィルタリングする自動化タスクを書いている最中に、興味深いエラーが報告された。

com.jcraft.jsch.JSchException: セッションがダウンしています......。

jsch パッケージの最新版を使用して、サーバー ファイルを読み取り、ストリーム形式で機密情報をフィルタリングし、新しい調整用 txt ファイルを生成するために jsch を使用しています。

調べてみると、sftpのアクセスパスはパーミッションが777ではなく、750か755である必要があり、私のアクセスパスは/home/tomcat/dataで、意外にもすべて777:でした。

ディレクトリのパーミッションを変更し、接続に成功したら、サーバーファイルを読み込んで情報をフィルタリングし、新しい調整用ファイルを生成するコードを投稿するだけです。

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.LineNumberReader;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.ccb.ipsp.tools.DocDirect;
import com.ccb.ipsp.tools.PropertyUtils;
import com.ccb.ipsp.tools.SerialNumberTool;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch;
import com.jcraft.jsch;

public class SshUtil {

	private static final Logger log = LoggerFactory.getLogger(SshUtil.class);

	public String ip = PropertyUtils.getValue("PUBLIC_LOGIN_IP");
	public Integer port = Integer.parseInt(PropertyUtils.getValue("PUBLIC_LOGIN_PORT"));
	public String username = PropertyUtils.getValue("PUBLIC_LOGIN_USER");
	public String password = PropertyUtils.getValue("PUBLIC_LOGIN_PASSWORD");
	public String schoolProjectId = PropertyUtils.getValue("SCHOOL_PROJECT_ID");

	/**
	 * Use JSch package to implement SFTP download and upload files
	 * 
	 * @param ip
	 * Host IP
	 * @param user
	 * Host login username
	 * @param psw
	 * host login password
	 * @param port
	 * host ssh2 login port, if default, pass -1
	 */
	public void sshSftp() throws Exception {
		Session session = null;
		Channel channel = null;
		JSch jsch = new JSch();
		if (port <= 0) {
			// Connect to the server, using the default port
			session = jsch.getSession(username, ip);
		} else {
			// connect to the server using the specified port
			session = jsch.getSession(username, ip, port);
		}

		// If the server cannot connect, throw an exception
		if (session == null) {
			throw new Exception("session is null");
		}

		// Set the password of the login host
		session.setPassword(password); // set the password

		// Set the prompt for the first login, optional values: (ask | yes | no)
		session.setConfig("StrictHostKeyChecking", "no");
		// Set the login timeout
		session.connect(60000);

		try {
			// Create a sftp communication channel
			channel = session.openChannel("sftp");
			channel.connect(1000);
			ChannelSftp sftp = (ChannelSftp) channel;
			log.info("Connection successful - ");
			// Access the folder specified by the server
			sftp.cd(PropertyUtils.getValue("PUBLIC_FILE_PATH"));

			/*
			 * // List the list of files specified by the server 
			 * Vector v = sftp.ls("*.dat"); 
			 * for (int i = 0; i < v.size(); i++) {
			 * String fileName = String.valueOf(v.get(i));
			 * log.info("first" + i + "The reconciliation file is: " + fileName); }
			 */
			// LCS_A3011_PAYMENT_FLOW.dat is the payment flow
			String path = PropertyUtils.getValue("PUBLIC_FILE_PATH") + "/LCS_A3011_PAYMENT_FLOW.dat";
			System.err.println("Enter path to payment reconciliation file =====" + path);

			String txtPayName = new DocDirect().returnDoc() + File.separator + PropertyUtils.getValue("SCHOOL_PAY_NAME");

			InputStream intstream = sftp.get(path); // byte stream
			InputStreamReader isr = new InputStreamReader(intstream); // byte stream
			BufferedReader br = new BufferedReader(isr); // buffered stream
			try {
				LineNumberReader reader = new LineNumberReader(br);
				String txt = null;
				while ((txt = reader.readLine()) ! = null) {
					if (txt.contains("213135003")) {
						System.out.println("====\n" + txt);
						appendMethod(txtPayName, txt);
					}
				}
				log.info("Payment data filtering complete! ");
				reader.close();
				br.close();

			} catch (FileNotFoundException e) {
				e.printStackTrace();
			}

			// LCS_A3011_ITEM_FLOW.dat is the detailed flow
			String pathList = PropertyUtils.getValue("PUBLIC_FILE_PATH") + "/LCS_A3011_ITEM_FLOW.dat";
			System.err.println("Enter the path to the itemized reconciliation file =====" + pathList);

			String txtPayNameList = new DocDirect().returnDoc() + File.separator + PropertyUtils.getValue("SCHOOL_PAY_LIST_NAME");
		
			InputStream intstreamList = sftp.get(pathList); // byte stream
			InputStreamReader isrList = new InputStreamReader(intstreamList); // byte stream
			BufferedReader brList = new BufferedReader(isrList); // buffered stream
			try {
				LineNumberReader reader = new LineNumberReader(brList);
				String txt = null;
				while ((txt = reader.readLine()) ! = null) {
					if (txt.contains("213135003")) {
						System.out.println("details -----\n" + txt);
						appendMethod(txtPayNameList, txt);
					}
				}
				log.info("Detail data filtering complete! ");
				reader.close();
				br.close();

			} catch (FileNotFoundException e) {
				e.printStackTrace();
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			session.disconnect();
			channel.disconnect();
		}
	}

	// Append write
	public static void appendMethod(String fileName, String content) {
		try {
			// open a file writer, the second parameter true in the constructor means to write the file in append form
			FileWriter writer = new FileWriter(fileName, true);
			writer.write(content + "\n");
			writer.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	// Reconcile the file to filter the retention
	public void DownCheckFile() {
		SshUtil sshUtil = new SshUtil();
		try {
			sshUtil.sshSftp();
		} catch (Exception e) {
			e.printStackTrace();
		}
		log.info(SerialNumberTool.ConcreteDate() + "Day reconciliation file filtering retention successful");
	}

	public static void main(String args[]) {

	}

}