2016-09-23 11 views
1

У меня есть сценарий, который работает на нескольких серверах. Некоторые серверы используют sSMTP, а некоторые используют постфикс.Найти версию sendmail (sSMTP или Postfix или другое)

Я хочу найти какую версию Sendmail мой сервер работает в режиме исполнения, поскольку -t не поддерживается в SSMTP но является обязательным в Postfix

Теперь начинается вызов.

sendmail -V на SSMTP вариантных выходов sSMTP 2.64 (Not sendmail at all) но вариант постфикса не имеет -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.

+0

Не можете ли вы спросить менеджера пакетов, например, 'apt list', что установлено? – Robert

+0

Почему, по вашему мнению, 'ssmtp' не поддерживает' sendmail -t'? Моя делает. См. [Man page] (https://linux.die.net/man/8/ssmtp) – tripleee

+0

экземпляр sendmail, если ssmtp? @tripleee Я так не считаю! – Sibidharan

ответ

2

Как насчет этого?

type -p sendmail | 
xargs dpkg -S 

Some packages положить его в /usr/lib, другие в /usr/sbin и т.д. Это, очевидно, требует от них, чтобы быть на вашем PATH.

dpkg -S сообщает вам имя пакета, который установлен файл и type -p используется для поиска sendmail на вашем PATH, чтобы мы могли передать, что dpkg -S. Для этого, очевидно, требуется дистрибутив Debian (Ubuntu, Mint, что у вас есть).

ssmpt На системе с /usr/lib на PATH, выход

ssmtp: /usr/lib/sendmail 

В системе Postfix с немного другой PATH,

postfix: /usr/sbin/sendmail 

Я не думаю, что у меня есть Exim или Qmail, где я могу попробовать это, но они должны быть схожими.

В качестве стороннего варианта, если вы хотите передать многострочную строку, такую ​​как сообщение электронной почты, на номер sendmail через трубу от echo, вам нужно будет указать многострочную переменную, чтобы она работала.

echo "$body" | sendmail -t 

Если вы хотите использовать sendmail -t, то "$body" должен содержать To: заголовок sendmail для разбора - это то, что делает вариант -t, так что я не думаю, что вы хотите переменную с адресом получателя в этот сценарий.

Кроме того, не используйте заглавные буквы для имен вашей частной переменной; Имена заглавных переменных зарезервированы для использования в системе.

Наконец, как уже отмечалось в другом месте, я считаю, что поддержка SSMTP и Postfix sendmail -t, как и любая другая реализация Sendmail, которую я видел. Поэтому, в конце концов, я не думаю, что вам действительно нужен этот код для достижения этой цели.

+0

Вот именно то, что я хочу! Благодарю. – Sibidharan

+0

Я нахожусь на Debian с установленным sSMTP, с '/ usr/lib' на пути. 'type -p sendmail | xargs dpkg -S' дает мне' ssmtp:/usr/sbin/sendmail'. –

+0

Да, ssmtp устанавливает его в обоих местоположениях, поэтому в зависимости от того, какой из первых на вашем «PATH» будет поднят. Если это ваш комментарий? – tripleee

-2

Это немного Hacky, но он должен работать (я бы проверить, что man sendmail на машине с SSMTP не имеет слово «суффикса»)

echo $(man sendmail)| grep "postfix" | wc -l

В основном он анализирует справочную страницу для слово «постфикс» и возвращает 1, если он имеет его (теоретически 0 для sSMTP).

+0

Я думаю, что мой скрипт делает то же самое .. В чем разница? – Sibidharan

+0

В моем скрипте я использовал 'sendmail -V' sSMTP, а затем сравнивал его с помощью' if == 'inside bash! Практически вы предлагаете то, что я сделал по-другому. Но мой реальный вопрос: ** (sSMTP или Postfix или другое) **, где другое означает, что исходный sendmail тоже !! + другие варианты. – Sibidharan

+0

[Бесполезное использование 'echo'] (http://www.iki.fi/era/unix/award.html#echo) здесь немного странно.Вы можете передать 'man' в' grep' просто отлично (и если бы вы не смогли, вы не смогли бы также «отменить» его зафиксированное значение). Обычным способом проверки соответствия является 'grep -q'; если вы действительно заботитесь о количестве соответствующих строк, это 'grep -c'. – tripleee

2

Есть ли более эффективный метод для достижения этого?

Да; не пытайтесь найти Sendmail версии, а также использовать стандартный способ отправки почты ...

Вы должны использовать команду mail (или mailx) для лучшей совместимости

MAILCMD=$(type -p mail || type -p mailx) 
echo $BODY | $MAILCMD $EMAIL 
+0

Я не являюсь нисходящим, но если намерение заключается в использовании 'sendmail -t', где это возможно, я не думаю, что' mail' или 'mailx' раскрывает это (и вы просто переместите цель проблемы здесь что, если ни один из них не доступен?) – tripleee

+0

@ tripleee ему нужно было использовать 'sendmail -t', потому что в соответствии с его утверждением он был обязательным для некоторых версий постфикса. Я редактировал свой пост, чтобы отразить причину моего ответа. – Adam

+1

Спасибо, что выделили это. Я согласен с тем, что использование утилиты пользовательского уровня является разумным решением для этого, но «mail» и его производные еще менее переносимы, чем «sendmail», потому что существует так много разнообразных реализаций с различными функциями. Конечно, если вы можете принять Debian, как и в моем ответе, у вас нет этой неопределенности. – tripleee

1

Как насчет:

Postfix:

$ /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. Проверьте идентификационное значение ($?).

+0

Какой момент вы пытаетесь сделать – Sibidharan

+1

Мой вопрос касается не только ssmp или postfix! Речь идет обо всех подобных случаях. Даже оригинальная отправка почты .. Как это сделать !? – Sibidharan

+0

Невозможно диагностировать каждый отдельный SMTP-сервер, исследуя его режимы отказа, но это будет большая работа, и если все, что вам действительно волнует, это то, поддерживает ли он параметр -t', возможно, просто прощупайте это. Как я уже упоминал в другом месте, он переносится на все 'sendmail', которые я пробовал, включая' ssmtp' и (IIRC) 'qmail'. – tripleee