Ich versuche, das Skript test.sh
(das sich auf meinem lokalen Computer befindet) auf einem Remoteserver auszuführen. test.sh
nimmt 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 ssh
erhält multi word arg
. Dann ssh
führt auf dem Remote-System etwas wie $SHELL -c "bash -s -- -b multi word arg"
(wo $SHELL
ist 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: