Назад | Перейти на главную страницу

Странное поведение SCP через файл .sh

У меня возникла странная проблема с 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