提问人:Aarón Deza Zapata 提问时间:9/12/2023 更新时间:9/12/2023 访问量:46
如何在不使用 sudo 的情况下删除包含文件的目录
How to delete directory with files without using sudo
问:
我正在制作一个获取一些文件夹的脚本,经过几次操作后,我需要删除它们。
问题是当我尝试删除该文件夹及其数据时,操作需要root访问权限才能继续。
老实说,我不知道该怎么办。我尝试了很多方法,从尝试使用安装复制文件夹以复制具有不同权限的文件夹到尝试强制对脚本进行 sudo 访问,这是不可能的。
我不知道如何进行,所以任何想法都值得赞赏。
感谢您抽出宝贵时间接受采访!
我尝试使用安装命令复制具有不同权限的文件夹及其数据,但它不起作用。
我尝试在脚本上运行 sudo 命令,并在删除该文件夹之前更改权限,更改权限也需要 root 访问权限。
答:
0赞
Antonio Petricca
9/12/2023
#1
如果你能够将自己提升到ROOT,你可以使用我将要描述的我的解决方案。
使用我的以下脚本,您将能够为任何启用了 setuid 标志的脚本创建可执行包装器:wrap-setuid-script.sh
wrap-setuid-script.sh
#!/bin/bash
# https://unix.stackexchange.com/a/130910/141129
# https://access.redhat.com/site/solutions/124693
if [ $# != 1 ]; then
echo "Please, provide script file name." >&2
exit 1
fi
if [ ${EUID} != 0 ]; then
echo "Only root can run this script." >&2
exit 1
fi
SCRIPT_FILE=$1
if [ ! -f "${SCRIPT_FILE}" ]; then
echo "Script file not found." >&2
exit 1
fi
SCRIPT_BASE_FILE=$(basename ${SCRIPT_FILE})
C_TEMPLATE=$(cat << DELIMITER
#include <libgen.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
char *cwd;
char exe_file[PATH_MAX];
char script_file[PATH_MAX];
readlink("/proc/self/exe", exe_file, PATH_MAX);
cwd = dirname(exe_file);
sprintf(script_file, "%s/${SCRIPT_BASE_FILE}", cwd);
setuid(0);
system(script_file);
return 0;
}
DELIMITER
)
C_FILE="${SCRIPT_FILE}.c"
EXE_FILE="${SCRIPT_FILE}.x"
echo "${C_TEMPLATE}" > "${C_FILE}" \
&& gcc "${C_FILE}" -o "${EXE_FILE}" \
&& chown root:root "${EXE_FILE}" \
&& chmod 4755 "${EXE_FILE}" \
&& rm "${C_FILE}" \
&& echo "Setuid script executable created as \"${EXE_FILE}\"."
运行它后,您将在脚本附近获得一个新的本机可执行文件,该文件与脚本名称相同,外加扩展名。.x
通过运行它,您将能够从非 root 用户帐户以 root 身份执行脚本。
如果您需要更多帮助,请告诉我。
评论
sudo chown -R user: directory