Чи можливо для root виконувати команду як некорінь?


10

Я кореневий користувач, і припустимо, я хочу запустити будь-яку програму як інший користувач. Чи можливо це, не переходячи на іншого користувача?

Щось на зразок

# google-chrome user=abc

Я фактично виконую програму CLI як некористувальний користувач. Я включив клейкий біт і використовую setuid, тому програма працює з привілеями root. Тепер я використовую system()в рамках програми, щоб викликати GUI-додаток. Але я не хочу запускати його як root, тому хочу тимчасово скинути привілеї root тільки для цього виклику.


1
Ви справді працюєте як root протягом більшої частини часу?
Кіт

1
@Keith нічого з цього питання не передбачає більшу частину часу .
kojiro

Або ні, тому я прошу роз'яснень.
Кіт

Так, так працює перша програма для кожного користувача. Перший процес у системі запускається як root. Існує маса способів відмовитись від привілеїв, включаючи всі способи, що можуть прискорити привілей, а також ще кілька.
ctrl-alt-delor

Відповіді:


9

Портативним рішенням буде:

su abc -c google-chrome

Однак, оскільки Google-хром вимагає доступу до X11, це, швидше за все, не вдасться, якщо ви не захистили його, що було б дуже поганою ідеєю, особливо під час запуску як root.

Якщо дозволити налаштування / переадресацію X11, кращий спосіб буде

ssh -X abc@localhost google-chrome

або

ssh -Y abc@localhost google-chrome

Чому підхід ssh був би кращим? Чи все-таки це не працюватиме за допомогою сеансу X root користувача?
Стів

1
@Steve Використання su abc -c google-chrome, ймовірно, в першу чергу abcне вдасться, оскільки не може використовувати сеанс root, .Xauthorityоскільки він не читається abc.
jlliagre

На жаль, я неправильно зрозумів вас, я вважав, що ви маєте на увазі, що це буде краще з точки зору безпеки
Стів,

10

Коротка відповідь: "Так, це можливо".

якщо ви хочете виконати програму, яка не є X, тоді просто скористайтеся такою командою:

команда sudo -u abc

Якщо ви хочете запустити якусь програму X як інший користувач, але спочатку зі своїм власним робочим столом, вам потрібно створити допоміжний скрипт, який полегшить ваше життя.

  • створити папку для сміття під домашнім каталогом:

mkdir -p ~ / bin

і за допомогою улюбленого редактора тексту створіть файл ~/bin/xsudoнаступним чином:

#!/bin/bash
# (C) serge 2012
# The script is licensed to all users of StackExchange family free of charge
# Fixes/Enhancements to the script are greatly appreciated. 
# 
# SUDO_ASKPASS has to be set to the path of ssh-askpass
# fix the following two lines if your distribution does not match this autodetection
. /etc/profile.d/gnome-ssh-askpass.sh
export SUDO_ASKPASS="${SSH_ASKPASS}"

SUDOUSERNAME="$1"
shift
xauth nlist "${DISPLAY}"|sudo -HA -u $SUDOUSERNAME env --unset=XAUTHORITY \
bash -c "xauth nmerge - ; $*"

тоді зробіть його виконуваним:

chmod + x ~ / bin / xsudo

і використовувати його так само, як sudoі без будь-яких комутаторів:

xsudo користувацький додаток

Насолоджуйтесь.

PS Починаючи xsessionз rootоблікового запису сильно не рекомендується!


Ви пробували? Я боюся, що цей конкретний приклад не може працювати.
jlliagre

Так, тому що для запуску програми X з іншого сеансу користувача ви повинні дозволити доступ до вашого відображення. Але це теж можливо. На жаль, не пам’ятаю, як саме це робити.
Серж

@jlliagre Однак я пам’ятаю, як хитро запустити додаток X на тому ж хості: ssh -X abc@localhost google-chrome:)
Серж

Хм ... я пишу в коментарях те, що ви вже розміщували 22 хвилини тому ...
Серж,

Але у вас все ще 6 голосів за неробоче рішення, в той час як я отримав лише один за правильне. Модель StackExchange іноді дуже засмучує ...
jlliagre

1

Існує спосіб запустити хром під час входу до кореневого користувача. Якщо ви відкриєте його нормально, це призведе до помилки типу "хром не може бути запущений як корінь".

Для того, щоб запустити його без помилок, right clickробочий стіл, створити нову пускову установку за допомогою команди: chromium-browser --user-data-dir. Ви можете назвати його тим, що ви хочете, зберегти, коли ви відкриєте його, він надасть вам браузер Chrome. (Працює в Ubuntu 10.04.4 LTS)


1
#! /bin/bash
#  (GPL3+) Alberto Salvia Novella (es20490446e)


execute () {
    function="${1}"
    command="${2}"
    error=$(eval "${command}" 2>&1 >"/dev/null")

    if [ ${?} -ne 0 ]; then
        echo "${function}: $error"
        exit 1
    fi
}


executeAsNonAdmin () {
    function="${1}"
    command="${2}"

    eval setPasswordAsker="SUDO_ASKPASS=/usr/libexec/openssh/ssh-askpass"
    run="runuser ${SUDO_USER} --session-command=\"${setPasswordAsker}\" --command=\"${command}\""
    execute "${function}" "${run}"
}


executeAsNonAdmin "" "${@}"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.