Сбой ant.scp с копированием с удаленного сервера на удаленный сервер не поддерживается для локального назначения - PullRequest
0 голосов
/ 18 февраля 2019

Я использую Gradle для копирования файлов с удаленных машин на локальный компьютер.Ниже приведен фрагмент.

    ant.scp(file: "${userName}:${pwd}@${hostName}:${remoteFileAbsPath}", todir: localFileDirPath, trust: "true")

Приведенный выше фрагмент отлично работает в оболочке Windows, но завершается ошибкой в ​​оболочке Ubuntu со следующей ошибкой.

Caused by: : Copying from a remote server to a remote server is not supported.
at org.apache.tools.ant.taskdefs.optional.ssh.Scp.execute(Scp.java:229)
at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
at org.gradle.api.internal.project.ant.BasicAntBuilder.nodeCompleted(BasicAntBuilder.java:77)...

Обычный scp с терминала работает нормально, как и ожидалось.Только ant.scp терпит неудачу только в среде Linux.Объявление taskdef: ant.taskdef(name: 'scp', classname: 'org.apache.tools.ant.taskdefs.optional.ssh.Scp', classpath:somepath).Любые указатели / ссылки на причину проблемы будут полезны.

Во время отладки я только что выяснил, что переменная localFileDirPath имеет символ @.Например, имя localDir является «sample @ localDirectory».Теперь, я думаю, ant.scp предполагает, что «sample @ localDirectory» - это еще один удаленный сервер, благодаря которому сообщение об ошибке имеет смысл.Когда я тестирую с другим localFileDirPath без @, ant.scp работает просто отлично.Теперь, в моем случае, локальный каталог будет иметь @.Итак, я выясняю, как избежать этого персонажа.

1 Ответ

0 голосов
/ 19 февраля 2019

Согласно документации ant для задачи scp , используйте localToDir вместо toDir, когда в пути есть @ символов:

  ant.scp(file: "${userName}:${pwd}@${hostName}:${remoteFileAbsPath}", localtodir: localFileDirPath, trust: "true")

с localToDir вам не нужно экранировать символ @, просто отправьте его как есть.

...