
ich versuche, dieses Skript beim Start auszuführen, aber es gibt mir ständig den Fehler, dass/etc/init.d/put_ubuntu_users: 14: /etc/init.d/put_ubuntu_users: cannot open ~/data.txt: No such file
Das ist mein Skript
#!/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
Ich habe diese Befehle ausgeführt
sudo chmod 755 put_ubuntu_users
sudo update-rc.d put_ubuntu_users defaults
sudo service put_ubuntu_users start
Übrigens funktioniert dieses Skript normal, wenn ich es manuell ausführe, indem ich./put_ubuntu_users
Bitte sagen Sie mir, was ich falsch mache
Antwort1
Der Fehler besagt, dass die Datei ~/data.txt nicht gefunden werden kann. Der Grund ist einfach: /etc/init.d-Skripte werden als Root ausgeführt und ich bin ziemlich sicher, dass sich in /root, dem Stammverzeichnis von Root, keine Datei data.txt befindet. Sie können das beheben, indem Sie absolute
Pfade und keine relative
Einsen verwenden.
Andererseits ist es für mich schwer zu verstehen, was eine Umleitung nach einer done
Anweisung bewirkt. Was genau wollen Sie damit erreichen?
Antwort2
Der Fehler besagt, dass die Datei data.txt (für das Home-Verzeichnis des Benutzers) nicht gefunden/aufgerufen werden kann. Dies lässt sich am einfachsten beheben, indem Sie die letzte Zeile des Skripts bearbeiten und ~/data.txt in /home/{username_here}/data.txt ändern.
Antwort3
Dienste haben keine Home-Verzeichnisse. ~/data.txt
In diesem Kontext tut es also nicht das, was Sie denken. Sie müssen die Datei an einem Ort ablegen, auf den Sie mit einem statischen Dateinamen verweisen.
Antwort4
Es besteht die Möglichkeit, dass für den Init-Prozessbenutzer kein Home-Ordner eingerichtet ist (was normal ist).
Fügen Sie am Anfang Ihres Skripts hinzu setuid myuser
, wodurch das Skript als dieser Benutzer ausgeführt wird. Derzeit hat der Init-Benutzer keinen Home-Ordner eingerichtet (eine Vermutung, sonst würde er in den Home-Ordner schreiben). Ein überraschend nützlicherWikipedia-Seitedarüber.