
我試圖在啟動時運行這個腳本,但這不斷給我錯誤/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 使用者沒有設定主資料夾(猜測,否則它會寫入主資料夾位置)。一個令人驚訝的有用維基百科頁面對這個。