查找 sendmail 版本(sSMTP 或 Postfix 或其他)
Find sendmail version (sSMTP or Postfix or other)
我有一个在多台服务器上运行的脚本。有些服务器使用 sSMTP,有些服务器使用 postfix。
我想在运行时查找我的服务器 运行 的 sendmail 版本,因为 sSMTP 不支持 -t
但在 Postfix
中是强制性的
现在挑战开始。
sendmail -V
在 sSMTP 变体输出上 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 变体。不仅仅是后缀或 sSMTP。
这有点 hacky,但应该可以工作(我会检查带有 sSMTP 的机器上的 man sendmail
没有单词 "postfix")
echo $(man sendmail)| grep "postfix" | wc -l
基本上它会解析单词 "postfix" 和 returns 1 个联机帮助页(理论上 sSMTP 为 0)。
Is there a more efficient method to achieve this?
是;不要试图找到 sendmail 版本,并使用标准方式发送邮件...
您应该使用 mail
(或 mailx
)命令以获得更好的兼容性
MAILCMD=$(type -p mail || type -p mailx)
echo $BODY | $MAILCMD $EMAIL
怎么样:
后缀:
$ /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
并测试 return 值,该值因 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
失败并显示 return 代码 (75)。如果 运行 有或没有 -C
开关,sSMTP 将以零和消息 sendmail: No recipients supplied - mail will not be sent
退出。测试 return 值 ($?
) 以进行识别。
这个怎么样?
type -p sendmail |
xargs dpkg -S
Some packages放在/usr/lib
,其他放在/usr/sbin
,等等。这显然需要他们在你的PATH
。
dpkg -S
告诉您安装文件的包的名称,type -p
用于在您的 PATH
上查找 sendmail
,因此我们可以将其传递给dpkg -S
。这显然需要 Debian-based 发行版(Ubuntu,Mint,你有什么)。
在 ssmpt
系统上,/usr/lib
在 PATH
上,输出是
ssmtp: /usr/lib/sendmail
在稍微不同的 Postfix 系统上 PATH
,
postfix: /usr/sbin/sendmail
我认为我没有可以尝试此操作的 Exim 或 Qmail 系统,但可以预见它们应该是相似的。
顺便说一句,如果你想通过来自 echo
的管道将 multi-line 字符串(例如电子邮件)传递给 sendmail
,你需要引用multi-line 变量以使其工作。
echo "$body" | sendmail -t
如果要使用 sendmail -t
,"$body"
应该包含 To:
header 以便 sendmail
解析——这就是 -t
选项,所以我认为在这种情况下您不需要带有收件人地址的变量。
此外,不要为您的私有变量名使用大写字母;大写变量名保留供系统使用。
最后,正如其他地方已经评论的那样,我相信 SSMTP 和 Postfix 都支持 sendmail -t
,就像我见过的几乎所有其他 Sendmail 实现一样。所以最后,我认为您实际上不需要此代码来实现该目标。
我有一个在多台服务器上运行的脚本。有些服务器使用 sSMTP,有些服务器使用 postfix。
我想在运行时查找我的服务器 运行 的 sendmail 版本,因为 sSMTP 不支持 -t
但在 Postfix
现在挑战开始。
sendmail -V
在 sSMTP 变体输出上 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 变体。不仅仅是后缀或 sSMTP。
这有点 hacky,但应该可以工作(我会检查带有 sSMTP 的机器上的 man sendmail
没有单词 "postfix")
echo $(man sendmail)| grep "postfix" | wc -l
基本上它会解析单词 "postfix" 和 returns 1 个联机帮助页(理论上 sSMTP 为 0)。
Is there a more efficient method to achieve this?
是;不要试图找到 sendmail 版本,并使用标准方式发送邮件...
您应该使用 mail
(或 mailx
)命令以获得更好的兼容性
MAILCMD=$(type -p mail || type -p mailx)
echo $BODY | $MAILCMD $EMAIL
怎么样:
后缀:
$ /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
并测试 return 值,该值因 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
失败并显示 return 代码 (75)。如果 运行 有或没有 -C
开关,sSMTP 将以零和消息 sendmail: No recipients supplied - mail will not be sent
退出。测试 return 值 ($?
) 以进行识别。
这个怎么样?
type -p sendmail |
xargs dpkg -S
Some packages放在/usr/lib
,其他放在/usr/sbin
,等等。这显然需要他们在你的PATH
。
dpkg -S
告诉您安装文件的包的名称,type -p
用于在您的 PATH
上查找 sendmail
,因此我们可以将其传递给dpkg -S
。这显然需要 Debian-based 发行版(Ubuntu,Mint,你有什么)。
在 ssmpt
系统上,/usr/lib
在 PATH
上,输出是
ssmtp: /usr/lib/sendmail
在稍微不同的 Postfix 系统上 PATH
,
postfix: /usr/sbin/sendmail
我认为我没有可以尝试此操作的 Exim 或 Qmail 系统,但可以预见它们应该是相似的。
顺便说一句,如果你想通过来自 echo
的管道将 multi-line 字符串(例如电子邮件)传递给 sendmail
,你需要引用multi-line 变量以使其工作。
echo "$body" | sendmail -t
如果要使用 sendmail -t
,"$body"
应该包含 To:
header 以便 sendmail
解析——这就是 -t
选项,所以我认为在这种情况下您不需要带有收件人地址的变量。
此外,不要为您的私有变量名使用大写字母;大写变量名保留供系统使用。
最后,正如其他地方已经评论的那样,我相信 SSMTP 和 Postfix 都支持 sendmail -t
,就像我见过的几乎所有其他 Sendmail 实现一样。所以最后,我认为您实际上不需要此代码来实现该目标。