Forums Neueste Beiträge
 

wie escaped man ein single quote ?

17/12/2008 - 01:33 von Christoph Weber-Fahr | Report spam
Hi,

ich möchte ein Kommando ausführen, welches per ssh auf einen anderen
host geht und dort ein kommando ausfuehrt

Also

ssh ziehlhost 'dosomething | doanotherthing'

Problem: doanotherthing enthàlt zwei single quotes und darin allerlei
sonderzeichen wie $, ^, (, ), und |.

Diese sonmderzeichen sind *keine* shell Sonderzeichen, sondern Teil
einer regular expression, und müssen daher auch vor der Shell des
Zielhosts geschützt werden.

Wie kriege ich das in einer Kommandozeile und *ohne* Einbeziehung des
Filesystems auf einer Seite (also kein hin- und herkopieren von
skript-schnipseln) hin?

Gruß

Christoph Weber-Fahr
 

Lesen sie die antworten

#1 Helmut Waitzmann
17/12/2008 - 03:08 | Warnen spam
Christoph Weber-Fahr writes:

ich möchte ein Kommando ausführen, welches per ssh auf einen anderen host
geht und dort ein kommando ausfuehrt

Also

ssh ziehlhost 'dosomething | doanotherthing'

Problem: doanotherthing enthàlt zwei single quotes und darin allerlei
sonderzeichen wie $, ^, (, ), und |.

Diese sonmderzeichen sind *keine* shell Sonderzeichen, sondern Teil
einer regular expression, und müssen daher auch vor der Shell des
Zielhosts geschützt werden.



Man muss also eine Kommandozeile für das Shell auf dem Zielrechner
zusammenstellen, in der die Sonderzeichen mittels Quoting maskiert sind.

Eine Zeichenfolge, die vor einem Shell geschützt werden muss, kann man
durch folgende Schritte verpacken:

1.: Ersetze alle in der Zeichenfolge auftretenden »'« durch »'\''«.

2.: Füge vorne und hinten noch je ein »'« an.

Als Shell-Skript geht das z.B. so:

###Schnipp my_quote_words_for_shell
#!/bin/sh
my_quote_word ()
{
printf '%s' "$1" |
sed -e s/\'/\''\\'\'\''/g; 1s/^/'\''/; $s/$/'\'/
}
my_quote_words ()
{
if test -n "${1+defined}"
then
printf '%s' "$(my_quote_word "$1")" &&
shift &&
for word
do
printf ' %s' "$(my_quote_word "$word")" ||
exit 1
done
fi
printf ''
}
my_quote_words ${1+"$@"}
###Schnapp

Wenn man das Shell-Skript in ein Verzeichnis, das im PATH genannt wird,
stellt, kann man es bequem aufrufen.

Du schreibst nicht, wie »doanotherthing« genau aussieht, daher nehme ich
ein anderes Beispiel:

Auf dem Zielrechner soll die Kommandozeile

$ dosomething | grep -e '^$'

ausgeführt werden.

Dann sieht der »ssh«-Aufruf so aus:

ssh Zielrechner \
'dosomething | grep -e '"$(my_quote_words_for_shell '^$')"
Wenn Sie mir E-Mail schreiben, stellen | When writing me e-mail, please
Sie bitte vor meine E-Mail-Adresse | precede my e-mail address with
meinen Vor- und Nachnamen, etwa so: | my full name, like
Helmut Waitzmann , (Helmut Waitzmann)

Ähnliche fragen