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

我在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);

问题在于,现在已经更改了站点策略。我不再被允许直接以该用户身份登录(上面的用户名)。我必须先以个人用户身份登录,然后才能进入有权访问我要SFTP的文件的用户。

我不认为我可以重构以上代码来实现这一目标,因此我开始考虑使用Shell或exec通道。到目前为止,我收效甚微,似乎无法在网络上找到任何示例,因此,我对任何向正确方向提出的建议或建议深表感谢。非常感谢。

回答:

我认为您不能直接使用JSch来执行此操作。但是通过对其代码进行一些修改,它可能是可行的。

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


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

sudo /bin/sftp-server

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

因此,您将需要实现Session.openChannel类似方法,该方法将打开exec通道,但ChannelSftp为此创建一个。


有关某些背景知识,请参见如何sudo使用WinSCP

SFTP客户端。

请注意,尽管FAQ声明您将无法使用密码,但sudoWinSCP却是这样。但是,由于您可以完全控制与JSch的会话,因此可以将密码提供给sudo

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

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


有关使用其他/ root帐户自动执行操作时的一般注意事项,请参阅:

在Linux上使用SSH以root身份自动执行命令

以上是 当还必须切换用户时,使用JSch到SFTP 的全部内容, 来源链接: utcz.com/qa/411241.html

回到顶部