Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Exporter une fonction pour la lancer sur un hôte distant via ssh

22 réponses
Avatar
Francois Lafont
Bonsoir à tous,

D'après mes recherches, ce que je veux faire n'a pas l'air possible mais
bon je pose quand même la question :

Voici un petit code bash qui ne marche pas :

----------------------------------------
#!/bin/bash

fct ()
{
echo "Ma super fonction qui fait plein de trucs..."
# etc.
# Peu importe le contenu de fct
}

export -f fct

ssh root@HOTE-DISTANT bash -c 'fct arg1 arg2'
----------------------------------------

Je misais beaucoup d'espoir sur le « export » mais ça ne change rien au
problème, quand « bash -c 'fct arg1 arg2' » est exécuté sur l'hôte
distant, j'ai alors le message me disant que fct est introuvable. Bref,
l'export ne marche pas et ftc est inconnue aux yeux de l'hôte distant.

Savez-vous comme faire marcher le code ci-dessus ? Peut-être une option
magique du côté de ssh ?

Je précise qu'on voit sur le Web des solutions comme ça :

----------------------------------------
fct="
echo \"Ma super fonction qui fait plein de trucs...\"
# etc.
"

ssh root@HOTE-DISTANT bash -c "'$fct'"
----------------------------------------

Mais je ne me résoudrai pas faire comme ça car :

- je perds la coloration syntaxique quand j'écris le contenu de fct et
ça c'est vraiment trop horrible.
- en plus il faut que je m'amuse à échapper tous les ", c'est vraiment
pénible.

Je pourrais faire ça aussi :

----------------------------------------
ssh root@HOTE-DISTANT bash -c < /un/fichier/externe
----------------------------------------

mais du coup je me trimballe deux fichiers et ça ne me plaît pas non plus.

Voilà, j'aimerais vraiment arriver à faire fonctionner le premier code
modulo des petits changements bien sûr puisqu'en l'état il ne fonctionne
pas.

Merci d'avance pour vos lumières.

--
François Lafont

10 réponses

1 2 3
Avatar
Luc.Habert.00__arjf
Francois Lafont :

Mais dash ne permet pas d'exporter une fonction ?



Non, c'est une basherie.
Avatar
Francois Lafont
Le 13/12/2012 12:23, Luc Habert a écrit :

ssh -o 'SendEnv F' 'bash -c '''F arg1 arg2''



Chez moi, ça donne :

bash: -c: ligne 0: Caractère de fin de fichier (EOF) prématuré lors de
la recherche du « ' » correspondant
bash: -c: ligne1: Erreur de syntaxe : fin de fichier prématurée.



Beuh, chez moi ça marche. Tu as bien copier-collé?



Autant pour moi. Je viens de refaire un copié-collé et ça fonctionne. Je
devais être un peu fatigué hier soir.

J'avoue ne pas comprendre la présence des mais j'imagine qu'il y a une
raison.



Mon but est de passer en argument à ssh la ligne de commande

bash -c 'F arg1 arg2'

. Si je la met juste entre '', ça louze parce que j'ai des ' à l'intérieur.
La solution consiste à remplacer chaque ' intérieur par ''' ce qui veut
dire:
- premier ' ferme la string
- ' un ' echappé pour qu'il ne soit pas interprété par le shell
- deuxième ' on réouvre la string.

J'aurais pu mettre "bash -c 'F arg1 arg2'", ça serait revenu au même ici,
mais je n'aime pas parce que ça autorise les évaluations de variables et de `.



Ok. C'est très clair. Merci.


--
François Lafont
Avatar
Francois Lafont
Le 13/12/2012 22:56, Francois Lafont a écrit :

Autant pour moi.



Je voulais écrire « Au temps pour moi », of course. ;-)

--
François Lafont
Avatar
Francois Lafont
Le 13/12/2012 22:51, Luc Habert a écrit :

Mais dash ne permet pas d'exporter une fonction ?



Non, c'est une basherie.



Ok. Perso, je trouve que cette basherie est pratique des fois.

--
François Lafont
Avatar
Luc.Habert.00__arjf
Francois Lafont :

C'est quand même sioux cette subtilité entre :

- ce ne sont pas des arguments que prend ssh



Si, comme toutes les commandes. Mais il les reassemble en une unique string,
qu'il envoie a la machine distante en la faisant executer par le shell de
login a l'autre bout. Alors qu'il pourrait transmettre au serveur les
arguments un par un, et le serveur ferait alors un exec dessus sans
s'emmerder avec un shell. C'est une connerie que ssh a herite de son ancetre
rsh.

Comment le savoir à l'avance ? Est-ce que par exemple le synopsis de la
commande ssh (dans la page man) me permet de le savoir à l'avance ?



La page de man est remarquablement peu claire. Si on la prend au pied de la
lettre, on n'a meme pas le droit d'ajouter des arguments derriere, seule la
forme avec une ligne de commande complete en un argument est supportee.

Par exemple la commande sudo n'a pas l'air de fonctionner ainsi (mais je
n'en suis pas sûr).



Oui, les auteurs de sudo ont allume leur cerveau avant de coder. A
l'inverse, il y a su dont l'argument -c prend une ligne de commande.
Avatar
Luc.Habert.00__arjf
Francois Lafont :

Autant pour moi.



Je voulais écrire « Au temps pour moi », of course. ;-)



Ah non, autant pour moi est bien plus logique!

--
fu2 fr.lettres.langue.francaise.debats
Avatar
Francois Lafont
Le 13/12/2012 22:59, Luc Habert a écrit :

C'est quand même sioux cette subtilité entre :

- ce ne sont pas des arguments que prend ssh



Si, comme toutes les commandes.



D'accord ça me rassure quelque part qu'on reste dans le schéma classique
du découpage des arguments en mots séparés par des blancs.

Mais il les reassemble en une unique string,
qu'il envoie a la machine distante en la faisant executer par le shell de
login a l'autre bout. Alors qu'il pourrait transmettre au serveur les
arguments un par un, et le serveur ferait alors un exec dessus sans
s'emmerder avec un shell. C'est une connerie que ssh a herite de son ancetre
rsh.

Comment le savoir à l'avance ? Est-ce que par exemple le synopsis de la
commande ssh (dans la page man) me permet de le savoir à l'avance ?



La page de man est remarquablement peu claire. Si on la prend au pied de la
lettre, on n'a meme pas le droit d'ajouter des arguments derriere, seule la
forme avec une ligne de commande complete en un argument est supportee.

Par exemple la commande sudo n'a pas l'air de fonctionner ainsi (mais je
n'en suis pas sûr).



Oui, les auteurs de sudo ont allume leur cerveau avant de coder. A
l'inverse, il y a su dont l'argument -c prend une ligne de commande.



Ok, c'est clair merci.

Après, qu'on soit parfois dans le cas de ssh et parfois dans celui de
sudo, ça ne me dérangerait pas si au moins c'était bien indiqué dans la
page man (dans les deux cas).


--
François Lafont
Avatar
Lucas Levrel
Le 13 décembre 2012, Luc Habert a écrit :

Francois Lafont :

Autant pour moi.



Je voulais écrire « Au temps pour moi », of course. ;-)



Ah non, autant pour moi est bien plus logique!



Mais l'orthographe n'a pas vraiment à être logique (contrairement à la
grammaire).

--
LL
Avatar
moi-meme
Le Thu, 13 Dec 2012 22:57:30 +0100, Francois Lafont a écrit :

Au temps pour moi



Autant pour moi ?
Avatar
Emmanuel Florac
Le Sat, 15 Dec 2012 11:33:50 +0000, moi-meme a écrit:

Le Thu, 13 Dec 2012 22:57:30 +0100, Francois Lafont a écrit :

Au temps pour moi



Autant pour moi ?



Non, non, "au temps pour moi".
https://fr.wikipedia.org/wiki/Au_temps_pour_moi

--
Ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn.
1 2 3