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

IT小君   2021-11-15T13:46:01

我在 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 通道。到目前为止,我几乎没有成功,似乎无法在网上找到任何示例,因此我将非常感谢您提供正确方向的任何建议或指示。非常感谢。

点击广告,支持我们为你提供更好的服务
评论(1)
IT小君

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

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


您必须打开 SSH "exec" 通道,才能执行以下操作:

sudo /bin/sftp-server

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

所以你需要实现Session.openChannel类似的方法,这将打开exec通道,但ChannelSftp为它创建


有关一些背景知识,请参阅如何sudo使用 WinSCP SFTP 客户端

请注意,虽然常见问题解答声称您将无法为 使用密码,但sudo对于 WinSCP 来说确实如此。但是,由于您可以完全控制 JSch 的会话,因此您可以将密码提供给sudo.

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

您仍然需要requiretty关闭选项,因为 SFTP 无法与 TTY 一​​起使用。


有关使用不同/root 帐户自动化操作时的一般注意事项,请参阅:
允许使用 SSH 在 Linux 上以 root 身份自动执行命令

2021-11-15T13:46:01   回复