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ć?


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!


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


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.)


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.


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.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.