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

18

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

Por ejemplo; Quiero verificar si tengo derecho a emitir el comando de apagado antes de emitirlo.

Algo así como los siguientes comandos

-> doIhaveRightToIssue shutdown
-> Yes/No
Bernhard Colby
fuente
44
La forma directa es intentar (sin sudo) y descubrirlo. Los comandos del modo de texto pueden necesitar sudoy los comandos gráficos pueden necesitar gksudo. También puede verificar dónde está instalado el comando which command. Si está en /sbino /usr/sbin, puede esperar que el comando necesite sudoo gksudo.
sudodus

Respuestas:

26

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

$ which gzip
/bin/gzip

Luego nos fijamos en 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 primero root) o cualquier persona del grupo root(segundo root) y cualquier otra persona, respectivamente. Entonces su usuario puede ejecutar el programa.

Sin embargo, su ejecutable puede ser un archivo de script que llama a otros ejecutables dentro. Es posible que pueda ejecutar el script pero no los programas llamados dentro de él. No hay forma de determinar si su usuario puede hacer eso, aparte de probarlo realmente.

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 su contraseña de sudo si no lo hace, por ejemplo .

(Acerca del whichcomando: esto ubica los ejecutables en su $ PATH que puede ejecutar, y le dice cuál usa si tiene más de uno con el mismo nombre en el $ PATH. No localiza cualquier ejecutable. I úselo aquí como ejemplo de dónde buscar el permiso. El hecho de que whichencuentre el ejecutable ya indica que tiene permiso para ejecutarlo).

Jos
fuente
Respuesta muy concisa (+1). Por ejemplo, es posible simular el resultado de apt-get install con -s flag (sudo apt-get install -s htop). He pensado que si no hay forma de aprender el permiso de un comando antes de emitirlo, hay al menos algo así como "simular".
Bernhard Colby
Ciertamente, hay utilidades que proporcionan un indicador de "ejecución en seco" o "simulación" que puede utilizar.
Jos
44
whichEl comando debería ser suficiente para aquellos archivos que residen en uno de los directorios agregados a la $PATHvariable. Por ejemplo, hacer sudo chmod 700 /bin/nanoo sudo chmod 744 nanohace whichque no se produzca ningún resultado. Para los scripts locales, que residen en otro lugar que no sea uno de los PATHdirectorios, ls -lo las statllamadas harán el truco. Buena respuesta, pero agregue esta información a su publicación
Sergiy Kolodyazhnyy
Dejando de lado lo que dijo Serg, use algo como stat -c '%a' /bin/gzipobtener, 755por ejemplo.
AL
21

Con sudo:

$ sudo -l shutdown
/sbin/shutdown

Si no tenía permiso, sudome 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
polkit\56temporary_authorization_id=tmpauthz1
yes

Encontrar la acción relevante es una pregunta diferente.

muru
fuente
El problema con sudo es que no soy sudoer en el sistema. Por eso, trato de tener cuidado antes de emitir un comando.
Bernhard Colby
44
@BernhardColby puede ejecutar de forma segura sudo -lincluso si no es un sudoer, de eso se trata -l, para decirle si puede ejecutar un comando con sudo.
Muru
Gracias (+1), no lo sabía. Probaré tu solución tan pronto como tenga mi PC.
Bernhard Colby
8

Puedes usar:

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

command -v shutdowndevuelve la ruta al shutdowncomando. test -xcomprueba si esa ruta es ejecutable para usted.

Tenga en cuenta que aunque puede ejecutar el comando, el comando puede fallar porque no tiene el permiso adecuado 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 cambio restringe el acceso a las operaciones que los programas realmente pueden hacer.

Robie Basak
fuente
¿Qué pasa, por ejemplo alias shutdown="shutdown now"?
Dmitry Grigoryev
Para evitar el problema con los alias, se puede usar $(which shutdown)o $(shopt -u expand_aliases && command -v shutdown). Sin embargo, este problema solo aparece en modo interactivo.
David Foerster
5

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

En primer lugar, mire los permisos con ls -l...

 comando del grupo de usuarios owngrpotr
-rwxr-xr-x raíz bin vim

Si el último / tercer triplete tiene una x ("puede ejecutarse") en él, entonces otros , y eso significa que usted puede ejecutarlo ... Si es un script de shell o algo así, entonces otros necesitarían r (" puede leer ") también.

Si otros no tienen permiso de ejecución pero el grupo (el segundo triplete) sí, entonces puede ejecutarlo si es miembro del grupo , en el ejemplo anterior, bin . Por ejemplo, el grupo de rueda se usa a menudo para limitar quién puede ejecutar su, por lo que solo los usuarios que pertenecen a este grupo podrían ejecutarlo. Otro ejemplo es hacer un grupo para desarrolladores y restringir la ejecución del compilador C y esas herramientas a este grupo.

Si hay un + al final después del último triplete, eso significa que se utilizan AccessControllLists; 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 (es posible que no pueda hacer cualquier cosa).

Finalmente, aunque es posible que se le permita ejecutar un comando, el comando en sí puede verificar su identidad y negarse a permitirle usarlo a menos que esté incluido en un archivo de configuración o tenga ciertos usuarios (por ejemplo, root ). Por ejemplo, el mountcomando solo permitirá que la raíz monte cualquier dispositivo; los usuarios normales solo pueden montar dispositivos enumerados como tales en / etc / fstab ... que pueden ser ninguno. Si no es root e intenta montar algo, mountse quejará y se negará a montar el dispositivo. Otro ejemplo es sudo, que se ejecutará para cualquier persona, pero solo los usuarios enumerados en / etc / sudoers podrán ejecutar cosas como root .

Baard Kopperud
fuente
3

Utilizando which, type, commandetc., es una solución práctica que funciona en el 99% de los casos, pero para ser 100% seguro de que va a tener que inspeccionar manualmente cada directorio de la aplicación que aparece en su $PATH. Muchos shells (incluidos bash) prefijarán su comando con entradas de $PATHe intentarán ejecutar esos archivos repetidamente hasta que tengan éxito. Como whichrealmente no puede ejecutar el comando, es imposible para él predecir qué archivo realmente seleccionará su shell.

Por ejemplo, imagine que tengo PATH=/opt/arm/bin:/bin, ambos directorios que contienen archivos ejecutables, pero para diferentes arquitecturas. La ejecución which ddvolverá /opt/arm/bin/dd(suponiendo que tenga permisos para ejecutarla), ya que esa entrada es lo primero. Sin embargo, cuando ejecuto dden mi shell, /bin/ddse ejecutará, porque /opt/arm/bin/ddno se ejecutará. La misma situación puede ocurrir en caso de archivos binarios corruptos, libs faltantes, etc. Al final, no hay una manera segura de saber si podrá ejecutar un comando o no, aparte de intentarlo.

Otro aspecto es lo que considera "tener permisos". Como usuario, tengo permisos para ejecutar, rm ~/filepero no rm /root/file. Nuevamente, no hay una forma general de saberlo sin una inspección manual, o emitiendo el comando y observando los resultados.

Dmitry Grigoryev
fuente