LINUX.ORG.RU

Сменить пользователя в python.


1

1

Доброго времени суток. Есть cgi скрипт на python. Нужно залогиниться под определённым пользователем и записать какой-нибудь файл в домашней директории. С login вообще не получается (даже если просто в терминале вводить, он закрывается). Пробовал так

subprocess.call(shlex.split("su -l user"), stdin=open("password.txt", "r"))
print subprocess.check_output("id") # Выводит совсем не того пользователя.
ЧЯДНТ?


По всей видимости su проверяет, что stdin действительно является терминалом, и поэтому если Вы хотите передать пароль, то нужно использовать Expect.

Однако по-моему Вы пытаетесь сделать что-то, что с точки зрения архитектуры не очень-то хорошо делать.

Minoru ★★★
()
Последнее исправление: Minoru (всего исправлений: 1)
Ответ на: комментарий от Minoru

Дело в том, что будет всего один пользователь. Поэтому совсем не хочется ставить полноценную систему для множества юзеров. ftp не подходит потому, что нужно записать файл, а потом его скомпилировать.

Selat
() автор топика
Ответ на: комментарий от Minoru

Попробовал так:

child = pexpect.spawn("su -l user")
child.sendline("password")
print subprocess.check_output("id") # Опять не тот пользователь.

Selat
() автор топика

Ну так всё вполне ожидаемо. check_output Запускает новый процесс относительно родительского (процесса твоего скрипта) и он никак не связан с прошлым вызовом. Пробуй например делать через su -c «моя команда».

Hater ★★
()

через sudo делай. Если скрипт от рута пускается то fork и os.setuid() или типа того.

true_admin ★★★★★
()
Ответ на: комментарий от Selat

Тогда уж так, раз уж извращаться:

child = pexpect.spawn("su -l user")
child.sendline("password")
child.sendline("command")
Minoru ★★★
()
Ответ на: комментарий от Hater

Спасибо - почти помогло. Теперь скрипт такой:

child = pexpect.spawn("su -l user -c \"mkdir ~/testdir\"")
child.expect("Password: ")
child.sendline("password")
child.expect("\n")
Если запускать так
su -l user2 -c "./test.py"
То всё работает. Но вот если этот же скрипт запускать через сервер (apache), то директория не создаётся. ЧЯДНТ?

Selat
() автор топика
Ответ на: комментарий от Selat

Как оказалось если запускать так (только под рутом - почему-то из-под обычного пользователя зависает):

su -l user2 -c "./test.py"
То работает. А если зайти под user2 и запустить test.py, то не работает.

Selat
() автор топика

Можете пожалуйста объяснить в чём разница?

Selat
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.