我在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 )。我必须首先以个人用户的身份登录,然后再登录到访问我想要的SFTP文件的用户。
我不认为无论如何,我可以重构上面的代码来实现这一点,所以我已经开始考虑使用shell或exec通道代替。到目前为止,我并没有取得什么成功,我似乎在网上找不到任何例子,所以我非常感谢你在正确的方向上提供任何建议或建议。非常感谢。
发布于 2017-03-23 14:25:54
我不认为您可以直接用JSch来完成这个任务。但是,通过对其代码进行一些修改,它可能是可行的。
请注意,我的回答假设服务器基于*nix(您对su__的引用支持的内容),并使用OpenSSH SFTP服务器。
您必须打开SSH "exec“通道,以执行以下操作:
sudo /bin/sftp-server但是在这个通道的顶部,您需要构建ChannelSftp实例,而不是ChannelExec。
因此,您需要实现Session.openChannel-like方法,该方法将打开exec通道,但为其创建ChannelSftp。
有关一些背景,请参见 with WinSCP SFTP client。
请注意,虽然FAQ声称您将不能使用密码的sudo,这是对WinSCP。但是,由于您完全控制了JSch的会话,所以您可以将密码提供给sudo。
为此,在启动实际的SFTP会话之前,您可以重写ChannelSftp.start()将密码写入通道输入。
您仍然需要关闭requiretty选项,因为SFTP无法使用TTY。
有关使用不同/根帐户自动操作时的一般注意事项,请参见:
Allowing automatic command execution as root on Linux using SSH
https://stackoverflow.com/questions/42975994
复制相似问题