Изменение пользователя в оболочке Python - PullRequest
0 голосов
/ 28 марта 2012

Я использую Ubuntu на своем сервере.

У меня есть два пользователя, пусть они будут user1 и user2

У каждого пользователя есть своисобственная папка проекта с разрешениями, установленными в соответствии с их потребностями.Но user1 необходимо запустить скрипт python, который находится в папке проекта другого пользователя.Я использую subprocess.Popen для этого.Файл python имеет необходимые права доступа, поэтому у меня нет проблем с вызовом этого скрипта.Но файлы журналов (которые имеют разрешение для user2 ) вызывают ошибку permision denied (так как они принадлежат другому пользователю, а не тому, который мне нужен).

Итак, я попытался изменить пользователя с помощью

Popen("exit", shell=True, stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE) #exit from current user, and be root again
Popen(["sudo", "user2"], shell=True, stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE)
Popen("/usr/bin/python /some/file/directory/somefile.py param1 param2 param3", shell=True, stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE)

Но второе Popen завершилось неудачно с

su: должен запускаться с терминала

Есть ли способ изменить пользователя в оболочке Python?

PS: По некоторым причинам я не могу изменить права пользователя для файлов журнала.Мне нужно найти способ переключиться на другого пользователя ...

РЕДАКТИРОВАТЬ: Мне нужно сделать некоторые разъяснения, чтобы прояснить ситуацию ...

У меня запущены два разных проекта django.У каждого проекта есть пользователь, есть свои собственные пользовательские папки, в которых хранятся коды и журналы каждого проекта.

Теперь в некоторых случаях мне нужно перенести некоторые данные из проекта1 в проект2.Самый простой способ - это написать скрипт на python, который принимает параметры и выполняет соответствующую работу [вставку данных] во втором проекте.

Итак, когда некоторые определенные функции вызываются в project1, я хочу вызвать скрипт py, которыйнаходится в папке проекта project2, поэтому я могу выполнить обновление данных по второму проекту.

Но, так как я вызываю Popen в пределах project1, текущий пользователь - user1.Но в моем скрипте (который в Project2) есть несколько файлов журналов, которые мне запрещены из-за разрешений на доступ ...

Так что, каким-то образом мне нужно переключиться с user1 на user2, чтобы у меня не было проблем с разрешениями, ипозвони в мой файл pythonИли найдите другой способ сделать это ..

1 Ответ

1 голос
/ 28 марта 2012

Как правило, невозможно выдать себя за другого пользователя, не имея разрешения root или не зная логин второго пользователя.Это сделано намеренно, и никакое количество Python не сможет его обойти.

Python-ey способы решения проблемы:

  • Если у вас есть разрешение, вы можете использоватьos.setuid(x), (где x - числовой идентификатор пользователя), чтобы изменить эффективный идентификатор пользователя.Однако это потребует запуска вашего скрипта от имени пользователя root.Ознакомьтесь с документацией os для модуля .

  • Если у вас есть разрешение, вы также можете попробовать su -c <command> вместо sudo.su -c потребует от вас ввода пароля на stdin (для которого вы можете использовать библиотеку pexpect )

Unix-е способы решения проблемы:

  • Установите разрешение исполняемого файла группы для сценария и включите обоих пользователей в одну группу.
  • Добавьте бит setuid в сценарий, чтобы user1 мог эффективно запускать его как user2:

    $ chmod g+s script
    

    Это позволит членам группы запускать сценарий от имени пользователя user2.(то же самое можно сделать для «всего», но это, вероятно, не будет хорошей идеей ...)

[РЕДАКТИРОВАТЬ]: пересмотренный вопрос

Ответ в том, что ты слишком беспорядочный.Проект A и проект B, вероятно, не должны взаимодействовать друг с другом, путаясь в файлах друг друга с помощью Popen сценариев друг друга.Вместо этого, чистое решение состоит в том, чтобы иметь веб-интерфейс в проекте A, который дает вам необходимую функциональность, и вызывать его из проекта B. Таким образом, если в будущем вы захотите переместить A на другой хост, это не проблема.,

Если вы настаиваете, вы можете обмануть sudo (если у вас есть разрешение), запустив его вместо оболочки.например, есть скрипт:

#!/bin/sh
sudo my/problematic/script.sh

А затем chmod it + x и выполните его из python.Это позволит обойти проблему невозможности запуска sudo за пределами терминала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...