Jak rozwiązać `ttyname nie powiodło się: niewłaściwy ioctl dla urządzenia` w Vagrant?

21

Podczas korzystania z tego fragmentu kodu (wbudowanego dostawcy powłoki):

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

skutkuje:

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

Wygląda na to, że inni też znaleźli ten problem . Czy ktoś wie jak to rozwiązać?

030
źródło
Zauważyłem, że nawet ten komunikat był wyświetlany jako błąd, skrypt został wykonany pomyślnie! Kilka dni później zobaczyłem możliwą poprawkę i opublikowałem tutaj odpowiedź . Więc może po prostu go nie potrzebujesz, ale możesz go wypróbować i użyć, jeśli to działa.
Minister
@Minister Dziękuję. To rozwiązuje problem. Czy możesz usunąć odpowiedź z SO i opublikować ją na SuperUser? Stackoverflow polega na programowaniu.
030
Cieszę się, że rozwiązanie działa również dla Ciebie! Dziękujemy za szybkie potwierdzenie! Właśnie opublikowałem odpowiedź tutaj, ale nie jestem pewien, czy muszę usunąć moją odpowiedź z SO, czy moderator powinien przenieść pytanie z SO tutaj na SU? Nie mam nic przeciwko, jeśli ktoś z odpowiednimi uprawnieniami edytuje / usuwa moją odpowiedź, ale może to pomóc komuś innemu, więc zostawiam na razie „takie, jakie są”, zdając sobie sprawę, że jest to jakaś kopia (jak się wydaje pytanie). ..
Minister

Odpowiedzi:

10

Zauważyłem, że nawet ten komunikat był wyświetlany jako błąd (w kolorze CZERWONYM), skrypt został wykonany pomyślnie! Kilka dni później zobaczyłem możliwą poprawkę i opublikowałem odpowiedź na SO . „Poprawka” to:

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

Być może po prostu go nie potrzebujesz, ale możesz go wypróbować i użyć, jeśli to działa.

Jak widać w komentowanym wierszu powyżej - zespół laravel uniemożliwił "mesg: ttyname failed Nieprawidłowy ioctl dla urządzenia" Dzięki za to!

Większość programistów chce unikać błędów / ostrzeżeń podczas programowania, więc wydaje się, że potrzebna jest poprawka (możliwa poprawka).

Ważna uwaga: Nie testowałem tego rozwiązania zbyt wiele, ale okno zaczyna się bez błędu „mesg: ttyname nie powiodło się Niewłaściwe ioctl dla urządzenia”! Możesz go wypróbować, a jeśli wystąpią jakiekolwiek problemy, po prostu zostaw komentarz, aby zaoszczędzić czas innej osoby!

Minister
źródło
1
Uwaga: wydaje się, że się psuje vagrant ssh -c '...'. Możliwe, że podane argumenty są ignorowane.
Skeen
To wydaje mi się po prostu ukrywać ten błąd, ale nadal nie działa
OZZIE
16

1) otwórz /root/.profile

2) usuń linię ofensywną

3) zamień na:

tty -s && mesg n

Szczęśliwego linuksa i wesołego nowego roku.

George Hart, LSU

George Hart
źródło
5
Westchnienie. Gdyby tylko dystrybucja ubuntu (i inne?) Naprawiła to w standardzie /root/.profile... Chociaż man ttyna MacOS mówi, że „Opcja -s jest przestarzała na rzecz polecenia` `test -t 0 ''. , więc lepszym rozwiązaniem może byćtest -t 0 && mesg n
Lindes
1
Aby to zautomatyzować, możesz użyćsed -i -e 's/mesg n .*true/tty -s \&\& mesg n/g'
Gogowitsch
11

Wygląda na to, jest to spowodowane interakcji między domyślnym Vagrant konfiguracji z config.ssh.shellsię bash -l(który symuluje powłokę logowania, dzięki czemu przetwarzanie logowania związane z plików konfiguracyjnych, takich jak .profile) z linii w /root/.profilepliku na przynajmniej niektórych dystrybucjach systemu Linux (w tym, np. ten w vagrant box ubuntu / xenial64 ), który ma:

mesg n || true

Lepszą opcją dla tego wiersza w tym pliku byłoby prawdopodobnie powiedzenie:

test -t 0 && mesg n

... a biorąc pod uwagę, że trudno to zmienić jako indywidualny włóczęgujący użytkownik, bardziej natychmiastowym rozwiązaniem jest usunięcie -lopcji z błędnej konfiguracji, np. za pomocą (wewnątrz Vagrantfile):

config.ssh.shell="bash"

(Zastrzeżenie: Można sobie wyobrazić, że ta zmiana mogłaby mieć potencjalnie negatywne skutki uboczne. Wydawało się jednak, że działa świetnie dla mnie z niektórymi podstawowymi dostawcami powłok, np. Z apt-get update, i tak dalej.)

Lindes
źródło
Bardzo ci za to dziękuję! Moje zdanie: Zastąp /root/.profile github.com/felixhummel/saltstates/blob/debian9/warts/bash/…
felixhummel
1

Jakich wersji Vagrant i VirtualBox używasz?

Wczoraj napotkałem ten problem podczas korzystania z Vagrant 1.8.5 z VirtualBox 5.1.4 (z Ubunty 16.04). Jednak po aktualizacji do Vagrant 1.9.2 i VirtualBox 5.1.14 problem zniknął.

Należy pamiętać, że przed aktualizacją, jak wspomniano również @Minister, skrypt został wykonany bez problemu. Właśnie wyświetlał komunikat „ttyname failed”, co sprawiało wrażenie, że wystąpił błąd, gdy faktycznie skrypt obsługi administracyjnej został pomyślnie wykonany.

kvjava1
źródło
0

Ten problem zaczął się pojawiać w instalacji Vagrant, z której korzystałem od lat i którą od czasu do czasu aktualizowałem. Uaktualniłem do najnowszej wersji Vagrant (1.9.1 -> 2.0.3) i problem zniknął. (wyeliminował również kilka innych dziwacznych rzeczy, które wkradły się do jego działania)

Nie jestem pewien, czy to nowa wersja go naprawiła, czy istniejące pliki / konfiguracje zostały odświeżone w procesie aktualizacji, czy też kombinacja tych dwóch.

G-Man
źródło
0

Wygląda na to, że działa tylko w VirtualBox v6.0.2 dla Mojave / Catalina! (+ włóczęga 2.2.2 - nie jestem pewien, czy to ma znaczenie!)

EDYTOWAĆ:

Naprawiłem to teraz na komputerze Mac:

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

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

OZZIE
źródło