Wie führe ich ein lokales Skript mit einem Argument aus mehreren Wörtern auf einem Remote-Server aus?

Wie führe ich ein lokales Skript mit einem Argument aus mehreren Wörtern auf einem Remote-Server aus?

Ich versuche, das Skript test.sh(das sich auf meinem lokalen Computer befindet) auf einem Remoteserver auszuführen. test.shnimmt ein Argument an, das oft aus mehreren Wörtern besteht.

test.sh:

#!/bin/bash
while getopts b: opt;
do
  case $opt in
    b)
       bval="$OPTARG"
       ;;
  esac
done
echo $bval

Auf meinem lokalen Rechner funktioniert es einwandfrei:

./test.sh -b "multi word arg"

Ausgabe:

multi word arg

Aber wenn ich es auf einem Remote-Server ausführe, etwa so:

ssh -A user@remotehost "bash -s" -- < ./test.sh -b "multi word arg"

Ich bekomme nur:

multi

Irgendwelche Ideen, wie ich das vollständige, aus mehreren Wörtern bestehende Argument an das Skript übergeben kann?

Antwort1

Sie benötigen eine andere Ebene von Anführungszeichen:'"multi word arg"'

Die erste Anführungszeichenebene wird von Ihrer lokalen Shell entfernt und ssherhält multi word arg. Dann sshführt auf dem Remote-System etwas wie $SHELL -c "bash -s -- -b multi word arg"(wo $SHELList Ihre Login-Shell, höchstwahrscheinlich wieder Bash) aus. Die Login-Shell entfernt dann die Anführungszeichen (keine werden entfernt) und trennt Wörter, weshalb Sie ein Wort erhalten.

Um zu veranschaulichen:

% ssh 192.168.0.2 'printf :%s:\\n' '"foo bar baz"'
:foo bar baz:
% ssh 192.168.0.2 'printf :%s:\\n' 'foo bar baz'
:foo:
:bar:
:baz:

verwandte Informationen