Whilst my network is predominately CentOS 5 hosts, I’ve started moving many of them to CentOS 6, mostly on a basis of doing so whenever a host needs a particularly newer version, since I don’t really want to spend an entire week rebuilding all 30-odd VMs.
One problem I encountered was a number of scripts failing when sending emails, throwing out messages to STDERR:
[example] contains invalid character '[' send-mail: invalid option -- 's' send-mail: invalid option -- 's' send-mail: fatal: usage: send-mail [options]
What I found is that on CentOS/RHEL 5, the following would work fine:
# mail root -s "[example] message" test message content Cc: #
But on CentOS/RHEL 6, it would ignore the subject field (as can be seen by it re-asking for it) and then fail with an annoying “invalid character” error:
# mail root -s "[example] message" [example] contains invalid character '[' Subject: test message content EOT # # send-mail: invalid option -- 's' send-mail: invalid option -- 's' send-mail: fatal: usage: send-mail [options] #
Turns out that between mailx version 8.1.1 and mailx version 12.4, the mailx binary got a lot more fussy about the formatting of the command line options.
Viewing the help on both versions shows that options need to come before the destination user, however it seems that older versions of mailx were a bit slacker and accepted some flexibility of command line options.
Usage: mail -eiIUdEFntBDNHRV~ -T FILE -u USER -h hops -r address \ -s SUBJECT -a FILE -q FILE -f FILE -A ACCOUNT -b USERS -c USERS \ -S OPTION users
The correct solution, is to always have the target user as the final field, after the command line options, aka:
# mail -s "[example] message" root test message content Cc: #
This will work happily on all versions since it’s correct syntax of the command line options.
Hopefully everyone else is smart enough to do this the right way the first time, but figured I’d post this incase some other poor sysadmin is having the same confusion over the invalid character message. :-)