L'exécution du script shell interactif dans le nom d'un autre utilisateur

StackOverflow https://stackoverflow.com/questions/3628695

  •  26-09-2019
  •  | 
  •  

Question

Dans mon script shell (bash) Je veux appeler d'autres scripts shell.
je lance mon script user_a. L'un de ces scripts nécessitant un traitement particulier:

  1. Il doit être exécuté en tant qu'utilisateur différent (Utilisateur_b). Mot de passe nécessaire ici.
  2. Il est interactif, mais demande non seulement questions, mais exécute un autre script le nom d'un autre utilisateur (Utilisateur_c) en utilisant su. Je dois entrer un mot de passe ici ainsi.

Je peux utiliser su appeler ce script, mais ses questions doivent répondre en quelque sorte. Je ne peux pas entrer quoi que ce soit parce qu'il imprime pour chaque questons « stty:: Pas une machine à écrire »

J'appelle le script spécial de cette façon

su user_B << ABC
...
special_script
...
ABC
Était-ce utile?

La solution

#!/bin/bash

main_for_root(){
    :
}
# ------------------------------------------------------------------------------
abs_path="$(readlink -f `dirname $0`)/$(basename $0)"

# if [ `id -u` != 0 ] ; then
if [ `whoami` != 'root' ] ; then
    echo "[su -] run as root"
    su -c"/bin/bash $abs_path $@"
    exit 0
else
    main_for_root $@
fi

Il fonctionne pour 1 utilisateur, il faut donc ajouter maintenant « si ... » pour la deuxième utilisateur

Autres conseils

Une autre option pour les scripts en cours d'exécution que d'autres utilisateurs est la commande « sudo », pensez comme « super-utilisateur faire: » pour des raisons de lisibilité. Le paramètre -u donne des informations nom d'utilisateur. Donc:

sudo -u user_B special_script

demandera le mot de passe pour Utilisateur_b. Je ne l'ai jamais eu un problème avec l'exécution des programmes interactifs qui l'utilisent. Vous pouvez gérer qui peut SUDO à qui via la commande visudo.

Vous pouvez utiliser sudo et créer un fichier sudoers qui permet user_a d'exécuter le script comme Utilisateur_b.

une ligne comme:

user_A      ALL = (user_B) NOPASSWD: /usr/share/stuff/ABC

permettrait user_a de faire quelque chose comme

sudo -u user_B /usr/share/stuff/ABC

sans demander un mot de passe

tentatives de su pour obtenir un mot de passe du terminal et a besoin d'un dispositif de TTY il peut appeler ioctl pour désactiver la clé faisant écho. Depuis l'entrée standard provient d'un « document en » (ABC), une tentative d'appeler l'ioctl sur descripteur de fichier 0 rendements « pas TTY ».

Si vous devez utiliser un document ici au lieu d'un de bonne foi script, procédez comme:

cat > /tmp/myscript.$$ <<ABC
#!/bin/sh
...
ABC
chmod +x /tmp/myscript.$$
sudo -u user_B /tmp/myscript.$$

Vous pouvez utiliser expect. Son conçu pour l'interaction scriptée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top