Bash:将带有空变量的“$@”参数传递给 sudo -i
Bash: pass "$@" argument with empty variables to sudo -i
我有一个函数可以丢弃当前环境并运行脚本作为新登录:
# Recieves a username, a script path and the arguments of the script
run_in_new_login() {
local user
local script
user=
script=
shift 2
sudo -i -u "${user}" -H bash "${script}" "$@" # LOST
}
此函数的问题在于,如果它接收到空参数,则该参数将被丢弃。示例:
#! /usr/bin/env bash
# ~/print_n_args.sh
echo "Recieved $# arguments"
param3=hello
param4="last_one_detected"
param5=""
param6=""
run_in_new_login ${USER} print_n_args.sh param1 param2 "${param3}" "${param4}" "${param5}" "${param6}"
> Recieved 4 arguments
这些参数在LOST
行丢失了,因为如果我打印移位前后的参数个数,报告的参数个数分别是8个和6个。
有没有办法将它们作为空参数传递? (就像函数本身可以接收它们一样)。
PS:我完全知道,对于这种情况,我可以只使用 sudo
而不是我的函数并完成它。但是我对一般情况下脚本 -> 函数 -> 脚本参数在参数为空时传递感兴趣。 没关系,在没有函数的情况下使用 sudo 也有同样的问题。
编辑
做更多测试我发现这实际上是一个 sudo 问题:
sudo -u ${USER} -i -H bash print_n_args.sh param1 param2 "${param3}" "${param4}" "${param5}" "${param6}"
> Recieved 4 parameters
bash print_n_args.sh param1 param2 "${param3}" "${param4}" "${param5}" "${param6}"
> Recieved 6 parameters
我的函数的问题是 sudo
正在删除空变量。有没有办法告诉 sudo
保留空参数?
这是一个错误
来源:https://bugzilla.sudo.ws/show_bug.cgi?id=679
解决方法:
同时,对于我的情况,这段臭代码必须做:
# Recieves a username, a filepath and the arguments to the script
run_in_new_login() {
if [ "$#" -lt "2" ]; then
log_error "Not enough arguments to run_in_new_login"
return 1
fi
local user
local script
local command_
local escaped
user=
script=
shift 2
command_="${script}"
for val in "$@"; do
escaped="$(sed 's/"/\"/g' <<<"${val}")"
command_="${command_} \"${escaped}\""
done
sudo -i -u "${user}" -H bash -c "${SHELL} ${command_}"
}
它基本上遍历所有参数。对于每个,扩展参数,将它们加双引号以转义参数值内的任何双引号,并将它们连接成一个字符串,即 运行 和 bash -c
。 不适用于内部扩展参数的脚本。
我有一个函数可以丢弃当前环境并运行脚本作为新登录:
# Recieves a username, a script path and the arguments of the script
run_in_new_login() {
local user
local script
user=
script=
shift 2
sudo -i -u "${user}" -H bash "${script}" "$@" # LOST
}
此函数的问题在于,如果它接收到空参数,则该参数将被丢弃。示例:
#! /usr/bin/env bash
# ~/print_n_args.sh
echo "Recieved $# arguments"
param3=hello
param4="last_one_detected"
param5=""
param6=""
run_in_new_login ${USER} print_n_args.sh param1 param2 "${param3}" "${param4}" "${param5}" "${param6}"
> Recieved 4 arguments
这些参数在LOST
行丢失了,因为如果我打印移位前后的参数个数,报告的参数个数分别是8个和6个。
有没有办法将它们作为空参数传递? (就像函数本身可以接收它们一样)。
PS:我完全知道,对于这种情况,我可以只使用 没关系,在没有函数的情况下使用 sudo 也有同样的问题。sudo
而不是我的函数并完成它。但是我对一般情况下脚本 -> 函数 -> 脚本参数在参数为空时传递感兴趣。
编辑
做更多测试我发现这实际上是一个 sudo 问题:
sudo -u ${USER} -i -H bash print_n_args.sh param1 param2 "${param3}" "${param4}" "${param5}" "${param6}"
> Recieved 4 parameters
bash print_n_args.sh param1 param2 "${param3}" "${param4}" "${param5}" "${param6}"
> Recieved 6 parameters
我的函数的问题是 sudo
正在删除空变量。有没有办法告诉 sudo
保留空参数?
这是一个错误
来源:https://bugzilla.sudo.ws/show_bug.cgi?id=679
解决方法:
同时,对于我的情况,这段臭代码必须做:
# Recieves a username, a filepath and the arguments to the script
run_in_new_login() {
if [ "$#" -lt "2" ]; then
log_error "Not enough arguments to run_in_new_login"
return 1
fi
local user
local script
local command_
local escaped
user=
script=
shift 2
command_="${script}"
for val in "$@"; do
escaped="$(sed 's/"/\"/g' <<<"${val}")"
command_="${command_} \"${escaped}\""
done
sudo -i -u "${user}" -H bash -c "${SHELL} ${command_}"
}
它基本上遍历所有参数。对于每个,扩展参数,将它们加双引号以转义参数值内的任何双引号,并将它们连接成一个字符串,即 运行 和 bash -c
。 不适用于内部扩展参数的脚本。