Можно ли запускать здесь приложение без привилегий root?
Конечно, есть. Предполагая, что Linux был скомпилирован с поддержкой MULTIUSER;)
Очевидная проблема заключается в том, что на самом раннем этапе процесса загрузки нет «пользователей».
Ну да, если вы попытаетесь поместить su
или sudo
в initramfs, вам нужно будет добавить много файлов конфигурации ( / etc / passwd
, / etc / groups
, / etc / shadow
и так далее). Но эти сложности не присущи Linux.В конце концов, UID - это просто число, поэтому очень легко создать игрушечную программу, которая может отбрасывать привилегии root, если это ваша цель:
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char** argv)
{
setuid(atoi(argv[1]));
execvp(argv[2], argv+2);
}
Если вы скомпилируете ее как toysu
, ее можно будет вызвать следующим образом:
toysu 1234 touch /tmp/example
где 1234
- это используемый UID, а остальная часть - это команда для выполнения. Обратите внимание, что это не сработает, если вы с самого начала не являетесь пользователем root, поэтому добавьте к этой команде префикс sudo
, чтобы протестировать ее в обычной системе.
Вы также можете рекурсивно спускаться по дереву JSON следующим образом:
>jq 'recurse|numbers' data.json
0
128
128
7
249
256
(это предполагает, что все ваши значения - числа, используйте скаляры, если вам также нужны булевы и строки)
Или используйте сокращенную нотацию для recurse, то есть ....
..|numbers
(Спасибо @cuonglm !)
Обратите внимание, что в отличие от подхода map|flatten, этот подход будет работать и для произвольного вложенного дерева объектов.
Например,
{
"write": {
"out": 0,
"available": 128,
"totalTickets": 128
},
"read": {
"out": 7,
"available": 249,
"totalTickets": 256,
"details" : {
"good": 10,
"bad" : 20
}
}
}
получится:
0
128
128
7
249
256
10
20
$ jq 'map(map(values))|flatten|.[]' data.json
0
128
128
7
249
256
Первая часть генерирует
[
[
0,
128,
128
],
[
7,
249,
256
]
]
Это сплющивается в:
[
0,
128,
128,
7,
249,
256
]
А .[]
извлекает эти значения.