
La pregunta principal:
¿Hay alguna manera de ejecutar 'completamente' uno de mis scripts cuando aparece el escritorio de Ubuntu, sin importar si el root, el administrador, el usuario del escritorio o un usuario sin privilegios han iniciado sesión?
¿Qué hace el guión?
El script monta una partición, busca un archivo en esa partición y finalmente, en base a ese archivo, se toma la decisión de copiar una partición a otra partición. Esa copia se realiza a través de
dd if=/dev/sda2 of=/dev/sda5
¿Cuándo se ejecuta correctamente el script?
El script se ejecuta sin problemas cuando lo ejecuto desde la terminal mediante
sudo ./my_copying_script
Este comando me pide la contraseña del usuario que ha iniciado sesión actualmente. Ingreso la contraseña y el script comienza a funcionar.
¿Cuándo el script NO se ejecuta correctamente?
Quiero ejecutar el script al inicio. Lo configuré como programa de inicio usando elAplicaciones de inicioutilidad de Ubuntu. El script se ejecutó al inicio pero salió con el comando dd y se produjo el siguiente error:
dd: opening '/dev/sda2': Permission denied
EnedkComo sugerencia, establezco el propietario de my_copying_script como root y establezco el SUID. Ahora los permisos de my_copying_script son (-rwsr-sr-x).edkEl punto de vista de fue que una vez que establezco el suid, el programa de inicio se ejecutará con los permisos de su propietario. Lo hice pero apareció el mismo error de permiso denegado /dev/sda2.
Luego le puse el prefijo dd con sudo como se menciona a continuación
sudo dd if=/dev/sda2 of=/dev/sda5
pero esto arrojó el siguiente error:
sudo: no tty present and no askpass program specified
Respuesta1
Usman, creo que tienes al menos dos opciones que ya mencioné.
Una manera más fácil
Cree un binario set-UID que (verifique quién lo inició y permita su uso si el propietario del proceso principal puede ejecutarlo) ejecute el script preparado y salga. Ponlo en inicio en tu administrador de escritorio, eso es todo. Sólo tenga en cuenta que no es la mejor manera y necesita un poco de codificación C. Básicamente necesitas hacer un código como este de ejemplo:
int main(){
setuid(0);
system("/bin/sh /root/bin/mounts.sh");
}
Tenga en cuenta que, en realidad, esto es un truco, no una solución. Y asegúrese de usar root:allowed_group y 4750 derechos enbinariosi no necesita que lo ejecuten todos. Recuerde agregar todos los usuarios que puedan iniciar esto a Allow_group (elija su nombre).
Una buena manera
Otra forma mucho mejor es crear una especie de demonio, generado en el arranque del sistema (por ejemplo, a partir de scripts de inicio), pero no estoy seguro de cómo vas a detectar exactamente cuándo se inicia una nueva sesión X, no me gustaba eso. tema todavía, no puedo dar ningunoclaroconsejos aquí.
Respuesta2
Establezca los permisos correctos en la ruta de la unidad montada y listo.
Respuesta3
sudo sólo ejecutará un programa como un usuario diferente si se cumple una de estas 3 condiciones (en lo que a contraseñas se refiere):
- se especifica la opción NOPASSWD
- el usuario ingresó la contraseña de destino correcta
- el usuario ingresó la contraseña de origen correcta
Dado que las opciones 2 y 3 requieren un TTY (sudo no leerá desde una tubería), no se ejecutará si no puede encontrar uno. Verifique su secuencia de comandos si en algún momento está ejecutando una secuencia de comandos de forma remota usando ssh, ya que es posible que no asigne un TTY para un comando remoto no interactivo.
Citado de:Aquí
Respuesta4
Una posible solución será agregar su usuario y el comando que está intentando invocar en /etc/sudoers con el parámetro NOPASSWD. Cortado de /etc/sudoers:
# Descomentar para permitir que los miembros del grupo sudo no necesiten una contraseña # (Ten en cuenta que las entradas posteriores anulan esto, por lo que es posible que tengas que moverte # más abajo) # %sudo ALL=NOPASSWD: TODOS
Entonces tal vez necesites algo como:
myuser ALL=NOPASSWD: mount
No estoy muy seguro de la sintaxis exacta, será mejor que la busques en Google.
EDITAR:Si está intentando montar una unidad de red, agregar un registro a /etc/fstab probablemente no funcione, porque los servicios de red no se cargan en el momento en que se ejecuta fstab.