¿Cómo resolver `ttyname falló: ioctl inapropiado para dispositivo` en Vagrant?

21

Al usar este fragmento (aprovisionador de shell en línea):

config.vm.provision "shell" do |s|
  s.inline = <<-SHELL
    <shell code>
  SHELL
end

en resultado de:

==> default: mesg: 
==> default: ttyname failed
==> default: : 
==> default: Inappropriate ioctl for device

Parece que otras personas también han encontrado este problema . ¿Alguien sabe cómo resolverlo?

030
fuente
Noté que incluso este mensaje se mostró como un error, ¡el script se ejecutó con éxito! Unos días después vi una posible solución y publiqué una respuesta aquí . Entonces, tal vez simplemente no lo necesite, pero puede probarlo y usarlo si funciona para usted.
Ministro
@ Ministro Gracias. Soluciona el problema. ¿Podría eliminar la respuesta de SO y publicarla en SuperUser? Stackoverflow es sobre programación.
030
¡Me alegra que la solución también funcione para ti! ¡Gracias por su rápida confirmación! Acabo de publicar una respuesta aquí, pero no estoy seguro de si tengo que eliminar mi respuesta de SO o si un moderador debe mover la pregunta de SO aquí en SU. Estoy bien si alguien con los permisos apropiados edita / borra mi respuesta allí, pero puede ayudar a alguien más, así que lo dejo "tal cual" por ahora, dándome cuenta de que es una especie de duplicado (como parece la pregunta). ..
Ministro

Respuestas:

10

Noté que incluso este mensaje se mostró como un error (en color ROJO), ¡el script se ejecutó con éxito! Unos días después vi una posible solución y publiqué una respuesta en SO . La "solución" es:

# Prevent TTY Errors (copied from laravel/homestead: "homestead.rb" file)... By default this is "bash -l".
config.ssh.shell = "bash -c 'BASH_ENV=/etc/profile exec bash'"

Tal vez simplemente no lo necesite, pero puede probarlo y usarlo si funciona para usted.

Como puede ver en la línea comentada arriba, el equipo de laravel ha impedido que "mesg: ttyname falló ioctl inapropiado para el dispositivo". Gracias por este!

A la mayoría de los desarrolladores les gustaría evitar errores / advertencias cuando hacemos desarrollo, por lo que parece ser la solución (una posible solución) que necesitábamos.

Nota importante: No he probado esta solución demasiado, pero el cuadro comienza sin el error "mesg: ttyname falló Inactivo apropiado para el dispositivo". Puede probarlo y, si tiene algún problema, ¡simplemente deje un comentario para ahorrarle tiempo a otra persona!

Ministro
fuente
1
Tenga en cuenta que esto parece romperse vagrant ssh -c '...'. Posiblemente como los argumentos proporcionados son ignorados.
Skeen
Esto parece ocultar este error, pero todavía no funciona
OZZIE
16

1) abrir /root/.profile

2) eliminar la línea ofensiva

3) reemplácelo con:

tty -s && mesg n

Feliz linuxing y feliz año nuevo.

George Hart, LSU

George Hart
fuente
55
Suspiro. Si solo la (s) distribución (es) ubuntu (¿y otra?) Solucionara esto en el estándar /root/.profile... Sin embargo, man ttyen MacOS dice que "La opción -s está en desuso a favor del comando` `test -t 0 ''". , por lo que podría ser un mejor reemplazotest -t 0 && mesg n
lindes
1
Para automatizar esto, puede usarsed -i -e 's/mesg n .*true/tty -s \&\& mesg n/g'
Gogowitsch
11

Parece que esto es causado por una interacción entre la configuración vagabunda predeterminada de config.ssh.shellto be bash -l(que simula un shell de inicio de sesión, procesando así los archivos de configuración relacionados con el inicio de sesión como .profile) con una línea en el /root/.profilearchivo en al menos algunas distribuciones de Linux (que incluyen, por ejemplo, el que está en el cuadro ubuntu / xenial64 vagabundo ), que tiene:

mesg n || true

Una mejor opción para esta línea en ese archivo probablemente sería que diga:

test -t 0 && mesg n

... y, dado que es difícil de cambiar como un usuario vagabundo individual, una solución más inmediata es eliminar la -lopción de la configuración vagabunda, por ejemplo con (dentro Vagrantfile):

config.ssh.shell="bash"

(Advertencia: es concebible que este cambio pueda tener efectos secundarios potencialmente negativos. Sin embargo, pareció funcionar muy bien para mí con algunos proveedores básicos de shell, por ejemplo apt-get update, con , etc.)

lindes
fuente
¡Muchas gracias por esto! Mi opinión: Override /root/.profile github.com/felixhummel/saltstates/blob/debian9/warts/bash/…
felixhummel
1

¿Qué versiones de Vagrant y VirtualBox estás usando?

Ayer me enfrenté a este problema cuando usaba Vagrant 1.8.5 con VirtualBox 5.1.4 (con Ubunty 16.04). Sin embargo, después de que actualicé a Vagrant 1.9.2 y VirtualBox 5.1.14 hoy, el problema desapareció.

Tenga en cuenta que, antes de actualizar, como también mencionó @Minister, el script se ejecutó sin problemas. Simplemente estaba emitiendo el mensaje "ttyname falló", que daba la impresión de que se produjo un error, cuando en realidad el script de aprovisionamiento se ejecutó con éxito.

kvjava1
fuente
0

Este problema comenzó a suceder en una instalación de Vagrant que había estado usando durante años y que también había actualizado de vez en cuando. Actualicé al último Vagrant (1.9.1 -> 2.0.3) y el problema desapareció. (también eliminó algunas otras cosas extravagantes que también se habían infiltrado en su funcionamiento)

No estoy seguro de si fue la nueva versión la que lo arregló o si los archivos / configuraciones existentes se actualizaron en el proceso de actualización o una combinación de ambos.

G-Man
fuente