2010-07-14 3 views
3

J'ai regardé autour, mais ne peut pas comprendre cela .. Je me suis dit comment faire une exécution perl d'un script shell, tels que:Perl, exécutant des commandes shell Linux multi-lignes, nécessite une authentification?

#!/usr/bin/perl 
$cmd = "nautilus"; 
system $cmd; 

Cependant, je veux faire un script shell exécution de Perl qui ferait quelque chose comme ça sur la ligne de commande:

su 
$password 
nautilus 

il deviendrait racine, puis ouvrez le navigateur nautilus .. quand j'ai essayé cela en passant simplement chaque commande séparément, comme ci-dessous, il ne fonctionne pas .. Je vous serais reconnaissant de conseils quant à la façon de ce faire .. merci

$cmd = "su"; 
system $cmd; 
$cmd = $password; 
system $cmd; 
$cmd = "nautilus"; 
system $cmd; 
+0

au lieu de ' 'commande' $ cmd =; system $ cmd' qui est moins lisible, vous pouvez simplement faire 'system 'command''. – fengshaun

+0

Aussi, pourquoi ne demandez-vous pas à l'utilisateur d'exécuter votre script en tant que root? Et puis vérifiez-ness racine en vous script: 'if (' id de l'== 0) {print "nous sommes root"} ' – fengshaun

+0

@fengshaun: Ceci est d'un script Perl, donc:' if ($> = = 0) ' – Gilles

Répondre

3

Vérifiez le module Expect. Il fera ce que tu veux. (Il est déjà inclus dans les dernières versions de Perl)

+0

Ce n'est pas un problème pour lequel attendre est une bonne solution si vous pouvez l'éviter. Utiliser sudo est préférable car il ne vous oblige pas à laisser un mot de passe en clair. Aussi sudo enregistre toutes les utilisations, alors que rien ne vous avertira si quelqu'un a lu votre mot de passe root où vous l'avez écrit en clair. – Gilles

0

Si vous voulez le faire à la main, c'est une façon de le faire. Cependant, comme dans le poste de Cfreak, je recommande qu'ils attendent, mais:

# cat foo.pl 
    #!/usr/bin/perl 
    if(open SHELL, "| /bin/bash") 
    { 
    print SHELL <<'COMMANDS'; 
    echo hello 
    pwd 
    # do whatever 
    COMMANDS 
    close SHELL; 
    } 
    else 
    { 
    die "horrible error: $!"; 
    } 
# ./foo.pl 
    hello 
    /mypath/whatever/ 
# 
1

Il est une idée horrible à coder en dur un mot de passe dans le code, en particulier le mot de passe de votre compte root. Une façon beaucoup plus sûre et plus efficace serait d'utiliser la commande sudo qui est probablement préinstallée dans pratiquement toutes les distributions Linux. Vous pouvez même permettre à un utilisateur d'exécuter une commande prédéfinie avec les permissions root sans demander un mot de passe du tout - ce qui est encore plus sûr, car un attaquant qui pourrait lire votre variante du script a accès au mot de passe root et peut donc faire tout ce qu'il veut , tout en utilisant la variante sudo lui permet uniquement d'exécuter la commande prédéfinie en tant que root. En outre, le code ne se casse pas une fois que vous avez envie de changer votre mot de passe root.

En /etc/sudoers:

myuser ALL=NOPASSWD: /usr/bin/nautilus

Dans votre script perl:

system("sudo /usr/bin/nautilus");

+0

Et si vous avez besoin d'exécuter plus d'une commande en tant que root, la solution la plus simple est de mettre les commandes à exécuter en tant que root dans un script. – Gilles

Questions connexes