web-dev-qa-db-fra.com

Sendmail ne fonctionne pas comme souhaité dans le script bash

Ceci est le code que j'ai dans un script bash qui s'exécute comme un cronjob. Le cronjob est exécuté en tant que root.

   /usr/sbin/sendmail [email protected]<<EOF
   subject:Backup Error!
   from:backup@server01
   $error
        EOF

Il y a un code après cela et le courrier électronique que je reçois est le suivant:

De l'utilisateur root sur la machine.

et le message comprend:

   subject:Backup Error!
   from:backup@server01
   $error
        EOF
   More code...
   that is in the script
   all the way to the end...

J'ai essayé d'autres variantes, c'est le plus proche que j'ai. J'ai essayé ceci dans un script régulier et cela a fonctionné correctement. Que se passe-t-il et comment puis-je envoyer ce courrier électronique en spécifiant le sujet et l'expéditeur du formulaire?

1
Dan

Les réponses précédentes ont déjà mentionné:

  • mauvaise fin de "ici document" (FIN)
  • ligne vide manquante entre les en-têtes et le corps

Corrections supplémentaires:

  • -i Option de ligne de commande pour arrêter le traitement spécial des lignes commençant par un point.
  • -- pour séparer les options de ligne de commande des adresses des destinataires (bonne recommandation de style)

Script corrigé:

/usr/sbin/sendmail -i -- [email protected] <<EOF
subject: Backup Error!
from:backup@server01

$error
EOF
2
AnFi

Sendmail (et le courrier électronique en général, semble-t-il) nécessite une ligne vierge entre les en-têtes et le corps. L'exemple suivant a fonctionné.

$ sendmail [email protected] <<EOF
> subject: testing
> from: [email protected]
> 
> This is my body!
> EOF

(Évidemment, coller cela avec le >s ne marchera pas, modifiez ce que vous faites pour qu'il y ait une ligne vide entre vos en-têtes et le message d'erreur).

1
Oli

Je vous suggère de ne pas utiliser de caractère d'espacement avant ou après la deuxième chaîne limite EOF. Si vous n'utilisez qu'un seul espace devant ou après la chaîne limite, ce bloc de code à usage spécifique ne fonctionnera jamais. Donc, utilisez seulement:

EOF

Et vous devriez lire quelques guides de script bash dans ce sens comme Chapitre 19. Ici Documents .

1
Radu Rădeanu