Подтвердить что ты не робот

Бит Setuid на python script: Linux против Solaris

Я запускаю этот небольшой python script как для Linux, так и для Solaris как для не привилегированного пользователя:

#!/usr/bin/python
import os
print 'uid,euid =',os.getuid(),os.geteuid()

Перед запуском бит setuid устанавливается в script (не на интерпретаторе python):

chown root:myusergrp getuid.py
chmod 4750 getuid.py

В Solaris эффективный uid устанавливается из-за бит setuid:

uid,euid = 10002 0

Но не в Linux:

uid,euid = 10002 10002

Обратите внимание: версия python равна 2.6 для Solaris и Linux

Возможно ли, что Python Linux работает как Python Solaris?

4b9b3361

Ответ 1

Большинство дистрибутивов Unix обычно не позволяют вам использовать setuid в файле, который использует #! переводчик. Solaris оказывается той, которая позволяет это благодаря использованию более безопасной реализации, чем большинство других дистрибутивов.

См. эту часто задаваемую запись для получения дополнительной информации о том, почему механизм настолько опасен: Как я могу заставить скрипты оболочки setuid работать?

См. эту ссылку для более подробного обсуждения и как скомпилировать исполняемый файл setuid, который будет запускать ваш script: setuid в сценариях оболочки

Соответствующая часть:

int main()
{
   setuid( 0 );
   system( "/path/to/script.sh" );

   return 0;
}

Ответ 2

Я просто поставил два и два вместе сегодня и придумал альтернативное решение: cython --embed.

Следуйте приведенным выше ссылкам по ссылке, и вы получите бинарные исполняемые файлы с вашего Python, чтобы вы могли chown и chmod u+s, заполнив круг без программы-обертки.

Конечно, будьте осторожны с рисками (из этого или любого другого использования setuid) -bugs в вашем script может привести к повышенным привилегиям в системе.

Ответ 3

Вы можете использовать sudo для достижения того, чего хотите. Он работает как разные пользователи:

 sudo -u otheruser command

Разрешения устанавливаются корнем с помощью visudo. Материал setuid/setguid не применяется к скриптам или оболочке в linux, только скомпилированный код.