Как решить `ttyname failed: Не подходит ioctl для устройства` в Vagrant?


21

При использовании этого фрагмента (встроенный поставщик оболочки):

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

это приводит к:

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

Похоже, что другие люди тоже нашли эту проблему . Кто-нибудь знает, как это решить?


Я заметил, что даже это сообщение было показано как ошибка, скрипт был успешно выполнен! Через несколько дней я увидел возможное исправление и разместил здесь ответ . Так что, может быть, вам это просто не нужно, но вы можете попробовать его и использовать, если оно работает для вас.
Министр

@ Министр Спасибо. Это решает проблему. Не могли бы вы удалить ответ из SO и опубликовать его на SuperUser? Stackoverflow - это программирование.
030

Я рад, что решение также работает для вас! Спасибо за ваше быстрое подтверждение! Я только что опубликовал ответ здесь, но я не уверен, должен ли я удалить свой ответ от SO, или модератор должен перенести вопрос из SO сюда на SU? Я в порядке, если кто-то с соответствующими разрешениями редактирует / удаляет мой ответ там, но он может помочь кому-то другому, поэтому я оставляю его «как есть», понимая, что это своего рода дубликат (как кажется на вопрос). ..
министр

Ответы:


11

Я заметил, что даже это сообщение было показано как ошибка (в красном цвете), сценарий был успешно выполнен! Несколько дней спустя я увидел возможное исправление и опубликовал ответ на SO . «Исправить» это:

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

Может быть, вам это просто не нужно, но вы можете попробовать его и использовать, если оно работает на вас.

Как вы можете видеть в приведенной выше строке комментариев - команда laravel предотвратила ошибку «mesg: ttyname failed». Неуместное ioctl для устройства ». Спасибо за это!

Большинство разработчиков хотели бы избежать ошибок / предупреждений, когда мы занимаемся разработкой, поэтому кажется, что исправление (возможное исправление) нам нужно.

Важное примечание: я не слишком много тестировал это решение, но окно запускается без ошибки «mesg: ttyname failed« Неуместное ioctl для устройства »! Вы можете попробовать это, и если у вас возникнут какие-либо проблемы, просто оставьте комментарий, чтобы сэкономить чужое время!


1
Обратите внимание, это кажется сломанным vagrant ssh -c '...'. Возможно, поскольку предоставленные аргументы игнорируются.
Скин

16

1) открыть /root/.profile

2) убрать наступательную линию

3) заменить его на:

tty -s && mesg n

Счастливого линукса и веселого нового года.

Джордж Харт, ЛГУ


4
Вздох. Если бы только дистрибутив (ы) ubuntu (и другие?) Исправили бы это в стандарте /root/.profile... Хотя man ttyв MacOS говорится, что «опция -s устарела в пользу команды` `test -t 0 ''". " так что лучшая замена может бытьtest -t 0 && mesg n
lindes

1
Чтобы автоматизировать это, вы можете использоватьsed -i -e 's/mesg n .*true/tty -s \&\& mesg n/g'
Gogowitsch

9

Похоже , что это вызвано взаимодействием по умолчанию конфигурации бродячего от config.ssh.shellбыть bash -l(который имитирует оболочку входа в систему , таким образом , обработка входа , связанные файлы конфигурации , такие как .profile) с линии в /root/.profileфайле , по крайней мере , некоторых дистрибутивах Linux ( в том числе, например, тот, что находится в vaugrant-окне ubuntu / xenial64 ), который имеет:

mesg n || true

Лучшим вариантом для этой строки в этом файле, вероятно, будет следующее:

test -t 0 && mesg n

... и, учитывая, что это трудно изменить как отдельного бродячего пользователя, более немедленное решение - исключить -lопцию из бродячей конфигурации, например, с помощью (в пределах Vagrantfile):

config.ssh.shell="bash"

(Предостережение: вполне возможно, что это изменение может иметь потенциально негативные побочные эффекты. Однако мне показалось, что оно отлично работает с некоторыми базовыми поставщиками оболочек, например, с apt-get updateи т. Д.)


Большое спасибо за это! Мое мнение: переопределить /root/.profile github.com/felixhummel/saltstates/blob/debian9/warts/bash/…
felixhummel

1

Какие версии Vagrant и VirtualBox вы используете?

Я столкнулся с этой проблемой вчера, когда использовал Vagrant 1.8.5 с VirtualBox 5.1.4 (с Ubunty 16.04). Однако после того, как я сегодня обновился до Vagrant 1.9.2 и VirtualBox 5.1.14, проблема исчезла.

Обратите внимание, что до обновления, как также упоминалось @Minister, скрипт выполнялся без проблем. Он просто выводил это сообщение «ttyname failed», что создавало впечатление, что произошла ошибка, когда фактически выполнялся сценарий инициализации.


0

У меня эта проблема начала возникать в установке Vagrant, которую я использовал годами, а также время от времени обновлялся. Я обновился до последней версии Vagrant (1.9.1 -> 2.0.3), и проблема исчезла. (это также устранило некоторые другие причудливые вещи, которые вошли в его работу)

Не уверен, что это была новая версия, которая это исправила, или что существующие файлы / конфигурации были обновлены в процессе обновления или их комбинации.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.