Свяжите определенные файлы в один единственный файл

Если я понимаю правильно, Вы просто должны su от корня до некоторого другого пользователя. Попытайтесь копировать su двоичный файл (это не должен будет быть корень setuid), но я не знаю, будет ли это работать над Солярисом. Или скомпилируйте маленькую программу C, которая отбрасывает полномочия и выполняет команду.

Вот маленький “вниз единственный” su. Минимально протестированный. Должен скомпилировать, как находится под Солярисом и *BSD; Вы должны -D_BDS_SOURCE и #include <grp.h> в соответствии с Linux и другими платформами может потребовать комментирования вызова к общему, но нестандартному setgroups. Выполненный как, например. sugexec UID GID bash /path/to/script (необходимо передать числового пользователя и идентификаторы группы, для предотвращения в зависимости от любой формы пользовательской базы данных, которая не может быть доступной в chroot).

#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>

void die(char *argv0, char *obj, char *msg) {
    if (msg == NULL) msg = strerror(errno);
    fprintf(stderr, "%s: %s: %s\n", argv0, obj, msg);
    exit(127);
}
int main(int argc, char *argv[]) {
    uid_t uid;
    gid_t gid;
    char *endp;
    /* Command line parsing */
    if (argc <= 3) {
        fprintf(stderr, "Usage: %s UID GID COMMAND [ARG...]\n",
                argv[0]==NULL ? "sugexec" : argv[0]);
        exit(127);
    }
    uid = strtoul(argv[1], &endp, 0);
    if (*endp) die(argv[0], argv[1], "Bad uid");
    gid = strtoul(argv[2], &endp, 0);
    if (*endp) die(argv[0], argv[2], "Bad gid");
    /* Drop to specified user and group */
    if (setgid(gid)) die(argv[0], "setgid", NULL);
    if (setgroups(0, NULL)) die(argv[0], "setgroups", NULL);
    if (setuid(uid)) die(argv[0], "setuid", NULL);
    /* Execute the command */
    execvp(argv[3], argv + 3);
    die(argv[0], argv[3], NULL);
}
5
18.11.2018, 19:26
4 ответа

Можно использовать cat команда (см. man cat для получения дополнительной информации) для конкатенации текстовых файлов.

Если Вы хотите создать новый файл

cat [FILE1] [FILE2]... > new_file

или если Вы хотите добавить в существующий файл, используют его как это

cat [FILE1] [FILE2]... >> file 
9
27.01.2020, 20:32
  • 1
    Это, однако, не показывает, как считать имена файлов из списка и подать заявку cat им. –  Kusalananda♦ 11.04.2018, 20:18

Если имена файлов Y перечислены в a list файл, простая комбинация xargs и cat достаточно:

xargs cat <list >>concatenation_of_files

В случае Вы были осторожны, и Вы перечислили файлы один на строку (для предотвращения проблем с пробелами в именах файлов), затем просто добавьте a -d опция разделителя:

xargs -d'\n' cat <list >>concatenation_of_files

(Это принимает concatenation_of_files является первоначально несуществующим или пустым).

7
27.01.2020, 20:32
  • 1
    использования! Очевидный, но не видел его. –  forcefsck 17.02.2012, 23:48
  • 2
    Можно использовать >outputfile усекать выходной файл. Это в порядке, поскольку это - вывод от xargs это перенаправляется, не от человека cat вызовы. –  Kusalananda♦ 11.04.2018, 20:15

В ответах используется bash.

Допустим, вы хотите объединить файлы json в вашем каталоге:

cat *json > all.json

Включая подкаталоги:

shopt -s globstar
cat **/*json > all.json

Однако, если у вас есть файлы от тысяч до миллионов, вы столкнетесь с:

bash: /bin/cat: Argument list too long

В этом случае выполните следующее, что также выводит текущий обрабатываемый файл:

shopt -s globstar
rm concat.json
find. -path "**/*.json" | while read -r file; do
    echo -ne "\\r$file"
    cat "$file" >> concat.json
done

Опубликовано по этому вопросу, так как этот другой вопрос стал закрытым .

1
27.01.2020, 20:32

( Я знаю, что это ДЕЙСТВИТЕЛЬНО поздно и на самом деле не ответ, а предложение, если вы делаете это.)

Не используйте то же расширение файла, что и файлы, которые вы объединяете.

cat *.json > all.json.txt

Тогда вернись и...

mv all.json.txt all.json

На самом деле не уверен, что это решит проблему в вопросе, но это позволит избежать проблемы с циклом.

0
30.11.2021, 13:41

Теги

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