Come risolvere `ttyname fallito: ioctl inappropriato per dispositivo` in Vagrant?


21

Quando si utilizza questo frammento (inline shell provisioner):

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

risulta in:

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

Sembra che anche altre persone abbiano riscontrato questo problema . Qualcuno sa come risolverlo?


Ho notato che anche questo messaggio è stato mostrato come errore, lo script è stato eseguito correttamente! Pochi giorni dopo ho visto una possibile soluzione e ho pubblicato una risposta qui . Quindi forse non ne hai bisogno, ma puoi provarlo e usarlo se funziona per te.
Ministro

@Minister Grazie. Risolve il problema. Potresti rimuovere la risposta da SO e pubblicarla su SuperUser? Stackoverflow riguarda la programmazione.
030

Sono contento che la soluzione funzioni anche per te! Grazie per la tua rapida conferma! Ho appena pubblicato una risposta qui, ma non sono sicuro se devo rimuovere la mia risposta da SO o un moderatore dovrebbe spostare la domanda da SO qui su SU? Sto bene se qualcuno con le autorizzazioni appropriate modifica / elimina la mia risposta lì, ma può aiutare qualcun altro, quindi per ora lo sto lasciando "così com'è", rendendomi conto che è una specie di duplicato (come sembra la domanda). ..
Ministro

Risposte:


10

Ho notato che anche questo messaggio è stato mostrato come errore (in colore ROSSO), lo script è stato eseguito correttamente! Pochi giorni dopo ho visto una possibile soluzione e ho pubblicato una risposta su SO . La "correzione" è:

# 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'"

Forse non ti serve, ma puoi provarlo e usarlo se funziona per te.

Come puoi vedere nella riga commentata sopra, il team di laravel ha impedito a "mesg: ttyname fallito ioctl inappropriato per dispositivo". Grazie per questo!

La maggior parte degli sviluppatori vorrebbe evitare errori / avvisi durante lo sviluppo, quindi sembra che la correzione (una possibile correzione) di cui avevamo bisogno.

Nota importante: questa soluzione non è stata testata troppo, ma la casella si avvia senza l'errore "mesg: ttyname fallito Itoctl inadeguato per il dispositivo"! Sei libero di provarlo e se riscontri problemi, lascia un commento per risparmiare tempo a qualcun altro!


1
Nota, questo sembra rompersi vagrant ssh -c '...'. Forse come argomenti forniti vengono ignorati.
Skeen,

Questo sembra nascondere questo errore per me, ma non funziona ancora
OZZIE

16

1) aprire /root/.profile

2) rimuovere la linea offensiva

3) sostituirlo con:

tty -s && mesg n

Buon linux e buon anno.

George Hart, LSU


5
Sospiro. Se solo la distro ubuntu (e altre?) Risolve questo problema nello standard /root/.profile... Anche se, man ttysu MacOS dice che "L'opzione -s è deprecata a favore del comando` `test -t 0 ''." , quindi una sostituzione migliore potrebbe esseretest -t 0 && mesg n
lindes

1
Per automatizzare questo, puoi usaresed -i -e 's/mesg n .*true/tty -s \&\& mesg n/g'
Gogowitsch,

11

Sembra che questo sia causato da un'interazione tra la configurazione di vagabondaggio predefinita di config.ssh.shellessere bash -l(che simula una shell di accesso, elaborando così file di configurazione relativi all'accesso come .profile) con una riga nel /root/.profilefile su almeno alcune distribuzioni di Linux (tra cui, ad esempio, quello nella casella vagabondo ubuntu / xenial64 ), che ha:

mesg n || true

Un'opzione migliore per questa riga in quel file sarebbe probabilmente quella di dirlo:

test -t 0 && mesg n

... e, dato che è difficile cambiare come singolo utente vagabondo, una soluzione più immediata è eliminare l' -lopzione dalla configurazione vagabondo, ad esempio con (entro Vagrantfile):

config.ssh.shell="bash"

(Avvertenza: è ipotizzabile che questo cambiamento possa avere effetti collaterali potenzialmente negativi. Sembrava funzionare benissimo per me, tuttavia, con alcuni fornitori di shell di base, ad esempio con apt-get updatee così via.)


Grazie molte per questo! Il mio punto di vista: Override /root/.profile github.com/felixhummel/saltstates/blob/debian9/warts/bash/…
felixhummel

1

Quali versioni di Vagrant e VirtualBox stai usando?

Ieri stavo affrontando questo problema quando ho usato Vagrant 1.8.5 con VirtualBox 5.1.4 (con Ubunty 16.04). Tuttavia, dopo l'aggiornamento a Vagrant 1.9.2 e VirtualBox 5.1.14 oggi, il problema è scomparso.

Si noti che, prima dell'aggiornamento, come menzionato anche da @Minister, lo script è stato eseguito senza problemi. Stava semplicemente trasmettendo quel messaggio "ttyname failed", che dava l'impressione che si fosse verificato un errore, quando lo script di provisioning era stato eseguito correttamente.


0

Ho avuto questo problema iniziare a verificarsi in un'installazione di Vagrant che stavo usando da anni e che avevo aggiornato di volta in volta. Ho aggiornato all'ultimo Vagrant (1.9.1 -> 2.0.3) e il problema è scomparso. (ha anche eliminato alcune altre cose bizzarre che si sono insinuate nel suo funzionamento)

Non sono sicuro che sia stata la nuova versione a correggerlo o che i file / le configurazioni esistenti siano stati aggiornati nel processo di aggiornamento o in una combinazione dei due.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.