web-dev-qa-db-fra.com

Comment exécuter une commande distante sur ssh avec des arguments?

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?

52
Alex

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.

Mise à jour

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 $__"
}
  • Lors de la déclaration d'une fonction avec function, () n'est pas nécessaire.
  • Ne commentez pas cela simplement parce que vous êtes un POSIXiste.
68
konsolebox

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"
+
}
5
Ted Bigham

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
3
Cyril Duchon-Doris

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
3
muratgozel