"$@"
расширится до списка аргументов командной строки, заключенных в кавычки. Это означает, что если вы вызываете свой скрипт с
./script.sh start-one
он запустится start-one
в точке (, которая является вашей функцией ). Это также означает, что вызов его как
./script.sh ls
он будет работать ls
.
Разрешение пользователю вызывать скрипт с помощьюsudo
(или с помощью sudo
внутри скрипта )позволит ему выполнять любую команду от имени пользователя root, если у него есть sudo
доступ. Вы не хотите этого.
Вместо этого вам потребуется тщательно проверить аргументы командной строки. Может что-то вроде
foo_func () {
# stuff
printf 'foo:\t%s\n' "$@"
}
bar_func () {
# stuff
printf 'bar:\t%s\n' "$@"
}
arg=$1
shift
case $arg in
foo)
foo_func "$@" ;;
bar)
bar_func "$@" ;;
*)
printf 'invalid sub-command: %s\n' "$arg" >&2
exit 1
esac
Тестирование:
$ sh script.sh bar 1 2 3
bar: 1
bar: 2
bar: 3
$ sh script.sh baz
invalid sub-command: baz
Было бы безопаснее использовать с sudo
, но вы все равно не захотели бы выполнять что-либо, что пользователь дает вам в различных функциях напрямую без очистки ввода. Приведенный выше сценарий делает это, ограничивая пользователя определенным набором вложенных -команд, и каждая функция, обрабатывающая вложенную команду -, не выполняет, eval
или source
свою аргументы.
Позвольте мне сказать это снова другими словами.:Сценарий не пытается и не должен пытаться каким-либо образом выполнять пользовательский ввод как код . Он не должен пытаться выяснить, соответствует ли аргумент функции в текущей среде, которую он может выполнять (функции могли быть помещены туда вызывающей средой ), и он не должен выполнять сценарии, имена путей которых были заданы в командная строка и т. д.
Если сценарий выполняет административные задачи, я ожидаю, что мне придется запускать его с sudo
,и я бы не хотел, чтобы сам скрипт спрашивал у меня пароль, особенно если это скрипт, который я могу запустить не -интерактивно (, например. из задания cron ). То есть сценарий, выполняющий административные задачи, требующие привилегий суперпользователя, должен (ИМХО )быть в состоянии предположить , что он работает с правильными привилегиями с самого начала.
Если вы хотите протестировать это в сценарии, вы можете сделать это с помощью
if [ "$( id -u )" -ne 0 ]; then
echo 'please run this script as root' >&2
exit 1
fi
Затем решение о том, как запускать сценарий с привилегиями суперпользователя, передается пользователю сценария.
LONG_JSON=$(cat <<EOT
{
"foocao": 0,
"foorio":
{
"foo": "foofoofoo",
"foofooe": "foofoo",
"foon": "fooe",
"fool": "foo.com",
"fooa": "foofoo"
},
"fooade":
{
"foofoofoo": "foofoo-foo-foo-foo-foofoofoo",
"foo": "fooTE",
"fool": "baa.com",
"foofoo": "foo9-foo",
"fooao": "foofoo",
"fooor": "foofoo",
"foofoo": "foofooia",
"foofooo": "fooo",
"foos": "✓ foofooade e foofooe;✓ foofooa, foofooação fooal e Polífoo e foofoo foonil;✓ foofoo e foor;✓ foofoofoo, foofoo e fooa;✓ foofooção e foofooe de fooessão;✓ Saúde;✓ fooura;✓ fooação;✓ fooitório e foofoode; foofoofoofoo e foo foofoo;✓ foo",
"foo": "www.foo.com",
"foodo": "aa",
"foode": "foo",
"foofoo": "foo",
"foofoonto": "",
"fooro": "1",
"cep": "foofoo",
"foofooo": "Bla, foola fooa"
}
}
EOT
)
wget --header='Content-Type:application/json' --post-data="$LONG_JSON" -qO- http://foo/jspui/foo.jsp