Dans mon .bashrc
Je définis une fonction que je pourrai utiliser plus tard sur la ligne de commande:
function mycommand() {
ssh [email protected] cd testdir;./test.sh "$1"
}
Lorsque vous utilisez cette commande, seule la commande cd
est exécutée sur l'hôte distant. le test.sh
La commande est exécutée sur l'hôte local. En effet, le point-virgule sépare deux commandes différentes: la commande ssh
et la commande test.sh
commande.
J'ai essayé de définir la fonction comme suit (notez les guillemets simples):
function mycommand() {
ssh [email protected] 'cd testdir;./test.sh "$1"'
}
J'ai essayé de garder la commande cd
et le test.sh
commande ensemble, mais l'argument $1
n'est pas résolu, indépendamment de ce que je donne à la fonction. On essaie toujours d'exécuter une commande
./test.sh $1
sur l'hôte distant.
Comment définir correctement mycommand
, donc le script test.sh
est exécuté sur l’hôte distant après être entré dans le répertoire testdir
, avec possibilité de transmettre l’argument donné à mycommand
à test.sh
?
Faites-le de cette façon à la place:
function mycommand {
ssh [email protected] "cd testdir;./test.sh \"$1\""
}
Vous devez toujours passer la commande entière en tant que chaîne unique, mais dans cette chaîne, vous devez avoir $1
développé avant d’être envoyé à ssh, vous devez donc utiliser ""
pour ça.
Une autre façon de faire est d’utiliser printf %q
pour bien citer l'argument. Cela permettrait d'analyser l'argument en toute sécurité même s'il contient des espaces, des guillemets simples, des guillemets doubles ou tout autre caractère pouvant avoir une signification spéciale pour le shell:
function mycommand {
printf -v __ %q "$1"
ssh [email protected] "cd testdir;./test.sh $__"
}
function
, ()
n'est pas nécessaire.Relancer un vieux fil, mais cette approche plutôt propre n'était pas répertoriée.
function mycommand() {
ssh [email protected] <<+
cd testdir;./test.sh "$1"
+
}
Ceci est un exemple qui fonctionne sur le cloud AWS. Le scénario est qu'une machine qui a démarré à partir de la mise à l'échelle automatique doit exécuter une action sur un autre serveur, en passant le DNS de l'instance nouvellement générée via SSH.
# Get the public DNS of the current machine (AWS specific)
MY_DNS=`curl -s http://169.254.169.254/latest/meta-data/public-hostname`
ssh \
-o StrictHostKeyChecking=no \
-i ~/.ssh/id_rsa \
[email protected] \
<< EOF
cd ~/
echo "Hey I was just SSHed by ${MY_DNS}"
run_other_commands
# Newline is important before final EOF!
EOF
J'utilise ce qui suit pour exécuter des commandes sur la télécommande à partir de mon ordinateur local:
ssh -i ~/.ssh/$GIT_PRIVKEY user@$IP "bash -s" < localpath/script.sh $arg1 $arg2