
시작할 때 이 스크립트를 실행하려고 하는데 계속해서 오류가 발생합니다./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에 data.txt 파일이 없다고 확신합니다. absolute
경로가 아닌 경로를 사용하여 이 문제를 해결할 수 있습니다 relative
.
반면에 명령문 이후에 리디렉션이 수행하는 작업을 이해하기가 어렵습니다 done
. 정확히 무엇을 하려는 건가요?
답변2
오류는 data.txt 파일(사용자 홈 디렉터리용)을 찾거나 액세스할 수 없다는 것입니다. 이 문제를 해결하는 가장 쉬운 방법은 스크립트의 마지막 줄을 편집하고 ~/data.txt를 /home/{username_here}/data.txt로 변경하는 것입니다.
답변3
서비스에는 홈 디렉터리가 없습니다. 따라서 ~/data.txt
해당 맥락에서 생각하는 대로 수행되지 않습니다. 정적 파일 이름으로 참조하는 위치에 파일을 넣어야 합니다.
답변4
init 프로세스 사용자(정상)에 대해 설정된 홈 폴더가 없을 가능성이 있습니다.
스크립트 시작 부분에 를 추가하면 setuid myuser
해당 사용자로 스크립트가 실행됩니다. 현재 init 사용자는 홈 폴더가 설정되어 있지 않습니다(추측, 그렇지 않으면 홈 폴더 위치에 쓸 것입니다). 놀라울 정도로 유용한위키피디아 페이지이것에 관해서.