Цитата, ускользающая от rsync из bash

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

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

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

rsync -avz -e "ssh -p 222" dir/ [email protected]: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 менее раздражающим способом)


person Thingomy    schedule 30.08.2010    source источник


Ответы (4)


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

>cat ~/.ssh/config
Host shortName
   Hostname [actual url or ip]
   User otherUserName
   Port 22
   ForwardAgent yes
   ForwardX11 yes
person second    schedule 30.08.2010
comment
Это, безусловно, сработает в качестве временной меры и вполне может стать выбранным решением. - person Thingomy; 30.08.2010

Я думаю, что они должны выглядеть так:

rsyncargs="ssh -p 222"

rsync -avz -e $rsyncargs $src $dst

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

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

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

person Dennis Williamson    schedule 30.08.2010
comment
Я специально не хочу этого делать (хотя я сделаю это, если придется, с потерей некоторых функций), потому что я хочу иметь возможность вызывать любые случайные аргументы rsync таким образом. Например: --modify-window=3 - person Thingomy; 30.08.2010
comment
@Thingomy: Тогда вам, вероятно, нужно поместить свои аргументы в массив: rsyncargs=('-e' 'ssh -p 222'); rsync -avz ${rsyncargs[@]} $src $dst. И см. BashFAQ/050. - person Dennis Williamson; 30.08.2010

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

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

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

person anon    schedule 26.04.2013

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

less_quote_rsyncargs=$(echo $rsyncargs)
rsync -avz $less_quote_rsyncargs $src $dst
person Chen Levy    schedule 30.08.2010