【问题标题】:JSch SCP file transfer using "exec" channel使用“exec”通道的 JSch SCP 文件传输
【发布时间】:2017-02-25 06:08:15
【问题描述】:

我对 SCP 协议和 JSch 非常陌生。我必须通过 SCP 将文件从远程设备传输到 Android。服务器端开发人员拒绝透露有关他们设备的任何信息,除了文件位置以及可用于通过 SCP 访问它的 root 帐户。

这是我尝试的步骤。

  1. 确认使用JSch,我的Android客户端可以与服务器建立连接。 [完整]

  2. 确认使用 JSch 和 ChannelExec 对象,我可以发送 ls 命令并读取其输出。 [完整]

  3. 确认使用 JSch 和 ChannelSFTP 对象,我可以从设备传输文件。 [失败]

(3)失败的原因似乎是设备(服务器)没有配置为SFTP。制造商一直说 ssh 上的命令如下所示:

scp root@192.168.5.1/usr/WS026.jpeg [targetPath]

他们说上面的命令会将第一个参数复制到客户端的目标路径。那么,除了使用 SFTP,如何在 JSch 通道“exec”中实现它?

【问题讨论】:

标签: java android scp jsch


【解决方案1】:

如果设备只支持SCP,不要尝试使用SFTP,使用SCP。

有一个使用JSch实现SCP下载的官方示例:
http://www.jcraft.com/jsch/examples/ScpFrom.java.html


不要被示例代码中的scp 调用弄糊涂了。这就是 SCP 协议的工作原理。本地 (OpenSSH) scp 在远程服务器上执行 scp(使用特定的 non-public 参数,在本例中为 -f),然后两个实例相互通信。该示例实现了本地scp。用于远程scp 的参数不是用于本地scp 的参数。

另见Explanation for SCP protocol implementation in JSch library

【讨论】:

  • 我浏览了该教程并实际尝试过,但它甚至没有循环。如何设置与上述命令等效的逗号?
  • “它甚至没有循环”是什么意思?你提供了什么输入?你用什么rfile?该示例与您的问题中的命令完全等效(即,这是 scp 命令在内部执行的操作)。
  • 好的。让我直截了当。我使用的命令是“ scp root@192.168.5.1:/usr/WS001.jpeg ”。它在第一个 checkAck 函数中导致 -1,最终完成了任务。我将 lfile 设置为“getCacheDir +”WS001.jpeg”。我做错了什么?
  • 但这不是示例所做的。该示例采用自己的第一个本地参数user@host:rfile 的一种形式,对其进行解析,然后调用远程scp -f rfile。做例子显示的!将服务器的 IP 地址传递给远程 scp 有什么意义?您已经连接到该 IP!我在回答中添加了一些额外信息。
  • 你给我的链接有效。我在第一次访问 scp 时发现了该链接,但认为它没有用,因为它似乎不起作用。好吧,挣扎了两天,我发现设备出现故障。在大多数情况下,它一直无法创建它应该创建的文件。我还发现了一个更简单的库,称为 sshj。我会在接受您的回答时添加一个额外的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-25
  • 2019-02-28
  • 2015-10-25
  • 2016-02-22
  • 2013-12-15
  • 2011-10-09
  • 2016-09-07
相关资源
最近更新 更多