当还必须切换用户时,使用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声明您将无法使用密码,但sudo
WinSCP却是这样。但是,由于您可以完全控制与JSch的会话,因此可以将密码提供给sudo
。
为此,您可以ChannelSftp.start()
在开始实际的SFTP会话之前重写将密码写入通道输入中。
您仍然需要requiretty
关闭该选项,因为SFTP无法与TTY一起使用。
有关使用其他/ root帐户自动执行操作时的一般注意事项,请参阅:
在Linux上使用SSH以root身份自动执行命令
以上是 当还必须切换用户时,使用JSch到SFTP 的全部内容, 来源链接: utcz.com/qa/411241.html