Как получить список всех файлов в каталоге в Unix, используя библиотеку jsch после смены пользователя? - PullRequest
0 голосов
/ 27 сентября 2019

Я написал программу, которая читает все файлы в каталоге после переключения на конкретного пользователя, используя библиотеку jsch.

Но проблема в том, что программа читает и отображает все файлы изисходный каталог пользователя / вместо каталога su пользователя (/apps/my-app/).

Подводя итог, программа делает следующее:

  1. Открыть session
  2. Открыть exec канал
  3. Выполнить команду su и cd в каталоге, файлы которого мы хотим перечислить
  4. Открыть sftp канал
  5. Список файловв текущем каталоге, который должен быть тем, к которому мы cd добавили ранее
  6. Закрыть sftp канал
  7. Закрыть exec канал
  8. Закрыть session

SuListFilesMain.java

public class SuListFilesMain {

    static String cmd = "echo " + DecryptionUtil.decrypt(Constants.userPasswd) + " | su jackm -c \"cd /apps/my-app/ ; pwd\"";

    public static void main(String[] args) throws JSchException, SftpException, Exception {
        //open session
        Session session = SessionUtil.openSession();

        //open exec channel, switch to su and execute command cd
        Channel execChannel = ChannelUtil.openChannel(session, cmd);
        //capture cmd output
        InputStream output = execChannel.getInputStream();
        String result = CharStreams.toString(new InputStreamReader(output));
        //CORRECT: PRINTS /APPS/MY-APP (See Output below)
        System.out.println(result); 

        //open sftp channel
        ChannelSftp sftpChannel = ChannelUtil.openSftpChannel(session);
        //ls
        List<String> allFiles = new ArrayList<>();
        Vector<LsEntry> vector = sftpChannel.ls(".");
        for (LsEntry entry : vector) {
            allFiles.add(entry.getFilename());
        }
        //INCORRECT: PRINTS FROM / DIRECTORY INSTEAD OF /APPS/MY-APP (See Output below)
        System.out.println(allFiles); 
        //close sftp channel
        sftpChannel.exit();

        //close exec channel
        ChannelUtil.closeChannel(execChannel);

        //close session
        SessionUtil.closeSession(session);
    }

}

SessionUtil.java

public class SessionUtil {

    private static final Properties envProps = ReadPropertyUtil.readAllProperties("application.properties");

    public static Session openSession() throws JSchException {
        JSch jSch = new JSch();
        String host = envProps.getProperty("host");
        String username = envProps.getProperty("username");
        String pwd = DecryptionUtil.decrypt(envProps.getProperty("pwd.encrypted"));
        Session session = jSch.getSession(username, host, 22);
        Properties config = new Properties();
        config.put("StrictHostKeyChecking", "no");
        session.setConfig(config);
        session.setPassword(pwd);
        System.out.println("Connecting SSH to " + host + " - Please wait for few seconds... ");
        session.connect();
        System.out.println("Connected!\n");
        return session;
    }

    public static void closeSession(Session session) {
        if (null != session) {
            session.disconnect();
            System.out.println("\nDisconnected channel and session");
        }
    }

}

ChannelUtil.java

public class ChannelUtil {

    public static Channel openChannel(Session session, String cmd) throws JSchException {
        Channel channel = session.openChannel("exec");
        ((ChannelExec) channel).setCommand(cmd);
        channel.connect();
        return channel;
    }

    public static ChannelSftp openSftpChannel(Session session) throws JSchException {
        Channel channel = session.openChannel("sftp");
        channel.connect();
        ChannelSftp sftpChannel = (ChannelSftp) channel;
        return sftpChannel;
    }

    public static void closeChannel(Channel channel) {
        System.out.println("Closing channel...");
        if (null != channel) {
            channel.setInputStream(null);
            channel.disconnect();
        }
    }

}

Выход:

Connected!

/apps/my-app

[local, lib64, ., nfs, etc, boot, srv, home, proc, sys, media, lib, bin, run]
Closing channel...

Disconnected channel and session

1 Ответ

0 голосов
/ 30 сентября 2019

SSH-каналы полностью независимы.Выполнение su на одном канале не оказывает никакого влияния на другие каналы.

Вам нужно будет выполнить su на канале SFTP, что является довольно сложной задачей, частично описанной в моем ответе на:
Использование JSch для SFTP, когда необходимо также переключить пользователя

...