Por ejemplo, si quiero crear un archivo e ingresar texto en una línea, puedo redirigir la salida a un archivo con el uso del >
operador:
echo "something" > /path/foobar
pero si no tengo acceso a la carpeta /path/
y necesito privilegios de sudo, ¿cómo puedo lograr este mismo comando que un usuario normal con derechos de sudo?
Lo intenté
sudo echo "something" > /path/foobar
pero eso no funciona, porque el sudo solo cuenta para la edit
parte correcta
de la parte no>
Claro, podría convertirme en root antes sudo su
o usar tee
en su lugar:
echo "something" | sudo tee /path/foobar
Pero me gustaría encontrar una solución donde pueda trabajar con la última línea como reemplazo a través de
sudo !!
¿No hay una manera de "reciclar" la última línea y simplemente agregarla sudo
al frente?
bash
sudo
command-history
rubo77
fuente
fuente
alias sudo !!
?Respuestas:
No puede simplemente quedarse
sudo
delante de un comando de shell, debe invocar un shell para evaluar ese comando nuevamente (haciendo cosas como expandir variables, abrir archivos para operadores de redirección, etc.). Así que eso esexcepto que esto no funciona del todo, porque
!!
interpola el texto del comando anterior, caracteres especiales y todo. Debe recuperar el texto del comando como una cadena y pasarlo como argumento ash
. Afortunadamente, bashfc
incorporado de bash te permite hacer eso¹.O incluso, para asegurarse de invocar la misma versión de bash que se está ejecutando actualmente:
Tenga en cuenta que, dado que el comando se ejecuta en un proceso de shell separado, hereda las variables de entorno (solo las que
sudo
conserva, mind), pero no las variables internas de shell. Las opciones de Shell (por ejemplokshglob
) y otras configuraciones comenzarán desde el valor predeterminado.El mismo command² trabaja en zsh y ksh, aunque ATT ksh93 requiere tanto el
first
ylast
número que se pasa afc
³ (que también funciona en bash, zsh y pdksh / mksh):El uso
$0
para designar el ejecutable del shell en ejecución solo funciona si el shell se invocó a través de $ PATH y $ PATH no ha cambiado, o a través de una ruta absoluta.Aquí hay otro método en zsh que es un poco más claro pero más largo:
Una última palabra de advertencia:
sudo
es para comandos potencialmente peligrosos. ¡No lo hagas demasiado fácil de usar!¹ Hay algunos espacios en blanco adicionales al principio y la sustitución de comandos elimina las nuevas líneas al final, pero la sintaxis del shell no se preocupa por eso.
² No creo que zsh o ksh tengan algo como bash
$BASH
;$0
solo funciona cuando es una ruta absoluta, o cuando no contiene una barra inclinada y la ruta de búsqueda de comandos no ha cambiado.³ es un alias para ATT ksh pero es igual de bueno.
fc
hist
fuente
Si quieres rehacer el mismo comando con sudo !! después de hacer un comando como este:
Usa la sintaxis de reemplazo global para recuperar el comando:
Use un espacio después del parámetro -a .
Este es el equivalente a sudo !! pero le ayuda a evitar las restricciones de sudo para <y>. Porque sudo no le permite usar [<,>].
Para evitar las restricciones de sudo en general para las redirecciones, puede usarlo así:
El comando tee le permitirá leer desde entradas estándar y escribir en salidas y archivos estándar
Si desea repetir el comando y agregar un texto al archivo, el comando tee tiene la opción -a para agregar. Entonces puedes recordar el comando con
y el texto se agregará en el archivo
ejemplo:
fuente
-a
realmente necesario?>
sobrescribe un archivo,tee -a
como apéndice, lo que sería>>
Parece ser tan simple como
sudo sh -c "!!"
:fuente
echo "foo bar"
cuál se convertiría ensh -c "echo "foo bar""
cuál simplemente se imprimiría enfoo
lugar defoo bar
.sudo sh -c '!!'
cambio, intenté si tu comando, pero eso tampoco funcionaa=b
y luegoecho "$a" >file
y luegosudo sh -c '!!'
se expandiría asudo sh -c 'echo $a >file'
lo que imprimiría una línea vacía en lugar deb
enfile
.sudo
para obtener un shell raíz y luego copiar y pegar el comando en él sería lo más cercano, pero falla si se espera que el comando use variables que se establecieron en su shell no root. El usosudo sh -c "!!"
funciona bien para comandos simples, pero es difícil para los complejos. Creo que el mejor consejo es no esperar que haya algún comando que funcione el 100% del tiempo: aprenda algunas posibles soluciones y aplique cada una cuando mejor se adapte.