2012-10-23 25 views
5

La seguente non funziona per me:assegnazione della variabile remota ssh?

ssh [email protected] "k=5; echo $k;" 

solo restituisce una riga vuota.

Come posso assegnare una variabile su una sessione remota (ssh)?

Nota: La mia domanda non è su come passare le variabili locali alla mia sessione ssh, ma piuttosto come creare e assegnare le variabili remote. (Dovrebbe essere un compito piuttosto semplice?)


Edit:

In particolare sto cercando di fare questo:

bkp=/some/path/to/backups 
ssh [email protected] "bkps=($(find $bkp/* -type d | sort)); 
         echo 'number of backups: '${#bkps[@]}; 
         while [ ${#bkps[@]} -gt 5 ]; do 
          echo ${bkps[${#bkps[@]}-1]}; 
          #rm -rf $bkps[${#bkps[@]}-1]; 
          unset bkps[${#bkps[@]}-1]; 
         done;" 

Il comando find funziona bene, ma per qualche motivo $bkps non viene popolato. Quindi la mia ipotesi era che sarebbe stato un problema di assegnazione di variabili, dal momento che mi pare di aver controllato tutto il resto ...

+1

Suggerimento: provare prima il comando localmente o accedere al server ssh e provarlo. Bash richiede di usare il comando export per impostare le variabili di ambiente. ssh [email protected] "export k = 5; echo $ k;" – Codeguy007

+0

@ Codeguy007: ho ampliato ulteriormente la mia descrizione del mio problema. In realtà non sto cercando di impostare alcuna variabile di ambiente. Presumo che il problema semplificato abbia qualcosa a che fare con il reindirizzamento dell'output in realtà ... – Pitt

+3

Prova 'ssh [email protected]" k = 5; echo \ $ k; "'. Notare il backslash prima di '$' per impedire che la shell si espanda presto. Le virgolette singole invece delle virgolette doppie realizzerebbero la stessa cosa. – twalberg

risposta

12

Dato questa invocazione:

ssh [email protected] "k=5; echo $k;" 

il guscio locale è in espansione $k (che molto probabilmente non è impostato) prima dell'esecuzione di ssh .... Quindi il comando che viene effettivamente passato alla shell remota dopo aver effettuato la connessione è k=5; echo ; (o k=5; echo something_else_entirely; se k viene impostato in locale).

Per evitare questo, la fuga il simbolo del dollaro in questo modo:

ssh [email protected] "k=5; echo \$k;" 

In alternativa, utilizzare le virgolette singole al posto delle virgolette doppie per impedire l'espansione locale. Tuttavia, mentre ciò funzionerebbe su questo semplice esempio, potreste effettivamente desiderare l'espansione locale di alcune variabili nel comando che viene inviato al lato remoto, quindi la fuga di backslash è probabilmente il percorso migliore.

Per riferimento futuro, è inoltre possibile digitare set -x nella shell per echeggiare i comandi effettivi che vengono eseguiti come aiuto per la risoluzione dei problemi.

+0

potresti spiegare come usare il comando "set -x"? È parte del comando ssh o semplicemente bash? – Pitt

Problemi correlati