16

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

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

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

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

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

5 ответов5

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 fail Inеверный ioctl для устройства»! Вы можете попробовать это, и если у вас возникнут какие-либо проблемы, просто оставьте комментарий, чтобы сэкономить чужое время!

9

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

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

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

tty -s && mesg n

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

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

6

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

mesg n || true

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

test -t 0 && mesg n

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

config.ssh.shell="bash"

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

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), и проблема исчезла. (это также устранило некоторые другие причудливые вещи, которые также проникли в его работу)

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .