在Upstart
的以下脚本中,我无法在/etc/shadow
阶段阅读pre-script
,除非我使用$(echo mypass | sudo -S cat /etc/shadow | grep myusername)
如果我提供sudo传递,脚本工作正常,但是我想知道是否有办法在没有在conf文件中写入传递的情况下执行此操作?
description "Starting Node with Upstart and Forever"
start on filesystem or runlevel [2345]
stop on runlevel [06]
expect fork
respawn
respawn limit 5 30
console output
setuid myusername
env HOME=/home/myusername
env ARGS_FILE=/etc/shadow
. /etc/shadow
script
cd $HOME
exec forever start -a -l /tmp/forever.log -o /tmp/forever.stdout.log -e /tmp/forever.stderr.log --watch --watchDirectory /home/myusername/myapp/server /home/myusername/myapp/server/server.js
end script
pre-start script
ori='myusername:$6$P...'
# cur=$(echo mypass | sudo -S cat /etc/shadow | grep myusername) -> this works
cur=$(cat $ARGS_FILE | grep myusername) -> this doesn't work
if [ "$ori" = "$cur" ]
then encfs code
else rm -rf somefile
fi
end script
答案 0 :(得分:1)
只有root才能访问shadow是有充分理由的:任何可以更改它的人都可以轻松获得root访问权限。有一段时间,甚至可以计算旧的MD5密码。结论:除非你绝对必须,否则不要使用/etc/shadow
。基本上,这减少了更改密码的需要。
我不太确定您要实现的目标,但是grep $username /etc/passwd
应该为您提供所需的所有信息除之外的哈希密码。
新手脚本不必以root身份运行。无论用户是谁,都可以运行守护进程。这是使用setuid节(有一个相应的setgid)实现的。因此,您以root用户身份安装该服务,并让它删除权限。
另一种选择是使用user-job。请务必enable user-jobs。
无论你做什么:不要操纵/etc/shadow
!