Depuración de preseed/late_command para el servidor ubuntu 16.04: camiseta no encontrada vs directorio inexistente

Depuración de preseed/late_command para el servidor ubuntu 16.04: camiseta no encontrada vs directorio inexistente

Estoy intentando ejecutar el siguiente archivo preconfigurado en una máquina servidor ubuntu 16.04 (durante la compilación del empaquetador):

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;

En /var/log/installer/syslog puedo ver el siguiente error:

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

Cuando cambio la parte "| tee -a" a ">>" así:

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;

De repente comienza a quejarse de que no puede encontrar el directorio, sin decir nada sobre la línea mkdir, por lo que no crea el directorio ni lo encuentra:

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

He estado investigando otros scripts en github. También agregué la siguiente línea al archivo preseed.cfg:

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

Incluso intenté instalar coreutils como comando en el destino, para asegurarme de que tee debería estar disponible. He estado en esto durante unos días, reconstruyendo ubuntu una y otra vez, solo para encontrar los mismos errores en el syslog. Si alguien pudiera arrojar algo de luz sobre esto, debe ser algo simple, pero no lo veo...

Respuesta1

Dos cosas:

  1. Al realizar in-target some_command > /some/pathla redirección NO ocurrirá dentro del objetivo. Tendrías que hacer:in-target --pass-stdout some_command > /target/some/path

  2. El in-targetcomando redirigirá la salida del comando al archivo de registro. Por lo tanto, intentar redirigir la salida in-targetno funciona de forma predeterminada. Lo que debes hacer es usar el --pass-stdoutargumento para apuntar

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

Esto creará un archivo /target/root/hello.txt con el contenido 'hola'

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

in-target: ejecuta el comando especificado en /target y devuelve su estado de salida. La interfaz de paso a través de debconf se utiliza para hacer preguntas sobre debconf usando cdebconf en el instalador. Esto es especialmente útil para ejecutar cosas como dpkg-reconfigure, debconf-apt-progress y taskel. La utilidad log-output se utiliza para registrar cualquier salida; si se llama a in-target con la opción --pass-stdout, log-output lo respetará.

Respuesta2

No parece funcionar para usarlo echoen in-target. Para resolver esto, intente lo siguiente (probado en Ubuntu 18.04):

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

NOTA:

  • No usar in-targetantes de la línea.
  • Usar /targetantes del camino real.
  • En otros comandos puedes usarlos principalmente in-targetantes de la línea.

Respuesta3

Si prefiere utilizar el instalador de Debian, esto funcionó para mí en el servidor 17.10.1 al agregar una clave pública ssh a Authorized_keys. Debe asegurarse de que el directorio .ssh esté creado de antemano.

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

Pasé aproximadamente un día depurando esto e intenté lo siguiente con varios resultados. Sería bueno si hubiera documentación más detallada sobre qué shell se usa en el instalador de Debian para las diversas directivas que no están en el objetivo, pero probablemente no estoy buscando en el lugar correcto.

  1. eco simple en el objetivo con ruta simple de claves_autorizadas:

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

    da "directorio no encontrado" en/var/log/installer/syslog

  2. eco simple en el objetivo con la ruta de claves_autorizadas del objetivo:

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

    produce un archivo de claves_autorizadas en blanco en la máquina de destino y, al visualizarlo, /var/log/installer/syslogencontrará que "mi cadena" se envía astdout

  3. en el objetivo con sh -c...la ruta de claves_autorizadas explícita y de destino:

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

    produce un error de "directorio no encontrado" en/var/log/installer/syslog

¡Esperamos que esto ahorre un poco de tiempo y depuración!

Respuesta4

echo funcionará desde dentro de una directiva en el objetivo. Tienes que ponerlo con comillas invertidas (`). Por ejemplo, quería actualizar el nombre de host de mi máquina desde el archivo preestablecido:

nombre de host en el destinoecho "ubn"$(lshw | grep -m 1 serial | awk '{print tolower ($2)}')

Las comillas invertidas le indican al shell que ejecute esto como un solo comando.

información relacionada