我在 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 通道。到目前为止,我几乎没有成功,似乎无法在网上找到任何示例,因此我将非常感谢您提供正确方向的任何建议或指示。非常感谢。
我不认为你可以直接用 JSch 来做到这一点。但是通过对其代码进行一些修改,它可能是可行的。
请注意,我的回答假设服务器是基于 *nix 的(由您对 的引用支持
su
)并使用 OpenSSH SFTP 服务器。您必须打开 SSH "exec" 通道,才能执行以下操作:
但是在该通道之上,您需要构建
ChannelSftp
实例,而不是ChannelExec
.所以你需要实现
Session.openChannel
类似的方法,这将打开exec
通道,但ChannelSftp
为它创建。有关一些背景知识,请参阅如何
sudo
使用 WinSCP SFTP 客户端。请注意,虽然常见问题解答声称您将无法为 使用密码,但
sudo
对于 WinSCP 来说确实如此。但是,由于您可以完全控制 JSch 的会话,因此您可以将密码提供给sudo
.为此
ChannelSftp.start()
,在开始实际 SFTP 会话之前,您可以覆盖将密码写入通道输入。您仍然需要
requiretty
关闭该选项,因为 SFTP 无法与 TTY 一起使用。有关使用不同/root 帐户自动化操作时的一般注意事项,请参阅:
允许使用 SSH 在 Linux 上以 root 身份自动执行命令