使用sudo安装CMake后,如何将文件所有者改为原用户?
解决CMake sudo安装后配置文件属主为root的问题
你已经能正确定位到原用户的家目录,但sudo执行install时文件会被设为root属主,要改成原用户,可通过CMake的install(CODE)指令在安装阶段执行chown命令,具体步骤如下:
1. 补全原用户信息的获取
除了家目录,还需要明确原用户的用户名,在你现有代码基础上补充:
# 获取原用户用户名 if($ENV{SUDO_USER}) set(ORIGINAL_USER $ENV{SUDO_USER}) else() execute_process( COMMAND sh -c "whoami" OUTPUT_VARIABLE ORIGINAL_USER OUTPUT_STRIP_TRAILING_WHITESPACE ) endif() # 你已有的家目录获取代码 if($ENV{SUDO_USER}) execute_process( COMMAND sh -c "eval echo ~$ENV{SUDO_USER}" OUTPUT_VARIABLE USER_HOME OUTPUT_STRIP_TRAILING_WHITESPACE ) else() execute_process( COMMAND sh -c "echo $HOME" OUTPUT_VARIABLE USER_HOME OUTPUT_STRIP_TRAILING_WHITESPACE ) endif() set(USER_HIDDEN_DIR "${USER_HOME}/.application")
2. 使用install(CODE)执行chown
在原install(FILES)指令后,添加一段install(CODE)来修改文件属主:
# 复制配置文件 install(FILES etc/config.tsv DESTINATION ${USER_HIDDEN_DIR} PERMISSIONS OWNER_READ OWNER_WRITE) # 修改文件属主为原用户 install(CODE " execute_process( COMMAND chown ${ORIGINAL_USER}:${ORIGINAL_USER} ${USER_HIDDEN_DIR}/config.tsv RESULT_VARIABLE CHOWN_RESULT ) if(NOT CHOWN_RESULT EQUAL 0) message(WARNING \"Failed to change owner of ${USER_HIDDEN_DIR}/config.tsv to ${ORIGINAL_USER}\") endif() ")
说明
install(CODE)会在安装阶段执行指定的CMake代码,这里调用execute_process执行系统的chown命令。- 当非sudo安装时,
ORIGINAL_USER就是当前用户,此时chown不会改变属主,也不会报错,无需额外判断。 - 如果需要修改整个隐藏目录的属主,把命令里的文件路径换成
${USER_HIDDEN_DIR}即可,不过通常只需修改配置文件本身。
内容的提问来源于stack exchange,提问作者CDR
相关产品推荐
相关产品推荐

