我在 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”通道,才能执行如下操作:
sudo /bin/sftp-server
但在该渠道之上,您需要构建ChannelSftp
实例,不是ChannelExec
.
所以你需要实施Session.openChannel
-类似的方法,将打开exec
渠道,但创建ChannelSftp
for it.
有关一些背景,请参阅怎么可能做到sudo使用 WinSCP SFTP 客户端 https://winscp.net/eng/docs/faq_su#sudo.
请注意,虽然常见问题解答声称您将无法使用密码sudo
,对于 WinSCP 来说也是如此。但是,由于您可以完全控制 JSch 的会话,因此您可以将密码提供给sudo
.
为此,您可以覆盖ChannelSftp.start()
在开始实际的 SFTP 会话之前将密码写入通道输入。
你仍然需要requiretty
选项关闭,因为 SFTP 无法与 TTY 一起使用。
有关使用不同/root 帐户自动执行操作时的一般注意事项,请参阅:
允许使用 SSH 在 Linux 上以 root 身份自动执行命令 https://superuser.com/q/1481318/213663
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)