Як вирішити `ttyname не вдалося: Невідповідний 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

Схоже, що інші люди також знайшли це питання . Хтось знає, як це вирішити?


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

@Minister Дякую Це вирішує питання. Чи можете ви видалити відповідь із SO та опублікувати її на SuperUser? Stackoverflow стосується програмування.
030

Я радий, що рішення також працює для вас! Дякуємо за ваше швидке підтвердження! Я щойно опублікував відповідь тут, але я не впевнений, чи потрібно мені видаляти свою відповідь із SO, або модератор повинен перенести питання з SO тут на SU? Я гаразд, якщо хтось із відповідними дозволами редагує / видаляє мою відповідь там, але це може допомогти комусь іншому, тому я покидаю це "як є", розуміючи, що це якийсь дублікат (як здається питання). ..
Міністр

Відповіді:


11

Я помітив, що навіть це повідомлення відображалось як помилка (у червоному кольорі), сценарій був успішно виконаний! Через кілька днів я побачив можливий виправлення, і я опублікував відповідь на ТАК . "Виправлення":

# 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 '...'. Можливо, оскільки надані аргументи ігноруються.
Skeen

16

1) відкрити /root/.profile

2) зняти наступальну лінію

3) замінити його на:

tty -s && mesg n

Щасливого linuxing та веселого нового року.

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


4
Зітхнути. Якби тільки стандартні дистрибутиви ubuntu (та інші?) Виправили це в стандарті /root/.profile... Хоча man ttyв MacOS кажуть, що "-s параметр застарілий на користь команди` `test -t 0 ''." , тож краща заміна може бутиtest -t 0 && mesg n
вказівки

1
Щоб автоматизувати це, ви можете використовуватиsed -i -e 's/mesg n .*true/tty -s \&\& mesg n/g'
Gogowitsch

9

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

mesg n || true

Кращим варіантом для цього рядка в цьому файлі, мабуть, буде те, щоб він сказав:

test -t 0 && mesg n

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

config.ssh.shell="bash"

(Caveat: Можна вважати, що ця зміна може мати потенційно негативні побічні ефекти. Мені здається, це чудово працює для мене, хоча з деякими основними захисниками оболонки, наприклад, з apt-get updateтощо).


Дуже дякую за це! Приймаю: Переосмисли
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.