2017-07-21 5 views
1

Je souhaite pouvoir basculer les utilisateurs au milieu d'un script. Voici une tentative:Exécution de commandes dans un script en tant qu'utilisateur utilisant un autre document

su - User << EOF 

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" </dev/null 

EOF 

Mon but est d'exécuter le code entre les délimiteurs EOF comme si je fait connecté en tant qu'utilisateur.

La ligne médiane est censée installer Homebrew. Si je me connecte en tant qu'utilisateur et exécute la ligne médiane de son propre chef, il s'installe correctement. Mais l'exécution du script complet me donne au-dessus des problèmes:

-e:5: unknown regexp options - lcal 
-e:6: unknown regexp options - lcal 
-e:8: unknown regexp options - Cach 
-e:9: syntax error, unexpected tLABEL 
BREW_REPO = https://github.com/Homebrew/brew.freeze 
       ^
-e:9: unknown regexp options - gthb 
-e:10: syntax error, unexpected tLABEL 
CORE_TAP_REPO = https://github.com/Homebrew/homebrew-core.freeze 
        ^
-e:10: unknown regexp options - gthb 
-e:32: syntax error, unexpected end-of-input, expecting keyword_end 
-bash: line 34: end: command not found 
-bash: line 36: def: command not found 
-bash: line 37: escape: command not found 
-bash: line 38: end: command not found 
-bash: line 40: syntax error near unexpected token `(' 
-bash: line 40: ` def escape(n)' 

J'ai essayé pouvait différentes commandes au lieu de simplement l'installer Homebrew mais ont des problèmes la plupart du temps. Quelle est la différence entre passer une commande à 'su' comme j'essaye de faire et exécuter réellement la commande en tant que cet utilisateur?

+0

Ne pouvez-vous pas utiliser "sudo -u" pour cela? –

Répondre

0

Ce qui se passe est que la commande $(...) intégrée est exécutée avant le document ici est passé à su. Autrement dit, le véritable scénario qui est passé à su est quelque chose comme ceci:

/usr/bin/ruby -e "#!/System/Library/Frameworks/Ruby.framework/Versions/Current/usr/bin/ruby 
# This script installs to /usr/local only. To install elsewhere you can just 
# untar https://github.com/Homebrew/brew/tarball/master anywhere you like or 
# change the value of HOMEBREW_PREFIX. 
HOMEBREW_PREFIX = "/usr/local".freeze 
HOMEBREW_REPOSITORY = "/usr/local/Homebrew".freeze 
HOMEBREW_CACHE = "#{ENV["HOME"]}/Library/Caches/Homebrew".freeze 
... 

Et ainsi de suite. En d'autres termes, la sortie de $(...) a été insérée dans le document ici.

Pour éviter cela, vous avez besoin d'échapper à la $:

su - User << EOF 

/usr/bin/ruby -e "\$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" </dev/null 

EOF 

Vous pouvez indiquer au shell pour traiter l'ensemble ici-documents littéralement sans interpolation, en enfermant le départ EOF avec des guillemets doubles :

su - User << "EOF" 

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" </dev/null 

EOF