1

Я хотел бы иметь HG-хук, который отправляет электронную почту, используя учетную запись Gmail. Очевидно, я не хочу, чтобы кто-либо мог прочитать сценарий отправки электронной почты, кроме меня или root, поскольку в нем есть пароль, поэтому я попробовал вот что:

-rwsr-xr-x  1 james james   58 Feb 18 12:05 incoming.email.sh
-rwx--x--x  1 james james  262 Feb 18 12:04 send-incoming-email.sh

где incoming.email.sh - файл, выполненный как ловушка:

#! /bin/bash
/path/to/send-incoming-email.sh

Однако, когда я пытаюсь работать от имени другого пользователя, я получаю сообщение об ошибке:

/bin/bash: /path/to/send-incoming-email.sh: Permission denied

Файл send-incoming-email.sh отлично работает, когда я запускаю сам.

Возможно ли то, что я пытаюсь сделать, или setuid не будет распространяться на команды, выполняемые из сценария оболочки?

Система Ubuntu 10.04.2 LTS.

2 ответа2

3

Если вам нужно, чтобы ваше решение работало как есть, простой способ - использовать короткую программу на C вместо сценария оболочки:

int main(){
setuid(geteuid());
system("/path/to/send-incoming-email.sh");
}

И имейте это setuid, таким образом избегая условия гонки и в то же время позволяя вам выдавать выполнение скрипта от имени root.

Это далеко не лучшее решение, но оно решит проблему, как описано.

2

Linux будет игнорировать бит setuid для сценариев оболочки, чтобы избежать возможных условий гонки.


"Правильный" способ отправки электронной почты в системах Unix/Linux - это настроить MTA, такой как Postfix, Exim4 или Sendmail, и разрешить ему обрабатывать ошибки аутентификации SMTP. Также есть MTA "только для реле" - esmtp, msmtp, ssmtp. Все они могут выполнять SMTP-ретрансляцию ("smarthost") с аутентификацией, например, через серверы Gmail. Это становится сложнее на многопользовательской машине, но все же выполнимо.

(Когда настроен MTA, отправка электронного письма осуществляется путем передачи данных в /usr/sbin/sendmail rcpt@address .)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .