Je suis sur une machine Linux et je surveille l'utilisation d'un processus. La plupart du temps, je serai loin de mon système et j'aurai accès à Internet sur mon appareil. J'ai donc prévu d'écrire un script shell capable de m'envoyer par mail la sortie du processus.
C'est possible?
Si oui, comment faire en sorte qu'un script shell m'envoie un courrier?
S'il vous plaît fournir un extrait pour commencer.
Oui, cela fonctionne bien et est couramment utilisé:
$ echo "hello world" | mail -s "a subject" [email protected]
Fondamentalement, il existe un programme pour accomplir cela, appelé "courrier". L'objet de l'e-mail peut être spécifié avec un -s et une liste d'adresses avec -t. Vous pouvez écrire le texte vous-même avec la commande echo:
echo "This will go into the body of the mail." | mail -s "Hello world" [email protected]
ou l'obtenir à partir d'autres fichiers aussi:
mail -s "Hello world" [email protected] < /home/calvin/application.log
mail ne supporte pas l'envoi de pièces jointes, mais Mutt:
echo "Sending an attachment." | mutt -a file.Zip -s "attachment" [email protected]
Notez que Mutt est beaucoup plus complet que le courrier ... Vous pouvez trouver une meilleure explication ici
PS: merci à @slhck qui a souligné que ma réponse précédente était affreuse. ;)
sendmail
fonctionne pour moi sur mac (10.6.8)
echo "Hello" | sendmail -f [email protected] [email protected]
#!/bin/sh
#set -x
LANG=fr_FR
# ARG
FROM="[email protected]"
TO="[email protected]"
SUBJECT="test é"
MSG="BODY éé"
FILES="fic1.pdf fic2.pdf"
# http://fr.wikipedia.org/wiki/Multipurpose_Internet_Mail_Extensions
SUB_CHARSET=$(echo ${SUBJECT} | file -bi - | cut -d"=" -f2)
SUB_B64=$(echo ${SUBJECT} | uuencode --base64 - | tail -n+2 | head -n+1)
NB_FILES=$(echo ${FILES} | wc -w)
NB=0
cat <<EOF | /usr/sbin/sendmail -t
From: ${FROM}
To: ${TO}
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=frontier
Subject: =?${SUB_CHARSET}?B?${SUB_B64}?=
--frontier
Content-Type: $(echo ${MSG} | file -bi -)
Content-Transfer-Encoding: 7bit
${MSG}
$(test $NB_FILES -eq 0 && echo "--frontier--" || echo "--frontier")
$(for file in ${FILES} ; do
let NB=${NB}+1
FILE_NAME="$(basename $file)"
echo "Content-Type: $(file -bi $file); name=\"${FILE_NAME}\""
echo "Content-Transfer-Encoding: base64"
echo "Content-Disposition: attachment; filename=\"${FILE_NAME}\""
#echo ""
uuencode --base64 ${file} ${FILE_NAME}
test ${NB} -eq ${NB_FILES} && echo "--frontier--" || echo
"--frontier"
done)
EOF
mail -s "Your Subject" [email protected] < /file/with/mail/content
(/file/with/mail/content
devrait être un fichier texte, pas une pièce jointe ni une image, etc.)
top -b -n 1 | mail -s "any subject" [email protected]
Bien sûr, la solution la plus simple serait bien sûr de diriger la sortie dans le courrier:
vs@lambda:~$ cat test.sh
sleep 3 && echo test | mail -s test your@address
vs@lambda:~$ Nohup sh test.sh
Nohup: ignoring input and appending output to `Nohup.out'
Je suppose que sh test.sh &
fera aussi bien normalement.