我有一个构建过程,由Make
启动,执行很多子脚本。
其中一些子脚本需要root privileges
,因此我不是将所有内容都运行为root
,而是将所有内容都运行为sudo
,而是尝试只执行需要的脚本作为root
,root
。
我正在这样做:
execute_as_user() {
su "$1" -s /bin/bash -c "$2;exit \$?"
}
Arg $ 1是运行脚本的用户,因为arg $ 2是脚本。
Arg $ 1是root
(得到:$(whoami)
,因为一切都在sudo下),或当前用户的帐户(得到:$(logname)
)
整个构建以:
开始sudo make all
Makefile中的示例:
LOG="runtime.log"
ROTATE_LOG:=$(shell bash ./scripts/utils/rotate_log.sh)
system:
/bin/bash -c "time ./scripts/system.sh 2>&1 | tee ${LOG}"
我的问题是......没有子脚本将输出打印到stdout
。我认为这是一个几乎递归调用su root
的某种问题......但我不确定。根据我的理解,这些脚本应该已经输出到stdout
,所以也许我错了输出的位置?
要清楚,我看到日志文件中没有输出,也没有显示到终端(stdout)。
Updating for clarity:
以前,我只是使用sudo
运行所有脚本,或者只是登录用户...使用上面的makefile,将打印到终端(stdout
)和日志文件。添加execute_as_user()
功能是问题出现的地方。脚本执行并构建项目......只是没有显示“它正在工作”而没有日志。
UPDATE
以下是一些片段:
system.sh摘录:
execute_script() {
echo "Executing as user $3: $2"
RETURN=$(execute_as_user $3 ${SYSTEM_SCRIPTS}/$2)
if [ ${RETURN} -ne ${OK} ]
then
error $1 $2 ${RETURN}
fi
}
build_package() {
local RETURN=0
case "$1" in
system)
declare -a scripts=(\
"rootfs.sh" \
"base_files.sh" \
"busybox.sh" \
"iana-etc.sh" \
"kernel.sh" \
"firmware.sh" \
"bootscripts.sh" \
"network.sh" \
"dropbear.sh" \
"wireless_tools.sh" \
"e2fsprogs.sh" \
"shared_libs.sh"
)
for SCRIPT_NAME in "${scripts[@]}"; do
execute_script $1 ${SCRIPT_NAME} $(logname)
echo ""
echo -n "${SCRIPT_NAME}"
show_status ${OK}
echo ""
done
# finalize base system
echo ""
echo "Finalizing base system"
execute_script $1 "finalize.sh" $(whoami)
echo ""
echo -n "finalize.sh"
show_status ${OK}
echo ""
# package into tarball
echo ""
echo "Packing base system"
execute_script $1 "archive.sh" $(whoami)
echo ""
echo -n "archive.sh"
show_status ${OK}
echo ""
echo ""
echo -n "Build System: "
show_status ${OK}
;;
*)
echo "$1 is not supported!"
exit 1
esac
}
system.sh执行的示例子脚本
cd ${CLFS_SOURCES}/
tar -xvjf ${PKG_NAME}-${PKG_VERSION}.tar.bz2
cd ${CLFS_SOURCES}/${PKG_NAME}-${PKG_VERSION}/
make distclean
RESPONSE=$?
if [ ${RESPONSE} -ne 0 ]
then
pkg_error ${RESPONSE}
exit ${RESPONSE}
fi
ARCH="${CLFS_ARCH}" make defconfig
RESPONSE=$?
if [ ${RESPONSE} -ne 0 ]
then
pkg_error ${RESPONSE}
exit ${RESPONSE}
fi
# fixup some bugs with musl-libc
sed -i 's/\(CONFIG_\)\(.*\)\(INETD\)\(.*\)=y/# \1\2\3\4 is not set/g' .config
sed -i 's/\(CONFIG_IFPLUGD\)=y/# \1 is not set/' .config
etc...
这是整个system.sh脚本:
https://github.com/SnakeDoc/LiLi/blob/master/scripts/system.sh
(我知道这个项目很乱......这是一个随你学习的风格项目)
答案 0 :(得分:0)
以前,我只是使用sudo或者只使用sudo运行所有脚本 登录用户...使用上面的makefile,将打印到 终端(stdout)和日志文件。添加execute_as_user()函数 是问题出现的地方。脚本执行并构建 项目...只是没有显示“它正在工作”而没有日志。
只是一个猜测,但你可能没有调用你的函数或没有正确调用它:
execute_as_user() {
su "$1" -s /bin/bash -c "$2;exit \$?"
}
execute_as_user "$@"
我还注意到你根本没有向脚本传递任何参数。这是什么意思?
./scripts/system.sh ???