Ausführen des folgenden Skripts:
#!/bin/bash
cvs_domain=abc.com
cvs_mail_server=mail.${cvs_domain}
cvs_port=25
telnet $cvs_mail_server $cvs_port<<_EOF_
EHLO $cvs_domain
MAIL FROM:[email protected]
RCPT TO:[email protected]
DATA
Subject:Test!
Don't panic. This is only a test.
.
QUIT
_EOF_
schlägt mit einer Connection closed by host
Meldung fehl, direkt nachdem der Server mit dem Escape-Zeichen geantwortet hat und bevor die 220
Nachricht übermittelt wird.
Durch Ausführen der entsprechenden Sequenz im interaktiven Modus (natürlich ohne das „Here-Doc“) erreiche ich mein Ziel.
Ich vermute, dass das „Übermittlung“ der Befehlszeilen an den Server am anderen Ende der Leitung nicht genau wie erwartet erfolgt.
Ist meine Annahme richtig? Gibt es eine Möglichkeit, dieses Problem zu mildern?
Antwort1
Wenn Sie ein interaktives Befehlszeilentool skripten müssen, besteht die typische Lösung darin, zu verwenden expect(1)
.
Antwort2
Der Vollständigkeit halber veröffentliche ich hier die vollständige „hässliche, aber funktionierende“ Lösung (mit der Änderung, dass sie in ihrer endgültigen Form E-Mails an mehr Personen sendet und auch einen Anhang bereitstellt):
cd "$(dirname "$0")"
working_dir=$(pwd) # switching to the folder this script has been started from
cvs_domain=mail.org
cvs_mail_server=mail.${cvs_domain}
cvs_port=25
[email protected]
cvs_recipients=([email protected] [email protected])
cvs_delimiter=-----nEXt_paRt_frontier!!VSFCDVGGERHERZZ@$%^zzz--- # MIME multi-part delimiter, do not change
{ echo HELO $cvs_domain; sleep 1
# set up the email (sender, receivers):
echo MAIL FROM:$cvs_sender; sleep 1
for r in ${cvs_recipients[@]}; do
echo RCPT TO:$r; sleep 1
done
echo DATA; sleep 1
echo From:$cvs_sender; sleep 1
for r in ${cvs_recipients[@]}; do
echo To:$r; sleep 1
done
echo Subject:Test for build; sleep 1
# build the mail structure, according to the MIME standard:
echo MIME-Version: 1.0; sleep 1
echo "Content-Type: multipart/mixed; boundary=\"$cvs_delimiter\""; sleep 1
echo --${cvs_delimiter}; sleep 1
echo Content-Type: text/plain; sleep 1
echo; sleep 1
echo Don\'t panic. This is only a test.; sleep 1
echo; sleep 1
echo --${cvs_delimiter}; sleep 1
echo "Content-Type: text/plain; name=\"test.txt\""; sleep 1
echo "Content-Disposition: attachment; filename=\"test.txt\""; sleep 1
echo "Content-Transfer-Encoding: base64"; sleep 1
echo; sleep 1
encoded_file=$( base64 ./change.log ) # encoding the contents of the file, according to the declaration above
echo "$encoded_file"; sleep 1
echo; sleep 1
echo --${cvs_delimiter}; sleep 1
echo .; sleep 1
echo QUIT
sleep 1; } | telnet $cvs_mail_server $cvs_port
Man kann mit den Verzögerungen herumspielen. Und für (was meiner Meinung nach) eine robustere Lösung wäre, würde ich mich für entscheiden expect(1)
.