
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:
Al realizar
in-target some_command > /some/path
la redirección NO ocurrirá dentro del objetivo. Tendrías que hacer:in-target --pass-stdout some_command > /target/some/path
El
in-target
comando redirigirá la salida del comando al archivo de registro. Por lo tanto, intentar redirigir la salidain-target
no funciona de forma predeterminada. Lo que debes hacer es usar el--pass-stdout
argumento para apuntar
in-target --pass-stdout echo "hello" > /target/root/hello.txt
Esto creará un archivo /target/root/hello.txt con el contenido 'hola'
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 echo
en 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-target
antes de la línea. - Usar
/target
antes del camino real. - En otros comandos puedes usarlos principalmente
in-target
antes 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.
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
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/syslog
encontrará que "mi cadena" se envía astdout
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.