J'ai reçu un accès sudo sur l'une de nos boîtiers de développement RedHat linux, et il me semble que j'ai souvent besoin de rediriger la sortie vers un emplacement auquel je n'ai normalement pas accès en écriture.
Le problème est que cet exemple artificiel ne fonctionne pas:
sudo ls -hal /root/ > /root/test.out
Je viens de recevoir la réponse:
-bash: /root/test.out: Permission denied
Comment puis-je faire en sorte que cela fonctionne?
root
(dans ce cas, procédez à la lecture des réponses) mais très souvent, vous devez simplement créer le fichier ailleurs, comme vous-même.Réponses:
Votre commande ne fonctionne pas car la redirection est effectuée par votre shell qui n'a pas l'autorisation d'écrire
/root/test.out
. La redirection de la sortie n'est pas effectuée par sudo.Il existe plusieurs solutions:
Exécutez un shell avec sudo et donnez-lui la commande en utilisant l'
-c
option:Créez un script avec vos commandes et exécutez ce script avec sudo:
Courez
sudo ls.sh
. Voir la réponse de Steve Bennett si vous ne souhaitez pas créer de fichier temporaire.Lancez un shell avec
sudo -s
puis exécutez vos commandes:Utilisez
sudo tee
(si vous devez beaucoup vous échapper lorsque vous utilisez l'-c
option):La redirection vers
/dev/null
est nécessaire pour empêcher la sortie de tee sur l'écran. Pour ajouter au lieu d'écraser le fichier de sortie (>>
), utiliseztee -a
outee --append
(le dernier est spécifique aux coreutils GNU ).Merci à Jd , Adam J. Forster et Johnathan pour les deuxième, troisième et quatrième solutions.
la source
perl -e 'print "STDIN\n"; print STDERR "STDERR\n"; ' > >( tee stdout.log ) 2> >( tee stderr.log >&2 )
Quelqu'un ici vient de suggérer un tee-shirt sudoing:
Cela peut également être utilisé pour rediriger n'importe quelle commande vers un répertoire auquel vous n'avez pas accès. Cela fonctionne parce que le programme tee est en fait un programme "écho vers un fichier", et la redirection vers / dev / null est de l'empêcher de sortir également à l'écran pour le garder comme l'exemple original créé ci-dessus.
la source
sudo
(c'est-à-dire pour la commande elle-même) peut être omisUn truc que j'ai compris moi-même était
la source
sudo dd
est meilleur que lessudo tee /root/file > /dev/null
exemples ci-dessus!dd
c'est le nom de la commande,of=/root/test.out
c'est l'argument qui indiquedd
ce que sont les fichiers de sortie.of
signifie fichier de sortie etdd
est un outil très populaire utilisé à la fois sous Linux et OSX (principalement pour écrire des images sur des disques). C'est une astuce intéressante à coup sûr.dd
est probablement aussi utiletee
qu'ici. Dans les deux cas, vous utilisez une commande courante et bien connue dans un but qui, bien que légèrement différent de son objectif initial, est toujours bien connu et bien documenté. Bien qu'ildd
soit bon pour copier d'énormes quantités de données, il n'aspire pas avec de petites quantités. Il présente ici l'avantage de ne pas faire écho de la sortie à la sortie standard également.sudo dd
les uns à côté des autres, vous voulez être très, très sûr que les arguments qui suivent sont corrects (surtout compte tenu de sa syntaxe non standard). Ils ne l'appellent pas "destructeur de disque" pour rien ...Le problème est que la commande est exécutée sous
sudo
, mais la redirection est exécutée sous votre utilisateur. Cela se fait par le shell et il n'y a pas grand chose à faire.Les moyens habituels de contourner cela sont:
Enveloppez les commandes dans un script que vous appelez sous sudo.
Si les commandes et / ou le fichier journal changent, vous pouvez faire en sorte que le script les prenne comme arguments. Par exemple:
Appelez un shell et passez la ligne de commande comme paramètre avec
-c
Ceci est particulièrement utile pour les commandes composées uniques. Par exemple:
la source
Encore une autre variation sur le thème:
Ou bien sûr:
Ils ont l'avantage (minuscule) que vous n'avez pas besoin de vous souvenir des arguments
sudo
oush
/bash
la source
Clarifier un peu pourquoi l'option tee est préférable
En supposant que vous disposez des autorisations appropriées pour exécuter la commande qui crée la sortie, si vous dirigez la sortie de votre commande vers tee, vous n'avez qu'à élever les privilèges de tee avec sudo et demander à tee d'écrire (ou d'ajouter) au fichier en question.
dans l'exemple donné dans la question, cela signifierait:
pour quelques exemples plus pratiques:
Dans chacun de ces exemples, vous prenez la sortie d'une commande non privilégiée et écrivez dans un fichier qui n'est généralement accessible en écriture que par racine, ce qui est à l'origine de votre question.
C'est une bonne idée de procéder de cette façon car la commande qui génère la sortie n'est pas exécutée avec des privilèges élevés. Cela ne semble pas avoir d'importance ici,
echo
mais lorsque la commande source est un script auquel vous ne faites pas entièrement confiance, c'est crucial.Notez que vous pouvez utiliser l'option -a pour té pour ajouter ajouter (comme
>>
) au fichier cible plutôt que de l'écraser (comme>
).la source
Faites exécuter sudo un shell, comme ceci:
la source
La façon dont je voudrais aborder cette question est la suivante:
Si vous devez écrire / remplacer le fichier:
Si vous devez ajouter au fichier:
la source
Que diriez-vous d'écrire un script?
Nom de fichier: myscript
Utilisez ensuite sudo pour exécuter le script:
la source
Chaque fois que je dois faire quelque chose comme ça, je deviens simplement root:
Ce n'est probablement pas la meilleure façon, mais cela fonctionne.
la source
Je le ferais de cette façon:
la source
su
):$ sudo su -c 'pstree -sp $$ >/dev/fd/1'
init(1)───gnome-terminal(6880)───bash(6945)───sudo(401)───su(402)───bash(410)───pstree(411)
Ne pas vouloir battre un cheval mort, mais il y a trop de réponses ici qui utilisent
tee
, ce qui signifie que vous devez redirigerstdout
vers,/dev/null
sauf si vous voulez voir une copie à l'écran.Une solution plus simple consiste à simplement utiliser
cat
comme ceci:Remarquez comment la redirection est placée entre guillemets afin qu'elle soit évaluée par un shell démarré par
sudo
au lieu de celui qui l'exécute.la source
sudo bash -c "ls -hal /root > /root/test.out"
. L'utilisation de tee évite d'avoir besoin d'une coquille, contrairement au chat.Ceci est basé sur la réponse impliquant
tee
. Pour faciliter les choses, j'ai écrit un petit script (je l'appellesuwrite
) et l' ai mis/usr/local/bin/
avec la+x
permission:Comme indiqué dans USAGE dans le code, tout ce que vous avez à faire est de diriger la sortie vers ce script suivi du nom de fichier accessible par le superutilisateur et il vous demandera automatiquement votre mot de passe si nécessaire (car il comprend
sudo
).Notez que puisqu'il s'agit d'un simple wrapper pour
tee
, il acceptera également l'-a
option de tee à ajouter et prend également en charge l'écriture dans plusieurs fichiers en même temps.Il dispose également d'une protection simpliste contre l'écriture sur les
/dev/
appareils, ce qui était une préoccupation mentionnée dans l'un des commentaires sur cette page.la source
Peut-être que vous n'avez eu accès à sudo qu'à certains programmes / chemins? Ensuite, il n'y a aucun moyen de faire ce que vous voulez. (à moins que vous ne le piratiez d'une manière ou d'une autre)
Si ce n'est pas le cas, vous pouvez peut-être écrire un script bash:
Appuyez sur ctrl+ d:
J'espère que cela vous aidera.
la source
la source
sudo
quand même, ceat
n'est pas utile ou nécessaire.sudo sh -c 'echo test >/tmp/test.out'
fait la même chose de manière plus efficace et élégante (mais souffre toujours du défaut que vous exécutez probablement des chosesroot
qui n'ont pas besoin de ce privilège; vous devriez généralement éviter les commandes privilégiées lorsque vous le pouvez).