Я написал программу, которая читает все файлы в каталоге после переключения на конкретного пользователя, используя библиотеку jsch
.
Но проблема в том, что программа читает и отображает все файлы изисходный каталог пользователя / вместо каталога su
пользователя (/apps/my-app/
).
Подводя итог, программа делает следующее:
- Открыть
session
- Открыть
exec
канал - Выполнить команду
su
и cd
в каталоге, файлы которого мы хотим перечислить - Открыть
sftp
канал - Список файловв текущем каталоге, который должен быть тем, к которому мы
cd
добавили ранее - Закрыть
sftp
канал - Закрыть
exec
канал - Закрыть
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