我有一个在多个服务器上运行的脚本。有些服务器使用 sSMTP ,有些服务器使用 postfix 。
我想找到我的服务器在运行时运行的 sendmail 的版本,因为 sSMTP 不支持-t
,但是强制性的后缀
现在挑战开始了。
关于sSMTP变体输出的{p>sendmail -V
sSMTP 2.64 (Not sendmail at all)
但
postfix变体没有用于显示版本的-V
选项。
我设法使用以下代码段来完成它。
VER=$(sendmail -V 2>/dev/null)
if [[ "sSMTP" == $VER* ]]; then
echo $BODY | sendmail $EMAIL #sSMTP
else
echo $BODY | sendmail -t $EMAIL #postfix
fi
有没有更有效的方法来实现这一目标?
我想在服务器中找到sendmail的变体。不仅仅是postfix或sSMTP。
答案 0 :(得分:2)
有没有更有效的方法来实现这一目标?
是;不要试图找到sendmail版本,并使用标准的邮件发送方式......
您应该使用mail
(或mailx
)命令以获得更好的兼容性
MAILCMD=$(type -p mail || type -p mailx)
echo $BODY | $MAILCMD $EMAIL
答案 1 :(得分:2)
这个怎么样?
type -p sendmail |
xargs dpkg -S
Some packages将其放入/usr/lib
,其他人放入/usr/sbin
等。这显然要求他们在PATH
上。
dpkg -S
告诉您安装文件的软件包的名称,type -p
用于查找sendmail
上的PATH
,以便我们将其传递给{{ 1}}。这显然需要一个基于Debian的发行版(Ubuntu,Mint,你有什么)。
在dpkg -S
系统上ssmpt
上/usr/lib
,输出
PATH
在Postfix系统上,ssmtp: /usr/lib/sendmail
略有不同,
PATH
我认为我没有Exim或Qmail系统,我可以试试这个,但它们应该是可以预测的相似。
另外,如果您想通过来自postfix: /usr/sbin/sendmail
的管道将多行字符串(如电子邮件)传递给sendmail
,则需要引用多行变量为了它的工作。
echo
如果您要使用echo "$body" | sendmail -t
,sendmail -t
应该包含要解析的"$body"
的{{1}}标头 - 这就是To:
选项的作用,所以我不认为你想要一个带有收件人地址的变量。
另外,不要将大写字母用于私有变量名称;大写变量名保留供系统使用。
最后,正如其他地方已经评论的那样,我相信SSMTP和Postfix都支持sendmail
,就像我见过的几乎所有其他Sendmail实现一样。所以最后,我认为你实际上并不需要这个代码来实现这个目标。
答案 2 :(得分:1)
怎么样:
后缀:
$ /usr/sbin/sendmail -C sdfsf
sendmail: fatal: open sdfsf/main.cf: No such file or directory
$ echo $?
75
ssmtp中:
$ /usr/sbin/sendmail -C sdfsf
sendmail: No recipients supplied - mail will not be sent
$ echo $?
0
在脚本中执行/usr/sbin/sendmail -C sdfsf >/dev/null 2>&1
并测试返回值,具体取决于MTA。
/usr/sbin/sendmail -C sdfsf >/dev/null 2>&1
if [ $? -eq 0 ]; then # return code 75 would mean Postfix
echo sSMTP
else
echo Postfix
fi
sSMTP
在Postfix -C
中标识配置文件,如果不存在则导致sendmail
失败并返回代码(75)。 sSMTP如果在有或没有-C
开关的情况下运行,则退出并显示零和消息sendmail: No recipients supplied - mail will not be sent
。测试返回值($?
)以进行识别。
答案 3 :(得分:-2)
这有点hacky,但是应该有用(我会检查带有sSMTP的机器上的man sendmail
没有“postfix”这个词)
echo $(man sendmail)| grep "postfix" | wc -l
基本上,它会解析手册页中的“postfix”一词,如果有的话,则返回1(理论上为0表示sSMTP)。