¿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
command-line
permissions
Bernhard Colby
fuente
fuente
sudo
) y descubrirlo. Los comandos del modo de texto pueden necesitarsudo
y los comandos gráficos pueden necesitargksudo
. También puede verificar dónde está instalado el comandowhich command
. Si está en/sbin
o/usr/sbin
, puede esperar que el comando necesitesudo
ogksudo
.Respuestas:
El caso más simple es el de un ejecutable binario como
gzip
. Primero, ubicamos el ejecutable:Luego nos fijamos en los atributos de este archivo:
Las tres x nos dicen que el archivo puede ser ejecutado por el propietario (el primero
root
) o cualquier persona del gruporoot
(segundoroot
) 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 llamadasystemctl
, 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
which
comando: 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 quewhich
encuentre el ejecutable ya indica que tiene permiso para ejecutarlo).fuente
which
El comando debería ser suficiente para aquellos archivos que residen en uno de los directorios agregados a la$PATH
variable. Por ejemplo, hacersudo chmod 700 /bin/nano
osudo chmod 744 nano
hacewhich
que no se produzca ningún resultado. Para los scripts locales, que residen en otro lugar que no sea uno de losPATH
directorios,ls -l
o lasstat
llamadas harán el truco. Buena respuesta, pero agregue esta información a su publicaciónstat -c '%a' /bin/gzip
obtener,755
por ejemplo.Con
sudo
:Si no tenía permiso,
sudo
me quejaré en lugar de mostrar el comando.Con polkit, verifica la acción que desea ejecutar:
Encontrar la acción relevante es una pregunta diferente.
fuente
sudo -l
incluso si no es un sudoer, de eso se trata-l
, para decirle si puede ejecutar un comando con sudo.Puedes usar:
command -v shutdown
devuelve la ruta alshutdown
comando.test -x
comprueba 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.
fuente
alias shutdown="shutdown now"
?$(which shutdown)
o$(shopt -u expand_aliases && command -v shutdown)
. Sin embargo, este problema solo aparece en modo interactivo.Bueno, a veces puede ser un poco difícil ...
En primer lugar, mire los permisos con
ls -l
...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
mount
comando 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,mount
se quejará y se negará a montar el dispositivo. Otro ejemplo essudo
, que se ejecutará para cualquier persona, pero solo los usuarios enumerados en / etc / sudoers podrán ejecutar cosas como root .fuente
Utilizando
which
,type
,command
etc., 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 (incluidosbash
) prefijarán su comando con entradas de$PATH
e intentarán ejecutar esos archivos repetidamente hasta que tengan éxito. Comowhich
realmente 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ónwhich dd
volverá/opt/arm/bin/dd
(suponiendo que tenga permisos para ejecutarla), ya que esa entrada es lo primero. Sin embargo, cuando ejecutodd
en mi shell,/bin/dd
se ejecutará, porque/opt/arm/bin/dd
no 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 ~/file
pero norm /root/file
. Nuevamente, no hay una forma general de saberlo sin una inspección manual, o emitiendo el comando y observando los resultados.fuente