options su - commande en cours d'exécution sous un autre utilisateur

76

Je me demandais comment exécuter une commande en tant qu'un autre utilisateur à partir d'un script.

J'ai le propriétaire du script défini en tant que root. J'ai également la commande suivante en cours d'exécution dans le script pour exécuter la commande en tant qu'utilisateur hudson:

su -c command hudson

Est-ce la syntaxe correcte?

Éboueur
la source
Pour les autres utilisateurs: certains utilisateurs peuvent avoir cette capacité désactivée à dessein. Tu peux courir sudo cat /etc/passwd | grep user-abc. Si vous voyez quelque chose comme ceci: user-abc:x:994:994::/home/user-abc:/bin/falsealors cela ne fonctionnera pas. C'est parce que la dernière partie " /bin/false" signifie qu'il n'y a pas de shell pour cet utilisateur.
Alexander Bird

Réponses:

80

Oui. Voici le --help:

$ su --help
Usage: su [options] [LOGIN]

Options:
  -c, --command COMMAND         pass COMMAND to the invoked shell
  -h, --help                    display this help message and exit
  -, -l, --login                make the shell a login shell
  -m, -p,
  --preserve-environment        do not reset environment variables, and
                                keep the same shell
  -s, --shell SHELL             use SHELL instead of the default in passwd

Et quelques tests (j'ai utilisé sudocar je ne connais pas le mot de passe du nobodycompte)

$ sudo su -c whoami nobody
[sudo] password for oli: 
nobody

Lorsque votre commande prend des arguments, vous devez la citer. Si vous ne le faites pas, des choses étranges se produiront. Je suis, en tant que root, en train de créer un répertoire dans / home / oli (en tant qu'oli) sans citer la commande complète:

# su -c mkdir /home/oli/java oli
No passwd entry for user '/home/oli/java'

Il ne lit mkdirque la valeur du -cdrapeau et tente de l'utiliser /home/oli/javacomme nom d'utilisateur. Si nous le citons, cela fonctionne:

# su -c "mkdir /home/oli/java" oli
# stat /home/oli/java
  File: ‘/home/oli/java
  Size: 4096        Blocks: 8          IO Block: 4096   directory
Device: 811h/2065d  Inode: 5817025     Links: 2
Access: (0775/drwxrwxr-x)  Uid: ( 1000/     oli)   Gid: ( 1000/     oli)
Access: 2016-02-16 10:49:15.467375905 +0000
Modify: 2016-02-16 10:49:15.467375905 +0000
Change: 2016-02-16 10:49:15.467375905 +0000
 Birth: -
Oli
la source
52

Remarque: "Le propriétaire du script est défini en tant que root" ne fait rien; même si vous avez défini le bit setuid, il ne fonctionne toujours pas


En supposant que vous exécutiez le script en tant que root, vous pouvez toutefois l'utiliser sudo. suest principalement destiné à changer d’utilisateur, alors que sudopour exécuter des commandes comme les autres utilisateurs. Le -udrapeau vous permet de spécifier quel utilisateur exécuter la commande en tant que:

sudo -u hudson command
Michael Mrozek
la source
1
Plusieurs fois , je l' ai rencontrés (sur les systèmes où sudoers est bien administré) que vous essayez d'utiliser , sudovous pouvez simplement obtenir ceci: root is not in the sudoers file. Ce qui fait su - <username> -c "command to run"la seule option.
RAM237
Citations non nécessaires lors de l'exécution d'une commande non triviale. (Par exemple sudo -u kilgore mv this that)
toraritte