LINUX.ORG.RU

Залогиниться под рутом в скрипте

 , ,


2

4

Есть удаленный компьютер под Debian Wheezy, на котором:

  • нет ssh,
  • не настроен sudo,
  • у su нет опции -S,
  • остутствует expect и pexpect,
  • при загрузке обновляется репозиторий git и из него выполняется определенный скрипт на Python 3.

Возможно ли с такими ограничениями выполнить определенные действия от рута питоном или создав bash-сценарий и запустив его?
В частности нужно создать правило udev.

Ответ на: комментарий от metrokto

И компьютера нет, и тебя нет. Формулируй задачу, а не мучай местных обитателей своим кривым способом её решения.

anonymous
()
Ответ на: комментарий от metrokto

run.c

#include <stdlib.h>
#include <unistd.h>

// пишу с телефона, могут быть неточности
int main(int argc, char **argv) {
    setuid(geteuid());

    return system(argv[1]);
}
gcc run.c -o run
chown root:yourgroup run
chmod u+s,g+x,o-x run

./run /path/to/your/script.py

Этот.

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

да, этот. просто вызываешь setuid(0) от юзера и ты рут. лол

anonymous
()
Ответ на: комментарий от KennyMinigun

Но это потенциальная дыра в безопасности. По этому делай так только если знаешь, что делаешь, добавь так называемых «sanity checks». А чтоб не велосипедить — настрой sudo.

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

просто питоном, с хоть темже subprocess можно форкать и общаться с чайлдами, зачем expect.
или ремоутшелл поднять, аля телнет.

bl ★★★
()
Ответ на: Читать умеешь? от metrokto

это не задача. Правило udev создаётся для чего-то. Может тебе puppet подойдёт, например.

anonymous
()

А не проще взять и сам скрипт запустить от рута? По формулировке вроде можно.

DeadEye ★★★★★
()
Ответ на: комментарий от metrokto
from subprocess import Popen, PIPE
proc = Popen(['su', '--command="mkdir" /proof_of_work'], stdin=PIPE)
proc.communicate('rootpassword')
proc = Popen(['ls', '-la','/proof_of_work'], stdin=PIPE)
bl ★★★
()
Ответ на: комментарий от bl

Во всех примерах с использованием subprocess.Popen, которые я нашел, используется sudo или su, а в данной версии sudo и su не имеют возможности читать пароль из stdin.

metrokto ★★
() автор топика
Ответ на: комментарий от bl
Python 3.2.3 (default, Feb 20 2013, 17:02:41) 
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from subprocess import Popen, PIPE
>>> proc = Popen(['su', '--command="mkdir" /proof_of_work'], stdin=PIPE)
>>> su: должен запускаться из терминала
metrokto ★★
() автор топика
Ответ на: комментарий от metrokto

Ну тогда все хитрожопо и обидно. Иди к тому компу и дай по нему молотком. Либо попроси NOPASSWD для своего скрипта.

DeadEye ★★★★★
()

супермегарешение: позвать администратора

anonymous
()
Ответ на: комментарий от metrokto

Но для такого нужны права этого самого рута...

Ну так ручками поставь. Или у тебя даже рута в ручном режиме нет?

KennyMinigun ★★★★★
()

А какая проблема поставить pexpect с пользовательскими правами (через setup.py, в смысле)?

Zmicier ★★★★★
()

Автор сегодня у мамы какир?

Mahmood
()

ты недоговариваешь однако
отредактируй свой скрипт на питоне, и если, по твоим словам, он имеет права root - выведи в нем наружу sh
делов-то
А вот получить по яйцам за кухацкерство - обеспечено.

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

Omg. Запустить команду не проблема. Проблема запустить ее от рута.

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

если, по твоим словам, он имеет права root

Это по каким словам? Десять раз уже сказал, пароль рута известен, но скрипт запущен от пользователя.

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

Пользователь может устанавливать модули?

А погуглить?

И собственно, почему нет? Места, где Питон ищет всяко-разно, определяются переменной окружения ($PYTHONPATH, кажется) точно так же, как переменной определяются пути для исполняемостей. И в Дебиане, вроде-бы, ~/.local/lib/python${PYTHON_VERSION}/ есть одно из дефолтных мест.

У setup.py должен быть ключ --user.

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

Это на какой системе так? Afaik, нужен tty в каком либо виде, что также легко педалится сабпроцессом.

anonymous
()

Ну крону скажи выполнить скрипт от рута.

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

Спасибо!

Все оказалось весьма просто:

$ pip-3.2 install --user pexpect
import pexpect

child = pexpect.spawn("su -")
child.expect(".*:")
child.send("myPassword\r")
child.expect(".*# ")
child.sendline("command\r")

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

Тогда по-хорошему тебе надо обратиться к администратору.

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