scp命令在java的processbuilder中不起作用

xghobddn  于 2021-07-07  发布在  Java
关注(0)|答案(1)|浏览(531)

我在通过java应用程序运行scp命令时遇到了一个奇怪的问题。
我应该用“-i”选项运行这个scp命令,在这里,我传递低权限用户(对于示例用户b)的identify键,而我的java进程由另一个登录用户(对于示例用户a)运行。
这是当我的命令由登录用户“user a”运行时,它在应用程序日志中的外观。
scp-l 10000-o batchmode=yes-o loglevel=debug-i“pathtoidentitykeyofuserb”remoteuser@remotehost:“pathtoremotefile”“localpathfcopiedfile”
此命令在我的java应用程序中失败,错误为stderremoji places:warningidentity file not accessible:no such file or directory。标准:remoteuser@remotehost:权限被拒绝(公钥、密码、键盘交互)。
让我疑惑的是,同样的命令在cygwin命令行或windows命令行中运行时运行得非常完美。
我后来添加了“-o loglevel=debug”,以便调试scp命令的内部日志,以确定scp命令本身的日志信息(在windows命令行中运行时)与通过java应用程序的process builder运行时的任何差异。
我注意到,虽然scp(在windows命令行中通过用户a运行)的内部日志记录说它接收与用户b完全相同的标识键,但在java应用程序中通过processbuilder运行scp时,情况并非如此。scp的内部调试日志显示,即使在显式传递用户b的标识密钥之后,它也尝试使用用户a的默认私钥进行身份验证。
请找到以下几个截图。
从windows cmd在scp的内部日志中加载的标识键。

通过window cmd验证成功

从java应用程序的process builder加载到scp内部日志中的标识键。


我不明白为什么scp不尝试使用用户b的显式传递的标识密钥进行身份验证,而是尝试使用其默认标识密钥(用户a)进行身份验证。
但是,从所附的屏幕截图可以明显看出,在windows命令行中,它使用显式传递的标识密钥进行身份验证,因此身份验证成功。
我请求Maven帮我解决这个问题。
如何使process builder考虑另一个用户传递的标识键的标识键,而不是用户初始化它的默认键?
任何帮助都将不胜感激。
下面是我创建process builder的过程。


我创建了一个字符串列表,它基本上保存了用字符串列表构造的scp命令,然后将此列表作为参数直接传递给processbuilder的command方法。

nsc4cvqm

nsc4cvqm1#

我现在已经设法解决了这个问题,方法是创建一个临时文件,然后向其中写入scp命令,并在processbuilder中运行这个临时文件,而不是在processbuilder中直接运行scp命令。
我没有将用于构造scp命令的字符串列表传递给processbuilder,而是创建一个临时文件,然后将scp命令写入其中,最后通过传递给javaprocessbuilder来运行这个临时文件。
这个解决方案现在似乎对我有效。

相关问题