Как использовать heredoc в команде wget в сценарии оболочки, если вставленный текст не является последним аргументом?

"$@"расширится до списка аргументов командной строки, заключенных в кавычки. Это означает, что если вы вызываете свой скрипт с

./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

Затем решение о том, как запускать сценарий с привилегиями суперпользователя, передается пользователю сценария.

0
26.04.2020, 02:19
1 ответ
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
1
19.03.2021, 02:25

Теги

Похожие вопросы