#java #linux #sftp #sudo #jsch
#java #unix #sftp #sudo #jsch
Вопрос:
Я использую JSch в Java-клиенте для подключения к удаленному серверу и получения некоторых файлов с использованием SFTP. Следующий код у меня работает нормально: —
JSch ssh = new JSch();
JSch.setConfig(FileTransferConstants.STRICT_HOST_KEY_CHECKING, FileTransferConstants.NO);
Session session = ssh.getSession(userName, host, port);
session.setPassword(password);
session.connect();
Channel channel = session.openChannel(FileTransferConstants.SFTP);
channel.connect();
ChannelSftp sftp = (ChannelSftp) channel;
sftp.cd(remoteDirectoryPath);
sftp.lcd(localDirectoryPath);
sftp.get(remoteDirectoryPath remoteFileName, remoteFileName);
Проблема в том, что в настоящее время произошла смена политики сайта. Мне больше не разрешено входить в систему напрямую как этому пользователю (имя пользователя указано выше). Сначала я должен войти в систему как мой личный пользователь, а затем войти в систему как пользователь, у которого есть доступ к файлам, которые я хочу передать SFTP.
Я не думаю, что в любом случае я могу реорганизовать приведенный выше код для достижения этой цели, и поэтому я начал рассматривать возможность использования канала shell или exec вместо этого. До сих пор у меня было мало успехов, и, похоже, я не могу найти никаких примеров в Интернете, поэтому я был бы очень благодарен за любые советы или указания в правильном направлении. Большое спасибо.
Комментарии:
1. Спасибо вам, Мартин, и я обязательно посмотрю на эту статью. Я тоже ценю ваше беспокойство, но разработчики политики заверяют меня, что до тех пор, пока моему пользователю законно разрешено подавать иск к этому пользователю, это не противоречит политике. Я просто хотел бы, чтобы они позволили мне войти в систему напрямую как этому пользователю — но, увы, нет!
2. Смогли ли вы решить эту проблему, Джон? если да , то каким образом ? Потому что я тоже сталкиваюсь с такой же проблемой.
Ответ №1:
Я не думаю, что вы можете сделать это напрямую с помощью JSch. Но с некоторой модификацией его кода это, вероятно, выполнимо.
Обратите внимание, что мой ответ предполагает, что сервер основан на * nix (что подтверждается вашей ссылкой на su
) и использует SFTP-сервер OpenSSH.
Вы должны открыть SSH-канал «exec», чтобы выполнить что-то вроде:
sudo /bin/sftp-server
Но поверх этого канала вам нужно создать ChannelSftp
экземпляр, а не ChannelExec
.
Итак, вам нужно будет реализовать Session.openChannel
подобный метод, который откроет exec
канал, но создаст ChannelSftp
для него.
Для получения дополнительной информации см. Как это можно сделать sudo
с помощью WinSCP SFTP client.
Обратите внимание, что, хотя в FAQ утверждается, что вы не сможете использовать пароль для sudo
, это верно для WinSCP. Но поскольку у вас есть полный контроль над сеансом с помощью JSch, вы можете передать пароль sudo
.
Для этого вы можете переопределить ChannelSftp.start()
для записи пароля на вход канала перед запуском фактического сеанса SFTP.
Вам все еще нужно, чтобы requiretty
опция была отключена, поскольку SFTP не может работать с TTY.
Общие соображения при автоматизации операций с использованием другой учетной записи / root см.:
Разрешение автоматического выполнения команд от имени root в Linux с использованием SSH