我正在尝试使用Jsch Sftp Channel将文件上传到IBM Mainframe,目录必须是" //",其中大型机会自动将文件路由到需要去的地方
在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会话没有任何问题,只是无法将其转到//
答案 0 :(得分:1)
在不致电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应使用您指定的名称。
答案 1 :(得分:1)
我有一个与伪问题“//”类似的问题。
避免使用此sftp.cd("//")
并更好地尝试此sftp.put("/-/"+filename);
,这样就解决了我的问题。希望也能帮助你。