我在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);
问题是现在网站政策发生了变化。我不再允许以该用户(上面的userName)直接登录。我必须首先以我的个人用户身份登录,然后su进入有权访问我想要SFTP的文件的用户。
我认为无论如何我都不能重构上面的代码来实现这一点,所以我开始考虑使用shell或exec通道。到目前为止我没有取得什么成功,似乎无法在网上找到任何例子,所以我非常感谢任何建议或指示正确的方向。非常感谢。
答案 0 :(得分:2)
我认为你不能直接用JSch做这件事。但是通过对其代码的一些修改,它可能是可行的。
请注意,我的回答是假设服务器是基于* nix的(由您对su
的引用支持的内容)并使用OpenSSH SFTP服务器。
你必须打开SSH" exec"通道,执行类似:
sudo /bin/sftp-server
但是在该频道之上,您需要构建ChannelSftp
实例,而不是ChannelExec
。
因此,您需要实施Session.openChannel
- 类似方法,即开启exec
频道,但为其创建ChannelSftp
。
有些背景,请参阅how it's possible to do sudo
with WinSCP SFTP client。
请注意,虽然常见问题解答声称,您无法使用sudo
的密码,但这对WinSCP来说是正确的。但是,由于您可以完全控制JSch的会话,因此您可以将密码提供给sudo
。
为此,在启动实际的SFTP会话之前,您可以覆盖ChannelSftp.start()
以将密码写入通道输入。
您仍然需要关闭requiretty
选项,因为SFTP无法与TTY一起使用。
通常需要切换用户以自动执行某些操作,这是设计糟糕的标志。您应该直接使用可以访问该任务所需资源的帐户。正确的解决方案是设置专用私钥,仅具有任务所需的权限。