2010-10-06 11 views
4

LA NOUVELLE QUESTION: J'essaie de créer un script unifié qui initialise une nouvelle installation Ubuntu à mon goût, il doit être exécuté sous sudo pour installer les paquets, mais l'utilisation de gconftool-2 pour affecter le paramètre gconf repose sur la session dbus qui n'est pas gérée correctement par la méthode consistant à simplement changer l'UID dans le script seul. Est-ce que quelqu'un sait comment réussir à faire cela?Comment puis-je exécuter un script Perl en tant que root tout en affectant les paramètres de l'utilisateur gconf

OLD QUERY: J'écris un script Perl à exécuter au premier démarrage d'une nouvelle installation d'Ubuntu. Cela facilite l'ajout de référentiels, l'installation de packages et la définition de paramètres gconf. Mon problème est les permissions. Pour installer des paquets, j'ai besoin que le script soit exécuté en tant que sudo, mais alors l'appel gconftool-2 agit sur l'utilisateur root et non sur mon utilisateur personnel.

Répondre

0

Après de nombreuses lectures et essais et erreurs, il semble que ce qui manque lorsque vous exécutez un script en tant que root, c'est que la variable d'environnement DBUS_SESSION_BUS_ADDRESS n'est pas définie. Cela doit être défini ET l'uid modifié pour celui de l'utilisateur avant que les paramètres gconf puissent être définis. C'est mon script de test que j'ai utilisé pour l'essayer. Exécutez l'un ou l'autre des appels système à la fin pour changer l'ordre des boutons de la fenêtre. Essayez le script en tant qu'utilisateur ou en tant que root (sudo) pour voir que cela fonctionne.

#!/usr/bin/perl 

use strict; 
use warnings; 

use POSIX; 

# get the user's name (as opposed to root) 
my $user_name = getlogin(); 
# get the uid of the user by name 
my $user_uid = getpwnam($user_name); 
print $user_name . ": " . $user_uid . "\n"; 

my %dbus; 
# get the DBUS machine ID 
$dbus{'machine_id'} = qx{cat /var/lib/dbus/machine-id}; 
chomp($dbus{'machine_id'}); 
# read the user's DBUS session file to get variable DBUS_SESSION_BUS_ADDRESS 
$dbus{'file'} = "/home/" . $user_name . "/.dbus/session-bus/" . $dbus{'machine_id'} . "-0"; 
print "checking DBUS file: " . $dbus{'file'} . "\n"; 
if (-e $dbus{'file'}) { 
    open(my $fh, '<', $dbus{'file'}) or die "Cannot open $dbus{file}"; 
    while(<$fh>) { 
    if (/^DBUS_SESSION_BUS_ADDRESS=(.*)$/) { 
     $dbus{'address'} = $1; 
     print "Found DBUS address: " . $dbus{'address'} . "\n"; 
    } 
    } 
} else { 
    print "cannot find DBUS file"; 
} 

# set the uid to the user's uid not root's 
POSIX::setuid($user_uid); 
# set the DBUS_SESSION_BUS_ADDRESS environment variable 
$ENV{'DBUS_SESSION_BUS_ADDRESS'} = $dbus{'address'}; 

my $command1 = 'gconftool-2 --set "/apps/metacity/general/button_layout" --type string "menu:maximize,minimize,close"'; 
my $command2 = 'gconftool-2 --set "/apps/metacity/general/button_layout" --type string "menu:minimize,maximize,close"'; 
system($command1); 
## or 
#system($command2); 

Remarque: Vous avez de bonnes informations here.

2

Vous pouvez utiliser la commande sudo pour déposer vos privilèges root comme:

sudo -u 'your_username' gfconftool-2 
+0

J'ai fait quelques tests et je ne suis pas sûr que cela fonctionne, bien que cela semble certainement le cas! –

+0

Juste nettoyer certaines choses. Encore une fois, la raison pour laquelle cela ne fonctionne pas est que la variable ENV ci-dessus n'est pas définie. Essayez 'perl -E ', dites $ <. "\ n". $ ENV {'DBUS_SESSION_BUS_ADDRESS'} '' en tant qu'utilisateur, sous 'sudo' et sous' sudo -u username' pour voir la différence –

4

Vous pouvez modifier uids au milieu du script en modifiant le uid avec POSIX::setuid() (voir perldoc POSIX):

use POSIX 'setuid'; 

# call cpan to install modules... 

POSIX::setuid($newuid); 

# ... continue with script 
+0

Cela semble prometteur. Combiné avec getlogin() pour obtenir le nom de connexion, et getpwnam (nom) pour obtenir mon uid au début, ça devrait marcher, j'espère. –

+0

Malheureusement, cela ne suffit pas. Après avoir lu un peu plus, gconftool-2 vérifie avec dbus en quelque sorte de faire sa magie. C'est bien au-dessus de ma tête. Je vais éditer ma question, mais si ça ne marche pas bien, je devrai me contenter de deux scripts, l'un pour s'exécuter sous sudo et l'autre pour s'exécuter en tant qu'utilisateur. –

+0

J'avais besoin de la commande POSIX :: setuid mais j'avais besoin de la variable d'environnement de plus, donc je vous ai voté mais pas correct. Pas de sentiments forts! –

Questions connexes