Я пытаюсь запустить следующий 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, только чтобы найти те же ошибки в системном журнале. Если бы кто-то мог пролить свет на это - это должно быть что-то простое, но я этого не вижу ...
Можно использовать Повсеместность вместо 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/
Если Вы предпочитаете использовать 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 установщике для различного не / директивы 'в цели', но я, вероятно, не смотрю в правильном месте.
плоскость в цели повторяет с плоскостью authorized_keys путь:
in-target echo "my string" >> /home/username/.ssh/authorized_keys;
дает "каталог, не найденный" в /var/log/installer/syslog
плоскость в цели повторяет с целью authorized_keys путь:
in-target echo "my string" >> /target/home/username/.ssh/authorized_keys;
производит пробел authorized_keys файл на целевой машине и при просмотре /var/log/installer/syslog
Вы находите, что "моя строка" производится к stdout
в цели с явным sh -c...
и цель authorized_keys путь:
in-target /bin/sh -c 'echo "my string" >> /target/home/username/.ssh/authorized_keys';
производит "каталог, не найденный" ошибка в /var/log/installer/syslog
Надо надеяться, это экономит немного времени и отладки!
Это, кажется, не работает для использования 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
перед строкойэхо будет работать из директивы в цели. Необходимо поместить его с обратными галочками ('). Например, я хотел обновить имя хоста своей машины из файла перед семенем:
имя хоста в цели echo "ubn"$(lshw | grep -m 1 serial | awk '{print tolower ($2)}')
Обратные галочки говорят оболочке выполнять это как одну команду.
Две вещи:
При выполнении in-target some_command > /some/path
перенаправление НЕ произойдет внутри цели. Вам нужно будет сделать: in-target --pass-stdout some_command > /target/some/path
Команда in-target
перенаправит вывод команды в файл журнала. Таким образом, попытка перенаправить вывод из in-target
по умолчанию не работает. Что вам нужно сделать, так это использовать аргумент --pass-stdout
для in-target
in-target --pass-stdout echo "hello" > /target/root/hello.txt
. Это создаст файл /target/root/hello.txt с содержимым 'hello'
in-target: запускает указанную команду в /target и возвращает ее выход статус. Интерфейс пересылки debconf используется для создания вопросов debconf. запросить с помощью cdebconf в программе установки. Это особенно полезно для запуск таких вещей, как dpkg-reconfigure, debconf-apt-progress и tasksel. Утилита log-output используется для регистрации любого вывода; если in-target вызывается с опцией --pass-stdout, log-output будет учитывать ее.