Выход из квотирования - rsync из bash - PullRequest
3 голосов
/ 30 августа 2010

Обычно я достаточно быстро справляюсь с этим, но это головная боль.

У меня есть сценарий оболочки, который загружает некоторую информацию о том, где подключиться и как из текстового файла, это делается с помощью команды чтения. Это работает. Он хранит аргументы для отправки на RSync в переменной $ rsyncargs.

Я хочу использовать RSync arg -e, который используется для передачи подробностей в ssh, в моем случае номер порта, например:

rsync -avz -e "ssh -p 222" dir/ bob@server.com:dir/

строка в текстовом файле выглядит так:

-e "ssh -p 222"

строка bash должна выглядеть примерно так:

rsync -avz $rsyncargs $src $dst

это все работает, за исключением того, что кавычки путаются, и я получаю

sending incremental file list
rsync: link_stat "/dir/to/shell/script/222"" failed: No such file or directory (2)

Так что он пытается проанализировать содержимое кавычек на неправильной стадии. Я пробовал список различных механизмов экранирования (таких как обратная косая черта в текстовом файле и использование одинарных кавычек вместо двойных кавычек в нескольких местах и ​​т. Д.), Но все это, похоже, заканчивается одинаково катастрофическими (хотя и не всегда идентичными) сообщениями об ошибках.

Будем весьма благодарны за любые предложения (либо для решения исходной проблемы, либо для изменения порта ssh менее раздражающим способом)

Ответы [ 4 ]

1 голос
/ 30 августа 2010

Я думаю, что они должны выглядеть следующим образом:

rsyncargs="ssh -p 222"

rsync -avz -e $rsyncargs $src $dst

Я предполагаю, что у вас есть:

rsyncargs='-e "ssh -p 222"'

, что, вероятно, является причиной ошибок, потому чтодвойные кавычки и параметр option не являются частью аргумента.

1 голос
/ 30 августа 2010

вы всегда можете установить порт в вашей конфигурации ssh:

>cat ~/.ssh/config
Host shortName
   Hostname [actual url or ip]
   User otherUserName
   Port 22
   ForwardAgent yes
   ForwardX11 yes
0 голосов
/ 26 апреля 2013

У меня была проблема, подобная этой, я обнаружил, что это работает, без кавычек в опции внешней оболочки и экранирует нужные ей пробелы:

rsync -azvxSe ssh \ -p $ PORT $ src $ SERVER:/ $ dst

У меня также нет пробела между -p и $ PORT, что, я думаю, полностью решит проблему ОП.

0 голосов
/ 30 августа 2010

Я согласен с @Dennis Williamson, и ответ таков: вам, вероятно, нужно меньше цитат, а не больше, то есть:

less_quote_rsyncargs=$(echo $rsyncargs)
rsync -avz $less_quote_rsyncargs $src $dst
...