
Я пытаюсь запустить этот скрипт при запуске, но он постоянно выдает ошибку/etc/init.d/put_ubuntu_users: 14: /etc/init.d/put_ubuntu_users: cannot open ~/data.txt: No such file
Это мой сценарий.
#!/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
я выполнил этот набор команд
sudo chmod 755 put_ubuntu_users
sudo update-rc.d put_ubuntu_users defaults
sudo service put_ubuntu_users start
Кстати, этот скрипт работает нормально, если я вручную запускаю его, введя./put_ubuntu_users
Пожалуйста, скажите мне, что я делаю не так?
решение1
Ошибка говорит вам, что не может найти файл ~/data.txt. Причина проста: скрипты /etc/init.d запускаются от имени root, и я почти уверен, что в /root, домашнем каталоге root, нет файла data.txt. Вы можете исправить это, используя absolute
пути, а не relative
единицы.
С другой стороны, мне сложно понять, что делает перенаправление после done
утверждения. Что именно вы имеете в виду?
решение2
Ошибка говорит о том, что файл data.txt (для домашнего каталога пользователя) не может быть найден/доступен. Самый простой способ исправить это — отредактировать последнюю строку скрипта и изменить ~/data.txt на /home/{username_here}/data.txt
решение3
У служб нет домашних каталогов. Так что ~/data.txt
не делает то, что вы думаете, что делает в этом контексте. Вам нужно поместить файл куда-то, на что вы ссылаетесь со статическим именем файла.
решение4
Скорее всего, для пользователя процесса init не настроена домашняя папка (что нормально).
В начале вашего скрипта добавьте setuid myuser
, который запустит скрипт от имени этого пользователя. В настоящее время у пользователя init не настроена домашняя папка (предположение, иначе он бы писал в расположение домашней папки). Удивительно полезныйСтраница Википедииоб этом.