Разрешить пользователю выполнять сценарий оболочки, не видя его содержимого?

1391
James

Я хотел бы иметь 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.

1

2 ответа на вопрос

3
Jeremy Sturdivant

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

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

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

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

`setuid (geteuid ())`, похоже, нужен. grawity 13 лет назад 0
Совершенно верно, хороший улов! Отредактировано, чтобы отразить это. Jeremy Sturdivant 13 лет назад 0
Мне по-прежнему отказывают в разрешении, когда я запускаю от имени другого пользователя: `/ bin / bash: /path/to/send-incoming-email.sh: Разрешение отклонено` (permissions:` -rwsr-xr-x 1 james james 7227 Feb 18 16:45 входящий.почта`) James 13 лет назад 0
Чтобы уточнить, вы запускаете входящую почту от другого пользователя, и это сообщение приводит? Попробуйте запустить «id» вместо сценария входящей электронной почты, чтобы проверить работу setuid, и убедитесь, что сценарий входящей электронной почты работает непосредственно от вашего пользователя. Jeremy Sturdivant 13 лет назад 0
2
grawity

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


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

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