java - 当还必须切换用户时使用 JSch 到 SFTP

标签 java unix sftp sudo jsch

我在 Java 客户端中使用 JSch 连接到远程服务器并使用 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);

问题是现在网站政策发生了变化。我不再被允许直接作为该用户(上面的用户名)登录。我必须首先以我的个人用户身份登录,然后 su 进入有权访问我想要 SFTP 的文件的用户。

我不认为无论如何我可以重构上面的代码来实现这个,所以我开始考虑使用 shell 或 exec channel 来代替。到目前为止,我收效甚微,似乎无法在网上找到任何示例,所以我将非常感谢任何正确方向的建议或指示。非常感谢。

最佳答案

我不认为你可以直接用 JSch 来做这件事。但通过对其代码进行一些修改,它可能是可行的。

请注意,我的回答假设服务器是基于 *nix 的(由您对 su 的引用支持)并使用 OpenSSH SFTP 服务器。


您必须打开 SSH“exec” channel ,才能执行如下操作:

sudo /bin/sftp-server

但在该 channel 之上,您需要构建 ChannelSftp 实例,而不是 ChannelExec

因此您需要实现类似Session.openChannel 的方法,这将打开exec channel ,但会为其创建ChannelSftp


有关一些背景,请参阅 how it's possible to do sudo with WinSCP SFTP client .

请注意,虽然 FAQ 声称您将无法为 sudo 使用密码,但对于 WinSCP 来说确实如此。但是由于您可以完全控制与 JSch 的 session ,您可以将密码提供给 sudo

为此,在开始实际的 SFTP session 之前,您可以覆盖 ChannelSftp.start() 以将密码写入 channel 输入。

您仍然需要关闭 requiretty 选项,因为 SFTP 不能与 TTY 一​​起工作。


有关使用不同/root 帐户进行自动化操作时的一般注意事项,请参阅:
Allowing automatic command execution as root on Linux using SSH

关于java - 当还必须切换用户时使用 JSch 到 SFTP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57786536/

相关文章:

c# - 使用 SSH.NET 从 SFTP 服务器下载一个特定文件

java - 通过 SFTP 从服务器读取巨大动态文件的末尾

java - 如果在 HotSpot JVM 中启用了偏向锁定,对象的哈希码存储在哪里?

linux - UNIX 从变量中删除字符

java - 通过 XPath 使用标记和未标记数据

linux - 文件存档的分布式解压缩

python - 有没有一种方法可以在没有 os.chmod 的情况下为 *nix 系统在 Python 中创建可执行文件?

java - 启动应用程序时无法创建bean

java - 我的代码中出现内存不足异常

java - 该代码块之外的匿名内部类和字段