Mailinglist Archive: opensuse-de (1756 mails)

< Previous Next >
Re: Script von einem anderen Rechner aufrufen
  • From: David Haller <lists@xxxxxxxxxx>
  • Date: Sun, 29 Oct 2006 00:02:14 +0000 (UTC)
  • Message-id: <20061029000056.GB1671@xxxxxxxxxxxxxxxxxx>
Hallo,

Am Son, 29 Okt 2006, Al Bogner schrieb:
>Am Samstag, 28. Oktober 2006 17:17 schrieb David Haller:
>> ssh user@xxxxxxxxxx 'test `stat -c "%a" ~/public_html` -ne 755 \
>> && find ~/public_html -type d -print0 | xargs -r -0 chmod 755'
>
>Danke das funktioniert nun ganz gut,
>
>Ich habe jetzt folgendes:
>ssh "$NUTZER"@"$DOMAIN" 'test `stat -c "%a" ~/public_html` -ne 755 && find
>~/public_html -type d -print0 | xargs -r -0 chmod 755'
>ssh "$NUTZER"@"$DOMAIN" 'test `stat -c "%a" ~/public_html/index.html` -ne 644
>&& find ~/public_html -type f -print0 | xargs -r -0 chmod 644'

Kannst du auch noch zusammenfassen. ssh ist eine verschluesselte
"remote shell", d.h. dass Shellbefehle auf einem "entfernten" Rechner
ausgefuehrt werden. Ausserdem faellt mir noch ein: wozu der Test ob
die Rechte stimmen? Oder willst du's nur mitbekommen, dass die Rechte
neu gesetzt werden mussten?

a) obiges zusammengefasst:

ssh "${NUTZER}@${DOMAIN}" '
test `stat -c "%a" ~/public_html` -ne 755 \
&& find ~/public_html -type d -print0 | xargs -r -0 chmod 755; \
test `stat -c "%a" ~/public_html/index.html` -ne 644 \
&& find ~/public_html -type f -print0 | xargs -r -0 chmod 644'

(wichtig ist AFAIK dabei das "; \" nach dem xargs .. chmod 755, das
ganze wird an die remote shell so uebergeben, als ob das alles auf
einer Zeile stuende).

b) die pragmatische Loesung, einfach "drueberbuegeln":

ssh "${NUTZER}@${DOMAIN}" '
find ~/public_html -type d -print0 | xargs -r -0 chmod 755; \
find ~/public_html -type f -print0 | xargs -r -0 chmod 644'

c) die pragmatische, mitbekommenwoll Loesung:

ssh "${NUTZER}@${DOMAIN}" '
find ~/public_html -type d -print0 | xargs -r -0 chmod -c 755; \
find ~/public_html -type f -print0 | xargs -r -0 chmod -c 644'

d) koennte sein, das du auf die Befehle in ein Script auf dem
entfernten Rechner packst und dann eben:

ssh "${NUTZER}@${DOMAIN}" '~/bin/rechtesetzen.sh'

oder so ausfuehrst.

Und dann ist noch folgender Satz aus der manpage zu beachten:

"The exit status of the remote program is returned as the exit status
of ssh."

D.h. bei mehreren Befehlen ist der exit-status der ssh der exit-status
der (remote-)shell, und der ist der exit-status der letzten "Pipeline"
(also meist der des letzten Befehls).

Also z.B.:

ssh "${NUTZER}@${DOMAIN}" \
'test `stat -c "%a" ~/public_html` -ne 755' || mail ...
^^^^^^^^^^^^^^^^^^^ remote ^^^^^^^^^^^^^^^^ ^^^^^^^^ lokal ...

wobei der lokale Teil den Exitstatus des ssh, der der Status des
'test' ist, auswertet.

>Wenn ich aber das nach dem Oktalwert hinzuf├╝ge, dann wird kein Warnmail
>versandt:
>
>&& echo "Problem mit den Rechten" | mail -s "Rechte falsch auf $DOMAIN'
^^ Was erwartest du, wenn du nur bei Erfolg mailst? ;) ^^?

Und das quoting ist auch etwas suspekt ;)

Siehe oben bzgl. evtl. guenstigerer Loesungen, was Meldungen angeht,
aber wenn du eine Mail willst, wenn die Rechte neu gesetzt werden
sollte folgendes gehen:

ssh "${NUTZER}@${DOMAIN}" '
if test `stat -c "%a" ~/public_html` -ne 755; then \
find ~/public_html -type d -print0 | xargs -r -0 chmod 755; \
echo "Verzeichnisrechte neu gesetzt"; \
fi; \
if test `stat -c "%a" ~/public_html/index.html` -ne 644; then \
find ~/public_html -type f -print0 | xargs -r -0 chmod 644; \
echo "Dateirechte neu gesetzt"; \
fi' | mail -s "Rechte auf $DOMAIN" `id -n`
# ^- ab hier lokal

Die Pipe zu 'mail' kann lokal sein, denn STDOUT der remote shell ist
stdout des ssh-Befehls. Wenn du die Mails remote senden willst:

ssh "${NUTZER}@${DOMAIN}" '
{
if test `stat -c "%a" ~/public_html` -ne 755; then \
[..]
fi; \
} 2>&1 | mail -s "Rechte auf '"${DOMAIN}"'"... empfaenger@xxxxxxx'
# ^ ^- Anf.z. ^^^^^|^^^^^ ^- Anfuehrungsz. remote zu
# | remote auf |
# | `- wird vor Uebergabe an ssh lokal
# | expandiert, in lokalen Anf.z.
# `- Ausgaben remote zusammenfassen

Ja, da muss man beim Quoten ziemlich aufpassen ;)

Aber was auch geht: ssh frisst das Shellscript auch von stdin, z.B.:

cat <<EOF | ssh "${NUTZER}@${DOMAIN}" | mail -s "Rechte" empfaenger
exec 2>&1 ## stdout auf stdin umbiegen
if test \`stat -c '%a' ~/public_html\` -ne 755; then
find ~/public_html -type d -print0 | xargs -r -0 chmod 755
echo "Verzeichnisrechte neu gesetzt"
fi
if test \$(stat -c '%a' ~/public_html/index.html) -ne 644; then
find ~/public_html -type f -print0 | xargs -r -0 chmod 644
echo "Dateirechte neu gesetzt"
fi
EOF

Bei dieser Form werden Variablen $FOO, `` und $() im Here-Dokument
interpretiert, ein ~ aber erst remote. Wenn man

cat <<'EOF' | ...

verwendet nicht. '' und "" koennen in beiden Faellen als Quotezeichen
verwendet werden (die so auch weitergegeben werden).

Umgehen kann man's durch escapen (s.o.), ich hab oben mal beide
Varianten drin.

Ohne Gewaehr, ich bin muede...

-dnh

--
the only potential lusers will ever have is when they're connected to
an electron source of serious capability. -- Rik Steenwinkel

< Previous Next >
Follow Ups