Hallo, Am Son, 29 Okt 2006, Al Bogner schrieb:
Am Samstag, 28. Oktober 2006 17:17 schrieb David Haller:
ssh user@domain.tld '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@bla.tld'
# ^ ^- 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 <