Par exemple, si je veux créer un fichier et saisir du texte sur une seule ligne, je peux rediriger la sortie dans un fichier en utilisant l' >
opérateur:
echo "something" > /path/foobar
mais si je n'ai pas accès au dossier /path/
et que j'ai besoin des privilèges sudo, comment puis-je obtenir cette même commande en tant qu'utilisateur normal avec des droits sudo?
j'ai essayé
sudo echo "something" > /path/foobar
mais cela ne fonctionne pas, car le sudo ne compte que edit
pour la partie droite
du>
Bien sûr, je pourrais devenir root avant avec sudo su
ou utiliser à la tee
place:
echo "something" | sudo tee /path/foobar
Mais je voudrais trouver une solution où je peux travailler avec la dernière ligne en remplacement via
sudo !!
N'y a-t-il pas un moyen de «recycler» la dernière ligne et de simplement l'ajouter sudo
devant?
bash
sudo
command-history
rubo77
la source
la source
alias sudo !!
?Réponses:
Vous ne pouvez pas simplement rester
sudo
devant une commande shell, vous devez invoquer un shell pour évaluer à nouveau cette commande (faire des choses comme développer des variables, ouvrir des fichiers pour des opérateurs de redirection, etc.). Donc, c'estsauf que cela ne fonctionne pas tout à fait, car
!!
interpole le texte de la commande précédente, les caractères spéciaux et tout. Vous devez récupérer le texte de la commande sous forme de chaîne et le transmettre comme argument àsh
. Heureusement, la fonctionfc
intégrée de bash vous permet de le faire¹.Ou même, pour être sûr d'invoquer la même version de bash en cours d'exécution:
Notez que puisque la commande est exécutée dans un processus shell séparé, elle hérite des variables d'environnement (uniquement celles qui les
sudo
conservent, l'esprit), mais pas des variables internes du shell. Les options du shell (par exemplekshglob
) et d'autres paramètres commenceront par défaut.La même commande² fonctionne dans zsh et ksh, bien que ATT ksh93 nécessite que le
first
et lelast
nombre soient passés àfc
³ (qui fonctionne également dans bash, zsh et pdksh / mksh):Utiliser
$0
pour désigner l'exécutable du shell en cours d'exécution ne fonctionne que si le shell a été appelé via $ PATH et que $ PATH n'a pas changé, ou via un chemin absolu.Voici une autre méthode dans zsh qui est légèrement plus claire mais plus longue:
Un dernier mot d'avertissement:
sudo
concerne les commandes potentiellement dangereuses. Ne le rendez pas trop facile à utiliser!¹ Il y a un espace supplémentaire au début et la substitution de commandes supprime les nouvelles lignes à 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 chemin absolu, ou lorsqu'il ne contient pas de barre oblique et que le chemin de recherche de commande n'a pas changé.³ est un alias pour dans ATT ksh mais c'est tout aussi bien.
fc
hist
la source
Si vous voulez refaire la même commande avec sudo !! après avoir fait une commande comme celle-ci:
Vous utilisez la syntaxe globale de remplacement pour rappeler la commande:
Utilisez un espace après le paramètre -a .
C'est l'équivalent de sudo !! mais vous aide à contourner les restrictions sudo pour les <et>. Parce que sudo ne vous permet pas d'utiliser [<,>].
Pour contourner les restrictions sudo en général pour les redirections, vous pouvez l'utiliser comme ceci:
La commande tee vous permettra de lire à partir de l'entrée standard et d'écrire sur la sortie standard et les fichiers
Si vous souhaitez répéter la commande et ajouter un texte au fichier, la commande tee a l' option -a pour l'ajout. Vous pouvez donc rappeler la commande avec
et le texte sera ajouté dans le fichier
exemple:
la source
-a
vraiment nécessaire?>
écrasera un fichier,tee -a
ajoutera, ce qui serait>>
Cela semble être aussi simple que
sudo sh -c "!!"
:la source
echo "foo bar"
ce qui deviendraitsh -c "echo "foo bar""
ce qui s'imprimeraitfoo
au lieu defoo bar
.sudo sh -c '!!'
place si votre commande mais cela ne fonctionne pas non plusa=b
et puisecho "$a" >file
et puissudo sh -c '!!'
il se développerait sursudo sh -c 'echo $a >file'
lequel imprimerait une ligne vide au lieu deb
dansfile
.sudo
pour obtenir un shell racine, puis copier et coller la commande serait le plus proche, mais échoue si la commande devait utiliser des variables définies dans votre shell non root. L'utilisationsudo sh -c "!!"
fonctionne bien pour les commandes simples, mais est lourde pour les commandes complexes. Je pense que le meilleur conseil est de ne pas s'attendre à ce qu'il y ait une commande qui fonctionnera à 100% du temps - apprenez quelques solutions possibles et appliquez-les quand elles conviennent le mieux.