Системные вызовы, AWK и Введение внешних исходных данных

Удостоверьтесь, что Вы имеете

Include conf/extra/httpd-userdir.conf

и

LoadModule userdir_module modules/mod_userdir.so

в Вашем httpd.conf.

4
08.02.2013, 23:22
2 ответа

awk может получить доступ к переменным среды с помощью ENVIRON специальный массив. Однако, в то время как можно присвоить значения элементам того массива, он не передается в среде команд, выполняемых awk system, | getline или print |. Это ENVIRON массив только предназначается для awk для получения значения переменных среды, это передается.

Можно сделать: system("ls " var), но остерегайтесь этого строка, которая передается awk system() (или print | или | getline) на самом деле передается как аргумент sh -c, таким образом, это интерпретируется как код оболочки.

Например, если awk var переменная содержит foo;rm -rf /, это не скажет ls перечислять названный файл "foo;rm -rf /" но вместо этого перечислять названный файл foo и затем rm команда будет выполнена.

Так, Вы, возможно, должны выйти из всех символов, особенных для оболочки в этом var переменная.

Это могло быть сделано, например, с:

awk '
  function escape(s) {
    gsub(/'\''/, "&\\\\&&", s)
    return "'\''" s "'\''"
  }
  {
    cmd = "date -d " escape($0) " +%s"
    cmd | getline seconds
    close(cmd)
    print seconds
  }'

В то время как это означает выполнять одну оболочку и один date управляйте на строку, Вы могли бы также сделать чтение файла с самой оболочкой:

while IFS= read <&3 -r line; do
  date -d "$line" +%s
done 3< the-file
8
27.01.2020, 20:50
  • 1
    Для будущих читателей, которые задаются вопросом, почему столько кавычек и обратных косых черт используются, это вызвано тем, что отрывок ** команда оболочки также. То, что в основном необходимо сделать, должно поместить одинарные кавычки вокруг аргумента и заменить одинарными кавычками в аргументе '\'' (строка конца, вставить \', продолжите строку). В сценарии AWK (файл) достаточно использовать gsub(/'/, "'\\''", s); return "'" s "'";, но для команды "остроты", одинарных кавычек и обратных косых черт должен оставить снова как показано Stephane. –  Lekensteyn 22.11.2013, 23:46

Если вы передаете переменную Awk в систему , вам нужно процитировать ее в оболочке:

function quote(str,   d, m, x, y, z) {
  d = "\47"; m = split(str, x, d)
  for (y in x) z = z d x[y] d (y < m ? "\\" d : "")
  return z
}

Пример:

system(sprintf("date -d %s +%%s", quote($0)))

Источник

0
27.01.2020, 20:50

Теги

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