it-swarm.com.de

Wie führe ich einen Remote-Befehl über ssh mit Argumenten aus?

In meinem .bashrc Definiere ich eine Funktion, die ich später in der Kommandozeile verwenden kann:

function mycommand() {
    ssh [email protected] cd testdir;./test.sh "$1"
}

Bei Verwendung dieses Befehls wird nur der Befehl cd auf dem Remote-Host ausgeführt. Der Befehl test.sh wird auf dem lokalen Host ausgeführt. Dies liegt daran, dass das Semikolon zwei verschiedene Befehle trennt: den Befehl ssh und den Befehl test.sh.

Ich habe versucht, die Funktion wie folgt zu definieren (beachten Sie die einfachen Anführungszeichen):

function mycommand() {
    ssh [email protected] 'cd testdir;./test.sh "$1"'
}

Ich habe versucht, den Befehl cd und den Befehl test.sh Zusammenzuhalten, aber das Argument $1 Wird nicht aufgelöst, unabhängig davon, was ich der Funktion gebe. Es wird immer versucht, einen Befehl auszuführen

./test.sh $1

auf dem Remote-Host.

Wie definiere ich mycommand richtig, damit das Skript test.sh Auf dem Remote-Host ausgeführt wird, nachdem in das Verzeichnis testdir gewechselt wurde, wobei das Argument an mycommand zu test.sh?

52
Alex

Mach es stattdessen so:

function mycommand {
    ssh [email protected] "cd testdir;./test.sh \"$1\""
}

Sie müssen den gesamten Befehl noch als einzelne Zeichenfolge übergeben. In dieser einzelnen Zeichenfolge muss jedoch $1 Erweitert werden, bevor er an ssh gesendet wird, sodass Sie "" Dafür verwenden müssen.

Aktualisieren

Eine andere Möglichkeit, dies zu tun, besteht darin, printf %q Zu verwenden, um das Argument richtig zu zitieren. Dies würde das Argument sicherer machen, selbst wenn es Leerzeichen, einfache Anführungszeichen, doppelte Anführungszeichen oder andere Zeichen enthält, die für die Shell eine besondere Bedeutung haben könnten:

function mycommand {
    printf -v __ %q "$1"
    ssh [email protected] "cd testdir;./test.sh $__"
}
  • Wenn Sie eine Funktion mit function deklarieren, ist () Nicht erforderlich.
  • Kommentieren Sie es nicht, nur weil Sie ein POSIXist sind.
68
konsolebox

Wiederbelebung eines alten Threads, aber dieser ziemlich saubere Ansatz wurde nicht aufgeführt.

function mycommand() {
    ssh [email protected] <<+
    cd testdir;./test.sh "$1"
+
}
5
Ted Bigham

Dies ist ein Beispiel für die AWS Cloud. Das Szenario sieht so aus, dass ein Computer, der über die automatische Skalierung gestartet wurde, eine Aktion auf einem anderen Server ausführen muss, indem der neu erzeugte Instanz-DNS über SSH übergeben wird

# 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

Ich verwende Folgendes, um Befehle auf der Fernbedienung von meinem lokalen Computer auszuführen:

ssh -i ~/.ssh/$GIT_PRIVKEY [email protected]$IP "bash -s" < localpath/script.sh $arg1 $arg2
3
muratgozel