Est-il possible pour root d'exécuter une commande en tant que non root?


10

Je suis un utilisateur root et je suppose que je veux exécuter n'importe quelle application en tant qu'autre utilisateur. Est-ce possible sans passer à un autre utilisateur?

Quelque chose comme

# google-chrome user=abc

J'exécute en fait un programme CLI en tant qu'utilisateur non root. J'ai activé le bit collant et j'utilise setuid, donc le programme s'exécute avec les privilèges root. Maintenant, j'utilise system()dans le programme pour appeler une application GUI. Mais je ne veux pas l'exécuter en tant que root, donc je veux supprimer temporairement les privilèges root uniquement pour cet appel.


1
Courez-vous vraiment en tant que root la plupart du temps?
Keith

1
@Keith rien dans la question n'implique la plupart du temps .
kojiro

Ou non, c'est pourquoi je demande des éclaircissements.
Keith

Oui, c'est ainsi que le premier programme pour chaque utilisateur est exécuté. Le premier processus sur le système est exécuté en tant que root. Il existe de nombreuses façons de supprimer des privilèges, y compris toutes les façons qui peuvent augmenter les privilèges, ainsi que d'autres.
ctrl-alt-delor

Réponses:


9

Une solution portable serait:

su abc -c google-chrome

Cependant, comme google-chrome nécessite un accès X11, cela échouera probablement à moins que vous ne le sécurisiez, ce qui serait une très mauvaise idée, surtout lors de l'exécution en tant que root.

Si le réglage / transfert X11 est autorisé, une meilleure façon serait

ssh -X abc@localhost google-chrome

ou

ssh -Y abc@localhost google-chrome

Pourquoi l'approche ssh serait-elle meilleure? Cela ne fonctionnerait-il pas toujours en utilisant la session X de l'utilisateur root?
Steve

1
@Steve Using su abc -c google-chromeéchouera probablement en premier lieu car abcne peut pas utiliser la session root, .Xauthorityétant illisible pour abc.
jlliagre

Oups désolé de vous avoir mal compris, je pensais que vous vouliez dire que ce serait mieux du point de vue de la sécurité
Steve

10

Réponse courte: "Oui, c'est possible".

si vous souhaitez exécuter une application non X, utilisez simplement la commande suivante:

commande sudo -u abc

Si vous aimez exécuter une application X en tant qu'autre utilisateur, mais avec votre propre bureau, vous devez d'abord créer un script d'aide, cela vous simplifiera la vie

  • créez un dossier bin sous votre répertoire personnel:

mkdir -p ~ / bin

et en utilisant votre éditeur de texte préféré, créez un fichier ~/bin/xsudocomme suit:

#!/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 - ; $*"

puis rendez-le exécutable:

chmod + x ~ / bin / xsudo

et utilisez-le de la même manière que sudosans commutateur:

application utilisateur xsudo

Prendre plaisir.

PS Il est fortement déconseillé de xsessionpartir du rootcompte!


Est-ce que tu l'as essayé ? J'ai peur que cet exemple particulier ne fonctionne pas.
jlliagre

Oui, car pour démarrer une application X à partir d'une autre session utilisateur, vous devez autoriser l'accès à votre affichage. Mais c'est aussi possible. Malheureusement, je ne me souviens pas exactement comment procéder.
Serge

@jlliagre Cependant, je me souviens comment démarrer une application X sur le même hôte de manière délicate: ssh -X abc@localhost google-chrome:)
Serge

Hmm ... J'écris dans les commentaires ce que tu as déjà posté il y a 22 min ...
Serge

Mais vous avez encore 6 votes pour une solution qui ne fonctionne pas alors que je n'en ai obtenu qu'un pour une solution correcte. Le modèle StackExchange est parfois assez frustrant ...
jlliagre

1

Il existe un moyen d'exécuter chrome lorsque vous êtes connecté à l'utilisateur root. Si vous l'ouvrez normalement, il vous donnera une erreur comme "le chrome ne peut pas être exécuté en tant que root".

Pour l' exécuter sans l'erreur, right clickvotre bureau, créez un nouveau lanceur avec la commande: chromium-browser --user-data-dir. Vous pouvez le nommer comme vous le souhaitez, l'enregistrer, lorsque vous l'ouvrirez, il vous donnera le navigateur chrome. (Fonctionne dans 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 "" "${@}"
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.