【问题标题】:Trying to replicate IBM Mainframe SFTP upload with JSch ChannelSftp尝试使用 JSch ChannelSftp 复制 IBM 大型机 SFTP 上传
【发布时间】:2015-05-24 08:30:40
【问题描述】:

我正在尝试使用 Jsch Sftp Channel 将文件上传到 IBM 大型机,目录必须是“//”,大型机会自动将文件路由到它需要去的地方。

在 IBM 大型机上的 sftp 命令会话中,我可以这样做:

sftp myuser@1.2.3.4
connecting to 1.2.3.4...
myuser@1.2.3.4's password:
sftp> pwd
Remote working directory: /users/home/myuser
sftp> cd //
sftp> pwd
Remote working directory: //
sftp> put "#12345.abcdef.xxx.xxx"
uploading #12345.abcdef.xxx.xxx to //#12345.abcdef.xxx.xxx
#12345.abcdef.xxx.xxx               100%  403   0.4KB/s 00:00

所以我创建了一个 JSch sftp 会话(版本 0.1.5.1)来尝试相同的上传,但它不起作用:

JSch jsch = new JSch();
Session session = jsch.getSession("myuser", "1.2.3.4");
session.setPassword("mypass");
session.connect();
Channel channel = session.openChannel("sftp");
channel.connect();

ChannelSftp sftp = (ChannelSftp)channel;
log.info(" user home pwd " + sftp.pwd());  //prints /users/home/myuser
sftp.cd("//")
log.info(" pwd after cd " + sftp.pwd()); //only prints /
sftp.put(filename);   //get sftp error, no such file

所以我无法通过 JSch 库获得 // 结构。是否需要为 sftp 会话设置某种模式或标志才能知道它在大型机上?

我对我的 /users/home/myuser 目录进行 JSch sftp 会话完全没有问题,只是无法让它进入 //

【问题讨论】:

  • “没有这样的文件”不是意味着filename 有问题吗?无论如何,您没有可以请教的技术支持人员吗?你网站上做过同样事情的人?程序规范?
  • 不幸的是,我们的 z/OS 上没有运行 FTP 服务器,所以我玩不了。尝试一个疯狂的猜测:您是否尝试过在您的 z/OS 文件系统中使用像 //#12345.abcdef.xxx.xxx 这样的“绝对”文件名而不是 cd-ing?
  • 感谢您的建议,@piet.t 我已经尝试了尽可能多的变体,但 sftp 会话无法识别 // 目录
  • 您能否复制/粘贴您的手动传输和您尝试的程序化传输的确切输出(除了敏感信息之外,准确无误)?你的技术人员怎么说?
  • 我终于找到了 IBM 大型机系统的人,但仍然找不到使用 JSch SftpChannel 将文件放在我需要的位置的方法。我最终决定做的是将文件 sftp 到我的主目录,然后创建一个 exec 通道来移动文件。所以像 mv ./SMPL.DATA "//'SMPL.DATA'" 这样的 mv 命令最终在 JSch 执行通道中起作用

标签: sftp jsch mainframe


【解决方案1】:

我对伪文件夹“//”也有类似的问题。 避免这个sftp.cd("//"),最好试试这个sftp.put("/-/"+filename);,这解决了我的问题。希望对您也有帮助。

【讨论】:

  • 我遇到了完全相同的问题,使用 sftp.get("/-/remoteFileName", "localFileName") 为我解决了问题。
【解决方案2】:

不打电话ChannelSftp.cd()试试看:

ChannelSftp sftp = (ChannelSftp)channel;
sftp.put("//" + filename);  // Put to //#12345.abcdef.xxx.xxx

SFTP 协议实际上没有 chdir 类型的操作。在协议级别,不以“/”开头的路径名总是相对于 SFTP 会话开始的目录进行解释。没有协议命令可以更改该起始目录。

SFTP 客户端(包括 Jsch)在客户端模拟类似 chdir 的行为。当你调用ChannelSftp.cd() 时,Jsch 会在本地存储新的远程目录。当您稍后调用 put()get() 并提供不以“/”开头的路径名时,Jsch 会将远程目录添加到文件名前面,并将更改后的名称传递给远程服务器。

我认为发生在你身上的事情是 Jsch 的 chdir 仿真有点太聪明了。当您调用cd("//") 时,它会将“//”折叠成一个“/”并存储它。然后你调用 put() 来获取相对路径名,它会在前面加上你想要的单个“/”而不是双“//”。

根据检查 the Jsch source code,看起来 Jsch 从不​​更改以“/”开头的远程名称。如果你调用put("//somefile"),Jsch 应该使用你指定的名字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 2015-07-18
    • 2013-02-13
    相关资源
    最近更新 更多