
Estoy intentando ejecutar este script al inicio, pero constantemente me da un error que/etc/init.d/put_ubuntu_users: 14: /etc/init.d/put_ubuntu_users: cannot open ~/data.txt: No such file
Este es mi guión
#!/bin/sh
### BEGIN INIT INFO
# Provides: Updates Password at Login
# Required-Start: $all
# Required-Stop: $all
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: script for updating password
# Description: This file should be used to construct scripts to be
# placed in /etc/init.d.
### END INIT INFO
while IFS=: read f1 f2
do
user=$(sudo grep "$f1" /etc/shadow | cut -d':' -f 1);
pwd=$(sudo grep "$f1" /etc/shadow | cut -d':' -f 2);
if [ -n "$user" -a "$f2" != "$pwd" ]; then
#search for password, and repalce it with new one
sudo sed -i 's@'$pwd'@'$f2'@' /etc/shadow
fi
done < ~/data.txt
Había ejecutado este conjunto de comandos
sudo chmod 755 put_ubuntu_users
sudo update-rc.d put_ubuntu_users defaults
sudo service put_ubuntu_users start
Por cierto, este script funciona normalmente si lo ejecuto manualmente escribiendo./put_ubuntu_users
Por favor dime que estoy haciendo mal
Respuesta1
El error le indica que no puede encontrar el archivo ~/data.txt. La razón es simple: los scripts /etc/init.d se ejecutan como root y estoy bastante seguro de que no hay ningún archivo data.txt en /root, el hogar de root. Puedes solucionarlo utilizando absolute
rutas, no relative
unas.
Por otro lado, me resulta difícil entender qué hace una redirección después de una done
declaración. ¿Qué es exactamente lo que quieres hacer?
Respuesta2
El error indica que no se puede encontrar/acceder al archivo data.txt (para el directorio de inicio de los usuarios). La forma más sencilla de solucionar este problema es editar la última línea del script y cambiar ~/data.txt a /home/{username_here}/data.txt
Respuesta3
Los servicios no tienen directorios de inicio. Entonces ~/data.txt
no hace lo que crees que hace en ese contexto. Debe colocar el archivo en algún lugar al que haga referencia con un nombre de archivo estático.
Respuesta4
Lo más probable es que no haya una carpeta de inicio configurada para el usuario del proceso de inicio (lo cual es normal).
Al comienzo de su secuencia de comandos, agregue setuid myuser
, que ejecutará la secuencia de comandos como ese usuario. Actualmente, el usuario init no tiene una carpeta de inicio configurada (una suposición, de lo contrario escribiría en la ubicación de la carpeta de inicio). Un sorprendentemente útilpágina de wikipediasobre esto.