¿Cómo puedo saber si tengo permiso para ejecutar un comando en particular?

18

¿Hay alguna manera de identificar si yo, como usuario ordinario, tengo derecho a emitir un comando?

Por ejemplo; Quiero comprobar si tengo derecho a emitir el comando shutdown antes de emitirlo realmente.

Algo así como los siguientes comandos

-> doIhaveRightToIssue shutdown
-> Yes/No
    
pregunta Bernhard Colby 21.03.2017 - 14:28

5 respuestas

24

El caso más simple es el de un ejecutable binario como gzip . Primero, ubicamos el ejecutable:

$ which gzip
/bin/gzip

Luego observamos los atributos de este archivo:

$ ls -l /bin/gzip
-rwxr-xr-x 1 root root 98240 oct 27  2014 /bin/gzip

Las tres x nos dicen que el archivo puede ser ejecutado por el propietario (el primer root ), o cualquiera en el grupo root (segundo root ) y cualquier otra persona, respectivamente. Entonces su usuario puede ejecutar el programa.

Sin embargo, su archivo ejecutable puede ser un archivo de comandos que llama a otros ejecutables dentro. Es posible que pueda ejecutar el script, pero no los programas que se llaman dentro de él. No hay forma de determinar si a su usuario se le permite hacer eso, además de probarlo.

Luego hay casos especiales como shutdown : este es realmente un enlace simbólico a una utilidad central llamada systemctl , que tiene sus propios mecanismos para determinar si se le permite llamar, y para pedirle sudo contraseña si no, por ejemplo.

(Acerca del comando which : esto ubica los ejecutables en su $ PATH que puede ejecutar, y le dice cuál utiliza si tiene más de uno con el mismo nombre en $ PATH. No lo hace busque cualquier ejecutable. Lo uso aquí como un ejemplo de dónde buscar el permiso. El hecho de que which encuentre el ejecutable ya indica que tiene permiso para ejecutarlo.)

    
respondido por el Jos 21.03.2017 - 14:44
21

Con sudo :

$ sudo -l shutdown
/sbin/shutdown

Si no tuviera permiso, sudo se quejará en lugar de mostrar el comando.

Con polkit, verifica la acción que desea ejecutar:

$ pkcheck --action-id org.freedesktop.login1.power-off --process $$ -u --enable-internal-agent && echo yes
polkittemporary_authorization_id=tmpauthz1
yes

Encontrar la acción relevante es una pregunta diferente.

    
respondido por el muru 21.03.2017 - 14:52
8

Puede usar:

test -x $(command -v shutdown) && echo yes || echo no

command -v shutdown devuelve la ruta al comando shutdown . test -x comprueba si esa ruta es ejecutable para usted.

Tenga en cuenta que aunque pueda ejecutar el comando, el comando aún puede fallar porque tiene un permiso inadecuado para llevar a cabo la tarea. Este es el caso común en los sistemas de tipo Unix, que en lugar de restringir el acceso para ejecutar un comando, en lugar de restringir el acceso a las operaciones que los programas realmente pueden hacer.

    
respondido por el Robie Basak 21.03.2017 - 19:54
5

Bueno, puede ser un poco difícil a veces ...

Primero, mira los permisos con ls -l ...

 owngrpotr  user  group  command
-rwxr-xr-x  root  bin    vim

Si el último / tercer triplete obtuvo un x ("puede ejecutar") en él, entonces otros - y eso significa que usted puede ejecutarlo ... Si es un script de shell o algo así, entonces others necesitarían r ("can read") también.

Si others no tiene permiso de ejecución pero grupo (el segundo triplete), entonces puede ejecutarlo si es miembro de grupo - en el ejemplo anterior, bin . Por ejemplo, el grupo wheel se usa a menudo para limitar quién puede ejecutar su , por lo que solo los usuarios que pertenecen a este grupo pueden ejecutarlo. Otro ejemplo es crear un grupo para desarrollar ers, y restringir la ejecución del compilador C y de tales herramientas a este grupo.

Si hay un + final después del último triplete, eso significa que AccessControllLists se usa; esto puede agregar derechos de ejecución a usuarios y grupos adicionales.

+++

Incluso si puede ejecutar el comando, el comando puede depender del acceso a archivos, directorios y / o dispositivos a los que no tiene acceso, esto puede limitar lo que podrá hacer (puede no ser capaz de hacer nada).

Finalmente, aunque se le permita ejecutar un comando, el comando mismo puede verificar su identidad y negarse a dejarlo usar a menos que esté en la lista de un archivo de configuración o que ciertos usuarios (por ejemplo, root ). Por ejemplo, el comando mount solo permitirá que root monte cualquier dispositivo: los usuarios normales solo pueden montar dispositivos enumerados como tales en / etc / fstab ... que puede ser ninguno. Si no eres root e intentas montar algo, mount se quejará y se negará a montar el dispositivo. Otro ejemplo es sudo , que se ejecutará para cualquiera, pero solo los usuarios que figuran en / etc / sudoers podrán ejecutar cosas como root .

    
respondido por el Baard Kopperud 21.03.2017 - 18:27
3

Usar which , type , command etc. es una solución práctica que funcionará en el 99% de los casos, pero para estar 100% seguro de que tendrá que inspeccionar manualmente todos los directorios ejecutables enumerados en su %código%. Muchos shells (incluido $PATH ) prefijarán tu comando con datos de bash e intentarán ejecutarlos repetidamente hasta que tengan éxito. Dado que $PATH no puede ejecutar realmente el comando, es imposible predecir qué archivo realmente seleccionará el intérprete de comandos.

Por ejemplo, imagine que tengo which , ambos directorios contienen archivos ejecutables, pero para diferentes arquitecturas. Ejecutar PATH=/opt/arm/bin:/bin devolverá which dd (suponiendo que tenga permisos para ejecutarlo), ya que esa entrada es lo primero. Sin embargo, cuando ejecuto /opt/arm/bin/dd en mi shell, se ejecutará dd , porque /bin/dd no se ejecutará. La misma situación puede ocurrir en el caso de binarios corruptos, librerías perdidas, etc. Al final, no hay forma segura de saber si podrá ejecutar un comando o no, además de intentarlo.

Otro aspecto es lo que considera "tener permisos". Como usuario, tengo permisos para ejecutar /opt/arm/bin/dd pero no rm ~/file . Una vez más, no hay una forma general de saberlo sin una inspección manual, o emitir el comando y observar los resultados.

    
respondido por el Dmitry Grigoryev 22.03.2017 - 15:04

Lea otras preguntas en las etiquetas