Ошибка SftpChannel.rename, но команда mv работает.Какие могут быть возможные причины? - PullRequest
2 голосов
/ 03 мая 2019

Я сталкиваюсь с этой проблемой, когда sftpChannel.rename завершается с не очень полезной ошибкой, и я не могу выяснить причину. Файл не существует в месте назначения. Разрешения в порядке, потому что команда mv работает. Я перечислю разрешение как файла, так и папки. У кого-нибудь есть идеи? Мне не нужно использовать каталог, но он расстраивает, не зная, почему он не работает.

Это кусок тестового кода. RemoteFile - это просто оболочка для sftpChannel, поэтому я могу проверить, существует ли файл / dir, и удалить файл или создать 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

1 Ответ

3 голосов
/ 03 мая 2019

Бьюсь об заклад, ваши исходные и конечные пути находятся на разных томах, и что сервер Sftp не может справиться с перемещением файла между томами, потому что это не простое переименование.

Сделайте df -lk или иным образом выясните, какие точки монтирования находятся над каждым из ваших двух местоположений. Я думаю, это единственное, что могло бы объяснить это, и, глядя на то, насколько различны верхние уровни ваших двух путей, это кажется вполне возможным.

Если это так, я бы подумал, что вы захотите использовать удаленное выполнение команд для этого переименования / перемещения ... ssh foo@bar.com mv xxx yyy. Я не уверен, что это то, что вы подразумеваете под «mv», или вы делаете это локально на сервере прямо сейчас.

...