Добавить переменную bash в качестве ключа и значения JSON в объект

Другой возможностью может быть установка, настройка, а затем использование команды super для запуска вашего скрипта как

super /path/to/your/script

Если вы хотите запустить какой-нибудь двоичный исполняемый файл (, например. который вы скомпилировали в ELF двоичный файл из некоторого исходного кода C)-который не скрипт -как root, вы можете подумать о том, чтобы сделать его setuid(и на самом деле /bin/login, /usr/bin/sudo, /bin/suи superиспользуют эту технику ). Однако будьте очень осторожны, вы можете открыть огромную дыру в безопасности .

Конкретно, ваша программа должна быть закодирована параноидально (, поэтому проверьте все аргументы, среду и внешние условия, прежде чем «действовать», предполагая потенциально враждебного пользователя ),тогда вы можете использовать seteuid (2)и друзей (см. также setreuid (2))осторожно (см. также возможности (7)& учетные данные (7)& execve (2)...)

Вы будете использоватьchmod u+s(read chmod (1))при установке такого двоичного файла.

Но будьте очень осторожны .

Прочтите много информации о setuid , в том числеAdvanced Linux Programming , прежде чем программировать подобные вещи.

Заметьте, что сценарий или любая переделанная-вещь не может быть setuid. Но вы можете закодировать (в C )небольшой двоичный файл setuid -, обернув его.

Имейте в виду, что в Linux код приложения взаимодействует с ядром Linux с помощью системных вызовов (2). Большинство из них могут выйти из строя, см. errno (3). Многие приложения для Linux (, например. GNU bash , GNU make , GNU gdb , GNOME)с открытым исходным кодом :вам разрешено загружать, затем изучать и вносить свой вклад их исходный код.

0
07.06.2019, 16:49
2 ответа

Во-первых, я собираюсь предположить, что у вас есть массив объектов JSON в переменной Bash, так что давайте начнем с этого:

bash$ object='[
  {
    "id" : "tmp1387816934708382026",
    "owner" : "john",
    "x11-display" : ":5",
    "x11-authority" : "/run/user/john/dcv/tmp1387816934708382026.xauth",
    "num-of-connections" : 1,
    "creation-time" : "2019-05-14T14:12:14.989287Z",
    "last-disconnection-time" : "2019-05-31T18:58:42.851223Z"
  },
  {
    "id" : "tmp4241942441012516520",
    "owner" : "mike",
    "x11-display" : ":10",
    "x11-authority" : "/run/user/mike/dcv/tmp4241942441012516520.xauth",
    "num-of-connections" : 0,
    "creation-time" : "2019-05-17T16:23:05.891531Z",
    "last-disconnection-time" : "2019-05-19T11:23:30.844797Z"
  }
]'

Далее я предполагаю, что $daysIdleтоже является переменной и содержит число:

bash$ daysIdle=3

Теперь мы можем повторить $objectjq, чтобы добавить эту переменную.

bash$ echo "$object" | jq --arg daysIdle "$daysIdle" '.[]."days-idle" = ($daysIdle | tonumber)'

Несколько важных замечаний по этому поводу. Если объекты на самом деле находятся в файле или поступают из какого-либо другого потока, такого как cURL, просто замените echo $objectтем, что подходит. Во-вторых, я предполагаю, что вам нужен номер JSON, а не строка, которую обычно создает --arg, поэтому у меня есть фильтр, чтобы это исправить. Наконец, обратите внимание, что я использую опцию --argдля jqдля передачи значения. Это намного лучше и безопаснее, чем пытаться внедрить значение в саму строку фильтра JSON, и не вызовет в ней синтаксической ошибки. Он выдаст ошибку, если не сможет привести к числу, но не допустит произвольного внедрения в строку фильтра. С учетом сказанного давайте посмотрим на результат:

[
  {
    "id": "tmp1387816934708382026",
    "owner": "john",
    "x11-display": ":5",
    "x11-authority": "/run/user/john/dcv/tmp1387816934708382026.xauth",
    "num-of-connections": 1,
    "creation-time": "2019-05-14T14:12:14.989287Z",
    "last-disconnection-time": "2019-05-31T18:58:42.851223Z",
    "days-idle": 3
  },
  {
    "id": "tmp4241942441012516520",
    "owner": "mike",
    "x11-display": ":10",
    "x11-authority": "/run/user/mike/dcv/tmp4241942441012516520.xauth",
    "num-of-connections": 0,
    "creation-time": "2019-05-17T16:23:05.891531Z",
    "last-disconnection-time": "2019-05-19T11:23:30.844797Z",
    "days-idle": 3
  }
]
0
02.12.2020, 20:23

Предположим, вы хотите добавить новый ключ к элементу с определенным .idзначением,$id:

jq --arg id "$id" --arg idle "$daysIdle" \
    '(.[] | select(.id == $id)."days-idle" ) |= $idle' file

Это выбирает элемент массива с .id, который мы хотим изменить, затем добавляет (фактически обновляет)ключ ."days-idle"к этому элементу с конкретным значением, которое мы хотим, чтобы он имеют.

Если ."days-idle"должно быть временем между отметкой времени ."last-disconnection-time"и сейчас , вы можете обновить все элементы в JSON следующим образом:

jq 'def dayssince: ((now - (sub("[.].*"; "Z") | fromdate))/86400) | round;
    map(. += { "days-idle": (."last-disconnection-time" | dayssince) })' file

Вызов sub()усекает метку времени в точке и заменяет ее конец на Z.Это связано с тем, что fromdateнемного ограничивает тип меток времени, которые он может анализировать, и не обрабатывает точность до -секунды исходной строки меток времени.

Я решил поместить фактическое вычисление количества дней с момента метки времени в виде jqфункции с именем dayssince, просто чтобы код оставался аккуратным.

Полученный JSON (при запуске 28 июня 2021 г.):

[
  {
    "id": "tmp1387816934708382026",
    "owner": "john",
    "x11-display": ":5",
    "x11-authority": "/run/user/john/dcv/tmp1387816934708382026.xauth",
    "num-of-connections": 1,
    "creation-time": "2019-05-14T14:12:14.989287Z",
    "last-disconnection-time": "2019-05-31T18:58:42.851223Z",
    "days-idle": 759
  },
  {
    "id": "tmp4241942441012516520",
    "owner": "mike",
    "x11-display": ":10",
    "x11-authority": "/run/user/mike/dcv/tmp4241942441012516520.xauth",
    "num-of-connections": 0,
    "creation-time": "2019-05-17T16:23:05.891531Z",
    "last-disconnection-time": "2019-05-19T11:23:30.844797Z",
    "days-idle": 771
  }
]
1
28.06.2021, 10:26

Теги

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