Exécuter une command lines avec un sudo

Par exemple, si je veux créer un file et entrer du text sur une ligne, je peux redirect la sortie dans un file à l'aide de l'opérateur > :

 echo "something" > /path/foobar 

mais si je n'ai pas access au dossier /path/ et que j'ai besoin de privilèges sudo, comment puis-je get cette même command en tant qu'user normal avec les droits sudo?

j'ai essayé

 sudo echo "something" > /path/foobar 

mais cela ne fonctionne pas, car le sudo ne count que pour le edit mais pas pour la partie droite
du >

Bien sûr, je pourrais devenir root avant avec sudo su ou utiliser tee place:

 echo "something" | sudo tee /path/foobar 

Mais je voudrais find une solution où je peux travailler avec la dernière ligne en rlocation via

 sudo !! 

N'y a-t-il pas un moyen de «recycler» la dernière ligne et d'append simplement sudo devant?

Vous ne pouvez pas simplement coller sudo devant une command shell, vous devez invoquer un shell pour évaluer cette command (faire des choses comme l'expansion de variables, l'ouverture de files pour les opérateurs de redirection, etc.). Donc, c'est

 sudo bash -c !! 

sauf que cela ne fonctionne pas tout à fait, parce que !! interpole le text de la command précédente, les caractères spéciaux et tous. Vous devez récupérer le text de la command sous la forme d'une string et le transmettre comme argument à sh . Heureusement, le fc builtin de bash vous permet de faire ça¹.

 sudo bash -c "$(fc -ln -1)" 

Ou même, pour être sûr d'invoquer la même version de bash qui est en cours d'exécution:

 sudo "$BASH" -c "$(fc -ln -1)" 

Notez que puisque la command est exécutée dans un process shell séparé, elle hérite des variables d'environnement (uniquement celles que sudo conserve, mind), mais pas des variables internes shell. Les options de Shell (par exemple kshglob ) et d'autres parameters démarreront par défaut.

La même command² fonctionne dans zsh et ksh, bien que ATT ksh93 exige que le first et le last nombre soient transmis à fc ³ (qui fonctionne également dans bash, zsh et pdksh / mksh):

 sudo zsh -c "$(fc -ln -1)" sudo ksh -c "$(fc -ln -1 -1)" sudo "$0" -c "$(fc -ln -1 -1)" 

L'utilisation de $0 pour désigner l'exécutable du shell s'exécute uniquement si le shell a été appelé via le $ PATH et que le $ PATH n'a pas été modifié ou par le biais d'un path absolu.

Voici une autre méthode dans zsh qui est légèrement plus claire mais plus longue:

 sudo zsh -c $history[$[HISTCMD-1]] 

Un dernier mot d'avertissement: sudo est pour les commands potentiellement dangereuses. Ne le rends pas trop facile à utiliser!

¹ Il y a un peu d'espace au début et la substitution de command supprime les returns à la fin, mais la syntaxe du shell s'en fiche.
² Je ne pense pas que zsh ou ksh aient quelque chose comme $BASH bash; $0 ne fonctionne que lorsqu'il s'agit d'un path absolu, ou lorsqu'il ne contient pas de barre oblique et que le path de search des commands n'a pas changé.
³ fc est un alias pour hist dans ATT ksh mais c'est tout aussi bon.

Si vous voulez refaire la même command avec sudo !! après avoir exécuté une command comme celle-ci:

 echo "something">/path/file 

Vous utilisez la syntaxe de rlocation globale pour callbacker la command:

 !!:gs/>/|sudo tee -a / 

Utilisez un espace après le paramètre -a .

C'est l'équivalent de sudo !! mais vous aide à contourner les ressortingctions sudo pour les <et>. Parce que sudo ne vous permet pas d'utiliser [<,>].


Pour contourner les ressortingctions sudo en général pour les redirections, vous pouvez l'utiliser comme ceci:

 echo "something" | sudo tee myfile 

La command tee vous permettra de lire à partir de l'input standard et d'écrire sur la sortie et les files standard

Si vous souhaitez répéter la command et append un text au file, la command tee a l'option -a pour l'append. Donc, vous pouvez callbacker la command avec

 sudo !! 

et le text sera ajouté dans le file

Exemple:

 echo "something" | sudo tee -a /path/file sudo !! 

Il semble être aussi simple que sudo sh -c "!!" :

 $ cd / $ echo hello > foo bash: foo: Permission denied $ sudo sh -c "!!" sudo sh -c "echo hello > foo" $ ls -l foo -rw-r--r-- 1 root root 6 Jun 20 16:21 foo