Tengo un script que puede ejecutarse como sudo script.sh
opkexec script.sh
Sería mucho mejor desde el punto de vista del usuario si el script solicitara la contraseña del usuario cuando solo la ejecutara por su nombre script.sh
.
¿Cómo puedo "incrustar" la solicitud pkexec
o sudo
ejecutar el script completo con privilegio de root?
Tenga en cuenta que ejecutar todo con sudo sh -c
podría no ser la mejor solución ya que tengo funciones en el script.
command-line
bash
scripts
Sergiy Kolodyazhnyy
fuente
fuente
exec
: llámese a sí mismo pero al mismo tiempo reemplace el proceso, para que no generemos múltiples instancias del script"$@"
se expandirá a varias palabras, una para cada parámetro.Si desea un bonito diálogo, intente algo como esto. Extraje esto directamente de otra cosa que escribí, por lo que tiene cosas adicionales que quizás no necesite o desee, pero muestra la idea general:
Esto usa whiptail, que puede instalar si aún no lo tiene:
fuente
exec echo [PASSWORD]
! Generará un proceso con la contraseña en la línea de comandos que cualquier usuario puede ver. Utilice el comando incorporadoecho
(forzar la versión incorporada conbuiltin echo
) o el bashism<<<
(así :)sudo ... <<< "$pass"
; Sh y otros proyectiles tienen Documentos Aquí para estos casos. Además, indique la contraseña en caso de que contenga caracteres especiales.whiptail
comando en una secuencia de comandos y el uso separado algo así comoSUDO_ASKPASS=/path/to/askpass-with-whiptail.sh sudo -A -p "My password prompt" -- "$0" "$@"
tenersudo
trato con la contraseña de mensajes personalizados.La respuesta de blade19899 es de hecho el camino a seguir, sin embargo, también se podría llamar
sudo bash
al shebang:La advertencia obvia es que esto solo funcionará mientras se invoque el script
./script
y fallará tan pronto como se invoque el scriptbash script
.fuente
bash script
en la línea de comando para invocar un script. Si el script especifica algo diferente abash
la#!
línea, entonces invocarlo conbash script
va a fallar. Si intentara invocar un script de Python usandobash script.py
, también fallaría.perl script
, puedes ejecutarlo con . Perl, en un esfuerzo por ser realmente agradable, verifica la línea shebang, y si no está invocando a Perl, ejecuta el programa correcto.Prefacio los comandos dentro de la secuencia de comandos que necesitan acceso raíz con
sudo
: si el usuario aún no ha obtenido permisos, la secuencia de comandos solicita una contraseña en ese punto.ejemplo
Este script puede ejecutarse como
sudo <scriptname>
o como<scriptname>
. En cualquier caso, le pedirá la contraseña, solo una vez.fuente
sudo
a 25 comandos diferentes de forma redundante; es más fácil llamar a sudo una vez. Aquí, sin embargo, la razón por la que su script llama a sudo solo una vez es porque sudo tiene un tiempo de espera de 15 minutos; los comandos que tardan más de ese tiempo deberán volverse a adoptar. Tu camino funciona justo. . . no como lo necesito para funcionar.Parece que nadie más ha abordado la preocupación obvia aquí. Poner
sudo
dentro de su script que luego distribuye promueve malos hábitos de usuario . (Supongo que lo está distribuyendo porque menciona "desde el punto de vista del usuario").La verdad es que hay una directriz en el uso de aplicaciones y scripts que es similar al principio de seguridad en la banca de: Nunca dé su información personal a alguien que lo llame y diga que está llamando "desde su banco" , y que existe por razones similares
La regla para las aplicaciones es:
Nunca escriba su contraseña cuando se le solicite, a menos que esté seguro de lo que se está haciendo con ella. Esto se aplica por triplicado a cualquier persona con
sudo
acceso.Si está escribiendo su contraseña porque se ejecutó
sudo
en la línea de comando, genial. Si lo está escribiendo porque ejecutó un comando SSH, está bien. Si lo está escribiendo cuando inicia sesión en su computadora, genial, por supuesto.Si solo ejecuta un script o ejecutable extranjero e ingresa su contraseña cuando se le solicite, no tiene idea de lo que el script está haciendo con él. Podría estar almacenándolo en un archivo temporal en texto plano, por lo que sabes, e incluso podría fallar al limpiarlo.
Obviamente, hay preocupaciones separadas y adicionales sobre la ejecución de un conjunto desconocido de comandos como
root
, pero de lo que estoy hablando aquí es de mantener la seguridad en la contraseña . Incluso suponiendo que la aplicación / script no sea malicioso, aún desea que su contraseña se maneje de manera segura para evitar que otras aplicaciones la consigan y la usen maliciosamente.Entonces, mi propia respuesta personal a esto es que lo mejor que puede incluir en su script si necesita privilegios de root es:
fuente
sudo script_name
es igual de vulnerable, es lo mismo. Tal vez esta idea promueva malos hábitos, no diré nada al respecto. Pero la clave es saber lo que hace un programa, y eso es responsabilidad del usuario. Esa es toda la idea detrás del software de código abierto. En cuanto a mi propio guión, bueno. . . un script es texto sin formato: los usuarios pueden leerlo si quieren saber lo que haceLo hice de esta manera:
fuente