2010-08-30 6 views
3

Я нормально работаю над этими вещами достаточно быстро, но это - головная боль.Quoatation escaping - rsync from bash

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

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

rsync -avz -e "ssh -p 222" dir/ [email protected]:dir/ 

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

-e "ssh -p 222" 

линия Баш должно быть что-то вроде:

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 порт изменял в менее раздражающем способе)

ответ

1

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

>cat ~/.ssh/config 
Host shortName 
    Hostname [actual url or ip] 
    User otherUserName 
    Port 22 
    ForwardAgent yes 
    ForwardX11 yes 
+1

Это, безусловно, будет работать как временная мера и вполне может оказаться выбранным решением. – Thingomy

1

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

rsyncargs="ssh -p 222" 

rsync -avz -e $rsyncargs $src $dst 

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

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

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

+0

Я специально не хочу этого делать (хотя я буду, если придется, с потере некоторой функциональности), потому что я хочу иметь возможность вызвать любые случайные rsync args таким образом. Например: --modify-window = 3 – Thingomy

+0

@Thingomy: тогда вам, вероятно, придется поместить свои аргументы в массив: 'rsyncargs = ('- e' 'ssh -p 222'); rsync -avz $ {rsyncargs [@]} $ src $ dst'. И посмотрите [BashFAQ/050] (http: //mywiki.wooledge.орг/BashFAQ/050). –

0

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

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

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

Rsync -azvxSe SSH \ -p $ PORT $ ЦСИ $ SERVER:/$ ДСТ

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