/var/log/jynus

/var/log/jynus

Blog personal de Jynus

/var/log/jynus RSS Feed
 
 
 
 

“sudo” con una redirección de la salida

Si alguna vez habéis  intentado redireccionar la salida de un comando a un lugar que requiere privilegios de superusuario para escritura, os habréis topado con el siguiente error:

$ sudo echo test > /etc/deleteme
bash: /etc/deleteme: Permiso denegado

¿Cómo? ¿Pero sudo no proporciona privilegios de superusuario cuando se ejecutan comandos?

Sí, pero es necesario comprender bien el funcionamiento de una shell para ver lo que está pasando: sudo trata (salvo opciones) todo lo que viene a continuación como un comando; sin embargo es el programa intérprete de órdenes (bash o aquél que estemos ejecutando en ese momento) el que gestiona previamente las redirecciones de las salidas y entradas como ">", "2>", "<" o "|". Debemos, por tanto, evitar que nuestra shell las trate antes de ejecutar el sudo.

Por supuesto,  hacer un sudo su[-c], nos libraría de estos problemas, pero no es nada elegante y le quita toda la razón de ser a utilizar sudo. Para evitarlo tenemos varias opciones:

$ sudo sh -c 'echo "test" > /etc/deleteme'
$ echo test | sudo tee /etc/deleteme
test

(Éste último permite, adicionalmente, escribir al fichero y visualizar la salida simultáneamente).

¿Alguien sugiere más maneras?

Facebook Twitter Menéame Delicious LinkedIn Google

6 Responses to ““sudo” con una redirección de la salida”

  1. 1
    Mercatest:

    ¿Podrías poner un ejemplo más de su uso? Muchas gracias!!

  2. 2
    Inukaze:

    Bueno , eso esta bien pero has intentado usar $DISTRIB_CODENAME en Ubuntu ???
    Por lo general no funciona tienes que darle permiso de ejecucion

    Si quieres agregar cosas al Sources.list o meter un .list nuevo en sources.list.d puedes hacer esto por ejemplo el PPA de Emesene

    sudo chmod +x /etc/lsb-release
    sh /etc/lsb-relase

    #Obtenemos la GPG de dicha PPA
    gpg –keyserver keyserver.ubuntu.com –recv E2314809 && gpg –export –armor E2314809 | sudo apt-key add -

    # Obtenermos la version de la distro y creamos emesene.list dentro de sources.list.d
    echo deb http://ppa.launchpad.net/bjfs/ppa/ubuntu $DISTRIB_CODENAME main | sudo tee /etc/apt/sources.list.d/emesene.list

    # Actualizamos el sistema
    sudo apt-get update

    # Si queremos instalar usamos esto
    sudo apt-get install emesene

    ====================================
    Fuera de eso me he topado con las siguientes curiosidades y esto es solo un ejemplo

    1 – Si en vez de usar el echo como puse anteriormente intentas hacer esto

    echo deb http://ppa.launchpad.net/bjfs/ppa/ubuntu $DISTRIB_CODENAME main #Emesene-PPA | sudo tee /etc/apt/sources.list.d/emesene.list

    el comando no sirve , pues lee desde el # hasta el final como un comentario por ende el sudo tee no hace nada porque es un comentario para la shell

    2 – Si usas sudo -c ‘echo “deb http://ppa.launchpad.net/bjfs/ppa/ubuntu $DISTRIB_CODENAME main #Emesene-PPA” >> /etc/apt/sources.list.d/emesene.list

    Como dato curioso cuando revisas el archivo no esta el nombre codigo de la distro quedando asi
    deb http://ppa.launchpad.net/bjfs/ppa/ubuntu main #Emesene-PPA

    Pero tienes alguna idea de como hacer que funcione correctamene el $DISTRIB_CODENAME con el sudo -c ‘echo “…” >> /etc/apt/sources.list.d/emesene.list

  3. 3
    jynus:

    El primer comando se arregla rápido: utiliza la barra invertida para escapar la “almohadilla”:
    echo deb http://ppa.launchpad.net/bjfs/ppa/ubuntu $DISTRIB_CODENAME main \#Emesene-PPA | sudo tee /etc/apt/sources.list.d/emesene.list

    El segundo comando, a mí sí me expande la variable: comprueba que la has establecido para el usuario root, y no sólo para el usuario no privilegiado.

  4. 4
    Linux – Scripting – Bash: “sudo” con una redirección de la salida « /var/log/jynus « El camello, el Leon y el niño. O la evolución del perro al lobo:

    [...] 22/12/2009 de javcasta Vía: “sudo” con una redirección de la salida « /var/log/jynus. [...]

  5. 5
    nenopera:

    Que tal esto:

    $ echo test | sudo tee /etc/deleteme

    Asi no necesitas escapar el comando la solución es mucho mas versátil.

    Esto es un derivado del truco de vim para salvar archivos cuando no se tienen permisos:
    :w !sudo tee % >/dev/null

    NOTA: Aprovecho para añadir mi aportación a ese truco de vim. Con >/dev/null se evita que se imprima por pantalla todo el archivo otra vez al salvar. Para sobresaliente queda capturar el Warning que te avisa de que el archivo visualizado se ha modificado externamente y que si lo quieres recargar.

  6. 6
    armani suits outlet:

    i discovered your website on reddit as well as thought i would are available in this will let you appear. fascinating concept you have nevertheless i’ll possess a number of other people y you’ve got an interest. they are able to help or perhaps may not nevertheless its well worth a chance.

Leave a Reply