2013-02-04 2 views
0

J'ai un code simple qui crée un objet Session (en utilisant le session gem) pour exécuter des commandes shell.) J'utilise sudo plusieurs fois dans le même bloc BEGIN et je reçois des invites commande pour le mot de passe sudo. Je crois qu'il ne devrait demander pour la première fois après la session est créée puis réutiliser la session pour éviter cela.Ruby Session génère toujours une nouvelle session (sudo)

#!/usr/bin/env ruby 

require 'rubygems' 
require 'date' 
require 'mysql2' 
require 'session' 


begin 
    sh = Session::Shell.new 
    puts "Starting file system copy." 
    $WWW_ROOT = "~/Downloads/" 
    $MASTER='/git/library/dev/.git' 
    $DOMAIN = ARGV[1].to_s 
    $DOC_ROOT = [$WWW_ROOT, $DOMAIN].join 

    stdout, stderr = sh.execute ("cd #{$WWW_ROOT} && ls && sudo git clone -q #{$MASTER} #{$DOMAIN}") 
    if stderr.length > 0 
    puts stderr 
    puts 'Error on git cloning.' 
    else 
    puts stdout, stderr 
puts "Git cloning finished."  
    end 

    stdout, stderr = sh.execute ("cd #{$DOC_ROOT} && sudo git checkout lib_dev") 
    if stderr.length > 0 
    puts stderr 
    puts 'Error on Git lib_dev checkout.' 
    else 
    puts stdout, stderr 
puts "Git lib_dev checkout finished." 
    end 

end 

Comment puis-je faire le sudo mot de passe rapide seulement se produire une fois?

+2

Désolé si je ne suis pas tout à fait Obtenir le problème, mais qu'en est-il d'invoquer le * script entier * en tant que superutilisateur, de sorte qu'il n'y aura pas besoin de 'sudo's à l'intérieur? Je veux dire 'sudo./Your_file.rb' au lieu de'./Your_file.rb'? – NIA

+1

+1 @ NIA, l'utilisation de 'sudo' pour appeler le script est préférable. Le script peut vérifier si l'utilisateur effectif et réel est en cours d'exécution et abandonner avec une erreur s'il ne dispose pas des droits appropriés. –

+0

Bien, je prends en charge un projet d'un autre programmeur et il m'a prévenu que le script global ne devrait pas être appelé ainsi parce qu'il a rencontré des problèmes avec le fait de rendre le système de fichiers utilisable avec le serveur web. Je ne sais pas plus que cela mais je suppose que je dois l'essayer et voir ce qui se passe. Merci. –

Répondre

0

Au lieu de l'émission « sudo » pour chaque commande que la session de doit fonctionner en tant que root, que le commutateur de session racine, juste une fois:

sh.execute "sudo su" 

Assurez-vous de garder cette instance de la session autour. Laissez maintenant le préfixe "sudo" aux commandes que vous exécutez avec la session.

sh.execute "cd #{$WWW_ROOT} && ls && git clone -q #{$MASTER} #{$DOMAIN}" 
... 
sh.execute "cd #{$DOC_ROOT} && git checkout lib_dev" 

Si votre script doit faire des choses et de la racine et certains comme l'utilisateur, puis garder autour deux sessions, dont un seul est la racine:

user_sh = Session.new 
root_sh = Session.new 
root_sh.execute "sudo su" 
user_sh.execute "some_ordinary_command" 
root_sh.execute "some_command_needing_root_privileges" 
Questions connexes