Отладка preseed / late_command для сервера ubuntu 16.04: не найден или отсутствует каталог

Я пытаюсь запустить следующий preseed-файл на компьютере с сервером ubuntu 16.04 (во время сборки упаковщика):

d-i preseed/late_command string \
in-target mkdir -v -p -m 0440 "/etc/sudoers.d"; \
in-target echo "%vagrant ALL=(ALL) NOPASSWD: ALL" | tee -a /etc/sudoers.d/vagrant; \
in-target echo "Defaults:vagrant !requiretty" | tee -a /etc/sudoers.d/vagrant; \
in-target chmod 440 /etc/sudoers.d/vagrant;

В / var / log / installer / syslog я вижу следующую ошибку:

log-output: sh:
log-output: tee: not found

Когда я заменяю часть «| tee -a» на «>>», вот так:

d-i preseed/late_command string \
in-target mkdir -v -p -m 0440 "/etc/sudoers.d"; \
in-target echo "%vagrant ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/vagrant; \
in-target echo "Defaults:vagrant !requiretty" >> /etc/sudoers.d/vagrant; \
in-target chmod 440 /etc/sudoers.d/vagrant;

Он неожиданно начинает жаловаться, что не может найти каталог, ничего не сказав о строке mkdir - так что она не создает каталог и не находит его:

log-output: sh: can't create /etc/sudoers.d/vagrant: nonexistent directory
log-output: sh: can't create /etc/sudoers.d/vagrant: nonexistent directory
log-output: chmod:
log-output: cannot access '/etc/sudoers.d/vagrant'
log-output: : No such file or directory

Я изучал другие скрипты на github. Также я добавил следующую строку в файл preseed.cfg:

d-i pkgsel/include string openssh-server coreutils wget sudo

Я даже пытался установить coreutils в качестве команды in-target, чтобы убедиться, что tee должен быть доступен. Обдумайте это в течение нескольких дней, время от времени перестраивая Ubuntu, только чтобы найти те же ошибки в системном журнале. Если бы кто-то мог пролить свет на это - это должно быть что-то простое, но я этого не вижу ...

2
задан 25 May 2016 в 11:41

5 ответов

Можно использовать Повсеместность вместо Debian-установщика (https://wiki.ubuntu.com/Installer/FAQ), таким образом, команда была бы:

ubiquity  ubiquity/success_command string \
 in-target /bin/mkdir -v -p -m 0440 "/target/etc/sudoers.d"; \
 in-target /bin/echo "%vagrant ALL=(ALL) NOPASSWD: ALL" >> /target/etc/sudoers.d/vagrant; \
 in-target /bin/echo "Defaults:vagrant !requiretty" >> /target/etc/sudoers.d/vagrant; \
 in-target /bin/chmod 440 /target/etc/sudoers.d/vagrant

Это не решает "такой файл или каталог" сообщаемый, указывая на правильное место:/target/etc/

1
ответ дан 2 December 2019 в 03:47

Если Вы предпочитаете использовать debian установщик, это работало на меня на 17.10.1 серверах при добавлении ssh открытого ключа к authorized_keys. Необходимо удостовериться, что .ssh каталог создается заранее.

d-i preseed/late_command string in-target /bin/sh -c 'echo "my string" >> /home/username/.ssh/authorized_keys';

Я провел приблизительно день, отлаживая это и попробовал следующее различными результатами. Было бы хорошо, если бы была более подробная документация, на которой оболочка используется в debian установщике для различного не / директивы 'в цели', но я, вероятно, не смотрю в правильном месте.

  1. плоскость в цели повторяет с плоскостью authorized_keys путь:

    in-target echo "my string" >> /home/username/.ssh/authorized_keys;
    

    дает "каталог, не найденный" в /var/log/installer/syslog

  2. плоскость в цели повторяет с целью authorized_keys путь:

    in-target echo "my string" >> /target/home/username/.ssh/authorized_keys;
    

    производит пробел authorized_keys файл на целевой машине и при просмотре /var/log/installer/syslog Вы находите, что "моя строка" производится к stdout

  3. в цели с явным sh -c... и цель authorized_keys путь:

    in-target /bin/sh -c 'echo "my string" >> /target/home/username/.ssh/authorized_keys';
    

    производит "каталог, не найденный" ошибка в /var/log/installer/syslog

Надо надеяться, это экономит немного времени и отладки!

1
ответ дан 2 December 2019 в 03:47

Это, кажется, не работает для использования echo в in-target. Решить эту попытку следующее (попробованный в Ubuntu 18.04):

d-i preseed/late_command string \
    echo "some text" >> /target/path/to/file.ext ; \
    in-target [some-other-command-in-target]

Примечание:

  • Не использовать in-target перед строкой
  • Использовать /target перед реальным путем
  • В других командах можно главным образом использовать in-target перед строкой
0
ответ дан 2 December 2019 в 03:47

эхо будет работать из директивы в цели. Необходимо поместить его с обратными галочками ('). Например, я хотел обновить имя хоста своей машины из файла перед семенем:

имя хоста в цели echo "ubn"$(lshw | grep -m 1 serial | awk '{print tolower ($2)}')

Обратные галочки говорят оболочке выполнять это как одну команду.

0
ответ дан 2 December 2019 в 03:47

Две вещи:

  1. При выполнении in-target some_command > /some/path перенаправление НЕ произойдет внутри цели. Вам нужно будет сделать: in-target --pass-stdout some_command > /target/some/path

  2. Команда in-target перенаправит вывод команды в файл журнала. Таким образом, попытка перенаправить вывод из in-target по умолчанию не работает. Что вам нужно сделать, так это использовать аргумент --pass-stdout для in-target

in-target --pass-stdout echo "hello" > /target/root/hello.txt

. Это создаст файл /target/root/hello.txt с содержимым 'hello'

From : https://salsa.debian.org/installer-team/debian-installer-utils/-/blob/3e67bc7987eb4a9cdff5fe8d1084e612fe7bb48f/README

in-target: запускает указанную команду в /target и возвращает ее выход статус. Интерфейс пересылки debconf используется для создания вопросов debconf. запросить с помощью cdebconf в программе установки. Это особенно полезно для запуск таких вещей, как dpkg-reconfigure, debconf-apt-progress и tasksel. Утилита log-output используется для регистрации любого вывода; если in-target вызывается с опцией --pass-stdout, log-output будет учитывать ее.

4
ответ дан 10 June 2020 в 19:43

Другие вопросы по тегам:

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