Su comando no funciona porque la redirección la realiza su shell, que no tiene permiso para escribir en /root/test.out
. La redirección de la salida no realizado por sudo.
Hay múltiples soluciones:
-
Ejecute un shell con sudo y déle el comando usando el
-c
opción:sudo sh -c 'ls -hal /root/ > /root/test.out'
-
Cree un script con sus comandos y ejecute ese script con sudo:
#!/bin/sh ls -hal /root/ > /root/test.out
Ejecutar
sudo ls.sh
. Consulte la respuesta de Steve Bennett si no desea crear un archivo temporal. -
Inicie un shell con
sudo -s
luego ejecuta tus comandos:[[email protected]]$ sudo -s [[email protected]]# ls -hal /root/ > /root/test.out [[email protected]]# ^D [[email protected]]$
-
Usa
sudo tee
(si tiene que escapar mucho cuando usa el-c
opción):sudo ls -hal /root/ | sudo tee /root/test.out > /dev/null
La redirección a
/dev/null
se necesita para detener tee desde la salida a la pantalla. Para añadir en lugar de sobrescribir el archivo de salida (>>
), utilicetee -a
otee --append
(el último es específico de GNU coreutils).
Gracias a Jd, Adam J. Forster y Johnathan por la segunda, tercera y cuarta solución.
Alguien aquí acaba de sugerir sudoing tee:
sudo ls -hal /root/ | sudo tee /root/test.out > /dev/null
Esto también podría usarse para redirigir cualquier comando a un directorio al que no tiene acceso. Funciona porque el programa tee es efectivamente un programa de "eco a un archivo", y la redirección a /dev/null es para evitar que también se envíe a la pantalla para mantenerlo igual que el ejemplo original artificial anterior.
Un truco que descubrí yo mismo fue
sudo ls -hal /root/ | sudo dd of=/root/test.out