Como resolver `ttyname falhou: ioctl inadequado para dispositivo` no Vagrant?

21

Ao usar este trecho (provisionador de shell embutido):

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

resulta em:

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

Parece que outras pessoas também encontraram esse problema . Alguém sabe como resolver isso?

030
fonte
Notei que mesmo esta mensagem foi mostrada como um erro, o script foi executado com sucesso! Alguns dias depois, vi uma possível correção e postei uma resposta aqui . Então, talvez você simplesmente não precise, mas você pode experimentá-lo e usá-lo se funcionar para você.
Ministro
@Minister Obrigado. Resolve o problema. Você pode remover a resposta do SO e publicá-la no SuperUser? Stackoverflow é sobre programação.
030
Estou feliz que a solução também funcione para você! Obrigado pela sua confirmação rápida! Acabei de postar uma resposta aqui, mas não tenho certeza se tenho que remover minha resposta da SO ou um moderador deve passar a pergunta da SO aqui para o SU? Eu estou bem se alguém com permissões apropriadas editar / excluir minha resposta lá, mas isso pode ajudar alguém, por isso estou deixando "como está" por enquanto, percebendo que é algum tipo de duplicata (como parece a pergunta). ..
Ministro

Respostas:

10

Notei que mesmo esta mensagem foi mostrada como um erro (na cor VERMELHA), o script foi executado com sucesso! Alguns dias depois, vi uma possível correção e postei uma resposta no SO . A "correção" é:

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

Talvez você simplesmente não precise, mas você pode tentar e usá-lo se funcionar para você.

Como você pode ver na linha de comentário acima - o "mesg: ttyname falhou ioctl inadequado para o dispositivo" foi impedido pela equipe do laravel. Obrigado por este!

A maioria dos desenvolvedores gostaria de evitar erros / avisos quando desenvolvemos, portanto parece a correção (uma possível correção) necessária.

Nota importante: Não testei muito esta solução, mas a caixa inicia sem o erro "mesg: ttyname falhou ioctl inadequado para dispositivo"! Você é livre para experimentá-lo e, se tiver algum problema, basta enviar um comentário para economizar o tempo de outra pessoa!

Ministro
fonte
11
Note, isso parece quebrar vagrant ssh -c '...'. Possivelmente como os argumentos fornecidos são ignorados.
Skeen
Este parece simplesmente esconder esse erro para mim, mas ele ainda não funciona
OZZIE
16

1) abra /root/.profile

2) remover a linha ofensiva

3) substitua-o por:

tty -s && mesg n

Feliz linux e um feliz ano novo.

George Hart, LSU

George Hart
fonte
5
Suspiro. Se apenas as distribuições do ubuntu (e outras?) Corrigissem isso no padrão /root/.profile... No entanto, man ttyno MacOS diz que "a opção -s está obsoleta em favor do comando` `test -t 0 ''". , assim que um substituto melhor seriatest -t 0 && mesg n
lindes
11
Para automatizar isso, você pode usarsed -i -e 's/mesg n .*true/tty -s \&\& mesg n/g'
Gogowitsch 18/03/19
11

Parece que isso é causado por uma interação entre a configuração vagrant padrão de config.ssh.shellto be bash -l(que simula um shell de login, processando arquivos de configuração relacionados ao login, como .profile) com uma linha no /root/.profilearquivo em pelo menos algumas distribuições do Linux (incluindo, por exemplo, aquele na caixa vagabundo ubuntu / xenial64 ), que possui:

mesg n || true

Uma opção melhor para esta linha nesse arquivo provavelmente seria dizer:

test -t 0 && mesg n

... e, considerando que é difícil mudar como usuário vagante individual, uma solução mais imediata é abandonar a -lopção da configuração vagante, por exemplo, com (dentro Vagrantfile):

config.ssh.shell="bash"

(Advertência: é possível que essa alteração possa ter efeitos colaterais potencialmente negativos. Pareceu funcionar muito bem para mim, porém, com alguns provisionadores de shell básicos, por exemplo apt-get update, com e assim por diante.)

lindes
fonte
Muito obrigado por isso! Minha opinião: Override /root/.profile github.com/felixhummel/saltstates/blob/debian9/warts/bash/...
felixhummel
1

Quais versões do Vagrant e do VirtualBox você está usando?

Ontem eu estava enfrentando esse problema ao usar o Vagrant 1.8.5 com o VirtualBox 5.1.4 (com o Ubunty 16.04). No entanto, depois de atualizar para o Vagrant 1.9.2 e o VirtualBox 5.1.14 hoje, o problema foi resolvido.

Observe que, antes da atualização, como o @Minister também mencionou, o script foi executado sem problemas. Acabei de emitir a mensagem "ttyname falhou", que deu a impressão de que ocorreu um erro quando, na verdade, o script de provisionamento foi executado com êxito.

kvjava1
fonte
0

Esse problema começou a acontecer em uma instalação do Vagrant que eu usava há anos e que fazia atualizações de tempos em tempos também. Atualizei para o Vagrant mais recente (1.9.1 -> 2.0.3) e o problema foi resolvido. (também eliminou outras coisas peculiares que haviam entrado em operação)

Não tenho certeza se foi a nova versão que a corrigiu ou se os arquivos / configurações existentes foram atualizados no processo de atualização ou em uma combinação dos dois.

G-Man
fonte
0

Parece que só funciona no VirtualBox v6.0.2 para Mojave / Catalina! (+ vagrant 2.2.2 - embora não tenha certeza!)

EDITAR:

Isso foi corrigido para mim agora no seu Mac host:

vagrant halt
sudo ifconfig vboxnet0 down
sudo ifconfig vboxnet0 up
vagrant up

https://github.com/hashicorp/vagrant/issues/1941#issuecomment-42274573

OZZIE
fonte