2010-08-30 4 views
3

Normalement, je travaille ces choses assez rapidement, mais celui-ci est un mal de tête.Quoatation échapper - rsync de bash

J'ai un script shell qui charge quelques informations sur l'endroit où se connecter et comment à partir d'un fichier texte, cela est fait en utilisant la commande de lecture. Cela marche. Il stocke les arguments à envoyer sur RSync dans un appel de variable $ rsyncargs.

Je veux utiliser le RSync arg -e qui est utilisé pour transmettre les détails sur ssh, dans mon cas, un numéro de port si:

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

la ligne dans le fichier texte ressemble à ceci:

-e "ssh -p 222" 

la ligne de bash devrait être quelque chose comme:

rsync -avz $rsyncargs $src $dst 

tout cela fonctionne, sauf que les citations désordre et je me retrouve avec

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

Il essaie d'analyser le contenu des citations au stade de mal. J'ai essayé une liste de différents mécanismes d'échappement (comme les barres obliques inverses dans le fichier texte et l'utilisation de guillemets simples au lieu de guillemets à plusieurs endroits, etc.) mais tout semble se terminer par des messages d'erreur catastrophiques (mais pas toujours identiques).

suggestions seraient grandement appréciés (soit pour résoudre le problème d'origine, ou pour obtenir le port ssh a changé d'une manière moins ennuyeux)

Répondre

1

vous pouvez toujours définir le port dans votre config ssh:

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

Cela fonctionnera certainement comme une mesure provisoire, et pourrait bien devenir la solution choisie. – Thingomy

1

Je pense qu'ils doivent ressembler à ceci:

rsyncargs="ssh -p 222" 

rsync -avz -e $rsyncargs $src $dst 

Je suppose que vous avez est:

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

qui est susceptible d'être à l'origine des erreurs car les guillemets doubles et le commutateur d'option ne font pas partie de l'argument.

+0

Je ne veux pas spécifiquement faire cela (bien que je le ferai si je dois, à la perte de certaines fonctionnalités) parce que je veux être en mesure d'appeler n'importe quel args rsync aléatoire de cette façon. Par exemple: --modify-window = 3 – Thingomy

+0

@Thingomy: Alors vous devrez probablement placer vos arguments dans un tableau: 'rsyncargs = ('- e' 'ssh -p 222'); rsync -avz $ {rsyncargs [@]} $ src $ dst'. Et voyez [BashFAQ/050] (http: //mywiki.wooledge.org/BashFAQ/050). –

0

Je suis d'accord avec @Dennis Williamson et la réponse est que vous avez probablement besoin de moins en citant pas plus, à savoir:

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

J'ai eu un problème comme celui-ci, je trouve que cela fonctionne, sans guillemets dans l'extérieur l'option shell et échapper aux espaces dont il a besoin:

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

Je n'ai aucun espace entre le -p et PORT $, que je pense permettrait de résoudre complètement le problème du PO.