当还必须切换用户

时间:2017-03-23 12:24:54

标签: 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);

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

我认为无论如何我都不能重构上面的代码来实现这一点,所以我开始考虑使用shell或exec通道。到目前为止我没有取得什么成功,似乎无法在网上找到任何例子,所以我非常感谢任何建议或指示正确的方向。非常感谢。

1 个答案:

答案 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一起使用。

通常需要切换用户以自动执行某些操作,这是设计糟糕的标志。您应该直接使用可以访问该任务所需资源的帐户。正确的解决方案是设置专用私钥,仅具有任务所需的权限。