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