当前位置: 首页 > 面试题库 >

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

平航
2023-03-14
问题内容

我在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身份自动执行命令



 类似资料:
  • 问题内容: 我最近开始研究用于远程部署的结构。我需要切换到差异用户(从我登录时所用的用户),并且无法弄清楚。有可能吗?我当前的用户没有权限。 我尝试更改以下环境变量 但是结构不等待’newUser’的密码输入并且失败。 更新: 正如JF Sebastian所建议的那样,它可以工作,但它会为每台服务器的每个命令提示密码,这违背了自动化的目的。Fabric中是否有任何方法可以根据提示传递相同的值(在这

  • 关于在最新版本的GCC和Clang中编译有几个问题:实验::filessystems链接器错误 但是现在< code>filesystem已经被c 17接受,所以不再需要< code>experimental或< code>-lstdc fs标志,对吗? 错了,我甚至不能 只给了我< code >实验版本,我怎么能包括正式接受的版本呢?

  • 在不需要任何向后兼容的Java代码中使用LocalDate、LocalTime等是否有任何明确的警告或缺点,如果有的话--它们是什么? 我正在寻找类似“当前的EE库X和Y不能正确使用LocalDate”或“这个非常有用的模式被LocalTime破坏了”等等的东西。 (这里有原题供参考) 在Java8中,引入了一个新的时间API,即Java.time.localdate等,但Java.util.da

  • 我有一个结构,下面的运算符声明: 仅此运算符就可以将不可为null的结构隐式转换为int,但尝试隐式转换其可为null的对应结构仍会引发编译错误: 无法隐式转换类型

  • 我已经运行了数据库,并且可以使用swing GUI连接到它。但当我尝试运行我的应用程序时,我得到一个启动错误。以下是详细内容: 1:错误- 信息:初始化Spring根WebApplicationContext[ERROR][pool-2-thread-1 05:20:08](JDBCExceptionReporter.java:LogException:101)无法从基础数据库获取连接![错误][

  • 本文向大家介绍React必须使用JSX吗?相关面试题,主要包含被问及React必须使用JSX吗?时的应答技巧和注意事项,需要的朋友参考一下 首先解释一下什么是JSX,是JavaScript的语法扩展,可以让我们编写像html一样的代码,在JSX中使用的”元素“,不局限于HTML中的元素,可以是任何一个react组件。 react判断一个元素是HTML元素还是react 组件的原则就是看第一个字母是