Разрешить пользователю выполнять сценарий оболочки, не видя его содержимого?
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
Однако, когда я пытаюсь работать от имени другого пользователя, я получаю сообщение об ошибке:
send-incoming-email.shФайл прекрасно работает, когда я бегу, как я.
Возможно ли то, что я пытаюсь сделать, или setuid не будет распространяться на команды, выполняемые из сценария оболочки?
Система Ubuntu 10.04.2 LTS.
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.)