Другой возможностью может быть установка, настройка, а затем использование команды 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)с открытым исходным кодом :вам разрешено загружать, затем изучать и вносить свой вклад их исходный код.
Во-первых, я собираюсь предположить, что у вас есть массив объектов 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
Теперь мы можем повторить $object
–jq
, чтобы добавить эту переменную.
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
}
]
Предположим, вы хотите добавить новый ключ к элементу с определенным .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
}
]