2013-02-05 11 views
29

Sto cercando di copiare un file utilizzando scp in bash con un carattere due punti (:) nel nome file di origine. La versione offuscato del mio comando che sto utilizzando è:Come posso scpare un file con due punti nel nome del file?

scp file\:\ name.mp4 [email protected]:"/path/to/dest" 

ottengo questo errore:

ssh: Could not resolve hostname Portal 2: Name or service not known 

So che potrei basta rinominare il file e rimuovere il :, ma mi piacerebbe sapere se è possibile sfuggire al colon.

risposta

51

Non proprio un bash fuga problema, è scp trattare x: come [@ utente] prefisso ospite, provare:

scp ./file:\ name.mp4 [email protected]:"/path/to/dest" 

Utilizzando relativi (ad esempio ./) o percorsi completi (/path/to/source) impedisce questo comportamento - la presenza di / prima di un : causa l'arresto di OpenSSH per un possibile prefisso host: o [email protected]:. OpenSSH's scp solo nomi di casi speciali che iniziano con con due punti che consentono a quelli di funzionare senza problemi, non ha supporto per l'escape di un : nel senso normale, e non ha altra nozione di nomi host validi quindi quasi qualsiasi nome file con una : può causa questo.

(A causa di analisi semplicistica di OpenSSH di [] indirizzi IPv6 chiusi, si può con successo scp file contenenti : che iniziano con [, o contenere @[ prima della : e non contengono ]:, ma questo non è generalmente utile ;-)


(il testo che segue è stato scritto quando il original question era Come faccio a scappare i due punti in bash? Essa si applica a questa situazione, ma non a scp come nessuna quantità di guscio di fuga aiuterà lì.)

Per rispondere alla domanda su come per fuggire :, non è necessario, ma "\:" funziona.Luoghi che un : è usato:

  1. il comando nullo :, non c'è bisogno di fuggire, anche se è possibile, proprio come \e\c\h\o foo che ha alcun effetto sul comando ("nessun effetto" non è del tutto vero, se a fuggire uno o più caratteri che impedirà un alias ci si allinea)
  2. PATH (e altri, CDPATH, MAILPATH) in fuga i valori non ha alcun effetto utile (sono stato in grado di eseguire un programma nel mio percorso da una directory contenente un :, che è un po 'inaspettato)
  3. espansione parametro ${name:-x} e più, name deve essere [a-zA-Z_][a-zA-Z0-9_], quindi nessun bisogno di sfuggire nomi variabili, e poiché non c'è ambiguità, senza bisogno di sfuggire successiva : nelle altre varianti di espansione parametro
  4. ? : ternario opera solo su variabili e numeri, nessun bisogno per sfuggire
  5. == e =~ con le classi nel modello come [[:digit:]], si può sfuggire con \: ma sono in perdita quanto a come questo potrebbe mai essere utile ...
  6. all'interno di nomi di comando o funzione, non c'è bisogno per sfuggire, \: non ha effetto utile
  7. .210

(Si noti che il comando nullo è solo :, si può avere un comando o funzione denominata come ":foo" e può essere invocati senza sfuggire, sotto questo aspetto è diverso per # dove un comando chiamato #foo avrebbe bisogno di essere sfuggito.)

+1

Lo stesso problema interessa 'rsync'. Fortunatamente, la stessa soluzione, con il prefisso dei nomi dei file con '. /', Aiuta anche lì. –