
estou tentando executar este script na inicialização, mas isso está constantemente me dando um erro que/etc/init.d/put_ubuntu_users: 14: /etc/init.d/put_ubuntu_users: cannot open ~/data.txt: No such file
Este é o meu roteiro
#!/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
eu executei esse conjunto de comandos
sudo chmod 755 put_ubuntu_users
sudo update-rc.d put_ubuntu_users defaults
sudo service put_ubuntu_users start
Aliás, este script está funcionando normalmente se eu executá-lo manualmente digitando./put_ubuntu_users
Por favor, me diga o que estou fazendo de errado
Responder1
O erro está informando que não é possível encontrar o arquivo ~/data.txt. A razão é simples: os scripts /etc/init.d são executados como root e tenho certeza de que não há arquivo data.txt em /root, a página inicial do root. Você pode corrigir isso usando absolute
caminhos, não relative
uns.
Por outro lado, acho difícil entender o que um redirecionamento está fazendo após uma done
declaração. O que exatamente você pretende fazer?
Responder2
O erro é dizer que o arquivo data.txt (para o diretório inicial dos usuários) não pode ser encontrado/acessado. A maneira mais fácil de corrigir isso é editar a última linha do script e alterar ~/data.txt para /home/{username_here}/data.txt
Responder3
Os serviços não possuem diretórios iniciais. Portanto, ~/data.txt
não faz o que você pensa que faz nesse contexto. Você precisa colocar o arquivo em algum lugar referenciado com um nome de arquivo estático.
Responder4
É provável que não exista uma pasta pessoal configurada para o usuário do processo init (o que é normal).
No início do seu script, adicione setuid myuser
, que executará o script como esse usuário. Atualmente, o usuário init não tem uma pasta pessoal configurada (um palpite, caso contrário, ele gravaria no local da pasta pessoal). Um surpreendentemente útilPágina da Wikipédiasobre isso.