我试图在启动时运行这个脚本,但这总是给我错误/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 用户没有设置主文件夹(猜测,否则它会写入主文件夹位置)。一个令人惊讶的有用的维基百科页面对这个。