Script della shell: Esegui la funzione dallo script su ssh

C’è un modo intelligente per eseguire una funzione Bash locale su un host remoto su ssh?

Per esempio:

#!/bin/bash #Definition of the function f () { ls -l; } #I want to use the function locally f #Execution of the function on the remote machine. ssh [email protected] f #Reuse of the same function on another machine. ssh [email protected] f 

Sì, lo so che non funziona, ma c’è un modo per raggiungere questo objective?

È ansible utilizzare il comando typeset per rendere le funzioni disponibili su una macchina remota tramite ssh . Esistono diverse opzioni a seconda di come si desidera eseguire lo script remoto.

 #!/bin/bash # Define your function myfn () { ls -l; } 

Per utilizzare la funzione sugli host remoti:

 typeset -f myfn | ssh [email protected] "$(cat); myfn" typeset -f myfn | ssh [email protected] "$(cat); myfn" 

Meglio ancora, perché preoccuparsi con la pipa:

 ssh [email protected] "$(typeset -f myfn); myfn" 

Oppure puoi usare un HEREDOC:

 ssh [email protected] << EOF $(typeset -f myfn) myfn EOF 

Se vuoi inviare tutte le funzioni definite all'interno dello script, non solo myfn , usa solo typeset -f così:

 ssh [email protected] "$(typeset -f); myfn" 

Spiegazione

typeset -f myfn mostrerà la definizione di myfn .

cat riceverà la definizione della funzione come testo e $() la eseguirà nella shell corrente che diventerà una funzione definita nella shell remota. Finalmente la funzione può essere eseguita.

L'ultimo codice metterà la definizione delle funzioni in linea prima dell'esecuzione di ssh.

Personalmente non conosco la risposta corretta alla tua domanda, ma ho un sacco di script di installazione che si copiano solo usando ssh.

Chiedi al comando di copiare il file, caricare le funzioni del file, eseguire le funzioni del file e quindi eliminare il file.

 ssh [email protected] "scp [email protected]:/myFile ; . myFile ; f ; rm Myfile" 

Un altro modo:

 #!/bin/bash # Definition of the function foo () { ls -l; } # Use the function locally foo # Execution of the function on the remote machine. ssh [email protected] "$(declare -f foo);foo" 

declare -f foo stampa la definizione di funzione