У меня возникла странная проблема с SCP на cygwin,
scp $HOME/deploy.sh user@host:/tmp
работает нормально, файлы копируются в удаленную систему.
Но та же команда внутри test.sh
не сработает. Я вижу, что вывод команды scp такой же, как и последний стандартный вывод, но когда я перехожу к удаленной системе, этих файлов нет!
test.sh:
#!/bin/sh
scp $HOME/deploy.sh user@host:/tmp
Похоже, это как-то связано с cygwin. Такое поведение не наблюдается в системе Linux. Но, к сожалению, мои настройки для разработчиков находятся в Windows и не могут легко переключаться.
Я только что получил такое поведение, и проблема заключалась в переносе строки. (^ M)
Попробуйте преобразовать файл сценария с помощью dos2unix. Это решило для меня.
Я думаю, что в некоторых сценариях (много раз в зависимости от ОС) поведение scp интерпретирует конечные косые черты каталога по-разному, в зависимости от ситуации. На самом деле это ВСЕГДА относится к таким утилитам, как rsync, но scp обычно зависит от ОС.
Из-за этого, если я использую scp в скрипте для копирования файла в удаленный каталог и хочу, чтобы он сохранил исходное имя файла, я всегда добавляю в конец каталога косую черту. Я только что подтвердил, что это работает:
Сценарий Cygwin Bash:
#!/bin/bash
scp /cygdrive/c/users/jamey/desktop/program.sh 10.0.0.254:/tmp/
Удаленная проверка:
$ ssh 10.0.0.254
Password:
~/.bash_profile LOADED.
cnu326bxdx:~ Jamey$ ls -l /tmp/program.sh
-rwxr-xr-x 1 Jamey wheel 77 Sep 24 09:51 /tmp/program.sh
Еще одна важная вещь, которую следует отметить, - это разрешения для каталога, в который вы пытаетесь скопировать. Если у вашего пользователя нет прав доступа к каталогу, в который вы пытаетесь скопировать, очевидно, что файл не будет записан. Это должно быть очевидно, но иногда самые очевидные предостережения создают самые большие проблемы.
И последнее (в чем я ни в коем случае не профессионал, но предлагаю только в качестве еще одного возможного предложения) заключается в том, что если у вас есть пробелы в любом каталоге, в который разрешается ваша переменная $ HOME, эта переменная может быть расширена в оболочке, что позволяет команде работать правильно. В качестве альтернативы, если вы не заключите переменную в двойные кавычки в сценарии, она может не расширяться, но это обычно вызывает видимую ошибку, что заставляет меня думать, что этот конкретный сценарий не соответствует действительности. В любом случае, вы никогда не ошибетесь, заключив переменные в двойные кавычки.
Я почти уверен, что это опечатка в вашем сценарии. Проверять
1) создайте каталог в / tmp. Скажем, script_test.
2) cd to script_test и запустите ваш скрипт, используя sh / path / to / script.
3) убедитесь, что файлы отсутствуют на удаленном сервере
4) проверьте каталог script_test на наличие вновь созданных файлов.
Это может быть ошибка, но я не уверен.
Проблема не наблюдается с:
scp $HOME/deploy.sh user@host:/tmp/deploy.sh
Проблема возникает, когда в качестве места назначения указано имя папки:
scp $HOME/deploy.sh user@host:/tmp