SftpChannel.rename 失败但 mv 命令有效。可能的原因是什么?
SftpChannel.rename failed but mv command works. What could be possible causes?
我 运行 遇到了这个问题,其中 sftpChannel.rename 失败,错误不是很有帮助,我无法找出原因。目标中不存在文件。权限很好,因为 mv 命令有效。我将列出文件和文件夹的权限。有人知道吗?我不必使用该目录,但不知道为什么会失败,这令人沮丧。
这是一段测试代码。 RemoteFile 只是 sftpChannel 的包装器,因此我可以检查 file/dir 是否存在并在必要时删除文件或创建目录:
String file = "/u01/apps/tpms/applstg2/ken_test/TestFile";
String destDir = "/usr/local/jboss/server/applstg2/backup/"; // Caused by: 4: Failure
//String destDir = "/u01/apps/tpms/applstg2/ken_test/backup/"; // Success
RemoteFile remoteFile = new RemoteFile(file, ssh.openSftpChannel());
remoteFile.rename(destDir + "/TestFile");
这是失败的行:
sftpChannel.rename(file, newName);
这是跟踪(我删除了所有 JUnit 和 sun.reflect 跟踪):
Error renaming file /u01/apps/tpms/applstg2/ken_test/TestFile to /usr/local/jboss/server/applstg2/backup//TestFile
at com.framework.remote.RemoteFile.rename(RemoteFile.java:82)
at com.framework.remote.RemoteFileTest.renameFile(RemoteFileTest.java:56)
Caused by: 4: Failure
at com.jcraft.jsch.ChannelSftp.throwStatusError(ChannelSftp.java:2846)
at com.jcraft.jsch.ChannelSftp.rename(ChannelSftp.java:1923)
at com.framework.remote.RemoteFile.rename(RemoteFile.java:79)
权限:
drwxrwxr-x 2 applstg2 applstg2 4096 May 2 22:09 ken_test
-rw-rw-r-- 1 applstg2 applstg2 61595086 May 1 18:05 TestFile
drwxrwxr-x 2 applstg2 applstg2 4096 May 2 21:57 backup
我敢打赌您的源路径和目标路径位于不同的卷上,并且 Sftp 服务器无法处理跨卷移动文件,因为这不是简单的重命名。
执行 df -lk
或以其他方式找出两个位置上方的挂载点。这是我能想到的唯一可以解释这一点的东西,看看你的两条路径的顶层有多么不同,这似乎很有可能。
如果是这种情况,我认为您会希望使用远程命令执行来执行此操作 rename/move...ssh foo@bar.com mv xxx yyy
。我不确定这是否是您所说的 'mv',或者您现在是否正在服务器上进行本地操作。
我 运行 遇到了这个问题,其中 sftpChannel.rename 失败,错误不是很有帮助,我无法找出原因。目标中不存在文件。权限很好,因为 mv 命令有效。我将列出文件和文件夹的权限。有人知道吗?我不必使用该目录,但不知道为什么会失败,这令人沮丧。
这是一段测试代码。 RemoteFile 只是 sftpChannel 的包装器,因此我可以检查 file/dir 是否存在并在必要时删除文件或创建目录:
String file = "/u01/apps/tpms/applstg2/ken_test/TestFile";
String destDir = "/usr/local/jboss/server/applstg2/backup/"; // Caused by: 4: Failure
//String destDir = "/u01/apps/tpms/applstg2/ken_test/backup/"; // Success
RemoteFile remoteFile = new RemoteFile(file, ssh.openSftpChannel());
remoteFile.rename(destDir + "/TestFile");
这是失败的行:
sftpChannel.rename(file, newName);
这是跟踪(我删除了所有 JUnit 和 sun.reflect 跟踪):
Error renaming file /u01/apps/tpms/applstg2/ken_test/TestFile to /usr/local/jboss/server/applstg2/backup//TestFile
at com.framework.remote.RemoteFile.rename(RemoteFile.java:82)
at com.framework.remote.RemoteFileTest.renameFile(RemoteFileTest.java:56)
Caused by: 4: Failure
at com.jcraft.jsch.ChannelSftp.throwStatusError(ChannelSftp.java:2846)
at com.jcraft.jsch.ChannelSftp.rename(ChannelSftp.java:1923)
at com.framework.remote.RemoteFile.rename(RemoteFile.java:79)
权限:
drwxrwxr-x 2 applstg2 applstg2 4096 May 2 22:09 ken_test
-rw-rw-r-- 1 applstg2 applstg2 61595086 May 1 18:05 TestFile
drwxrwxr-x 2 applstg2 applstg2 4096 May 2 21:57 backup
我敢打赌您的源路径和目标路径位于不同的卷上,并且 Sftp 服务器无法处理跨卷移动文件,因为这不是简单的重命名。
执行 df -lk
或以其他方式找出两个位置上方的挂载点。这是我能想到的唯一可以解释这一点的东西,看看你的两条路径的顶层有多么不同,这似乎很有可能。
如果是这种情况,我认为您会希望使用远程命令执行来执行此操作 rename/move...ssh foo@bar.com mv xxx yyy
。我不确定这是否是您所说的 'mv',或者您现在是否正在服务器上进行本地操作。