How to solve `ttyname failed: Inappropriate ioctl for device` in Vagrant?

21

6

When using this snippet (inline shell provisioner):

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

it results in:

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

It looks like that other people have found this issue as well. Does anybody know how to solve it?

030

Posted 2016-12-25T09:43:18.867

Reputation: 1 924

I noticed that even this message was shown as an error, the script was executed successfully! A few days later I saw a possible fix and I posted an answer here. So maybe you just don't need it, but you can try it and use it if it works for you.

– Minister – 2017-02-22T16:37:13.983

@Minister Thank you. It solves the issue. Could you remove the answer from SO and post it on SuperUser? Stackoverflow is about programming. – 030 – 2017-02-23T15:55:20.910

I'm glad the solution also works for you! Thank you for your quick confirmation! I've just posted an answer here, but I'm not sure whether I have to remove my answer from SO or a moderator should move the question from SO here on SU? I'm OK if someone with appropriate permissions edit/delete my answer there, but it may help someone else, so I'm leaving it "as is" for now, realizing it's some kind a duplicate (as the question seems like)... – Minister – 2017-02-23T19:35:32.670

Answers

10

I noticed that even this message was shown as an error (in RED colour), the script was executed successfully! A few days later I saw a possible fix and I posted an answer on SO. The "fix" is:

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

Maybe you just don't need it, but you can try it and use it if it works for you.

As you can see in the commented line above - the "mesg: ttyname failed Inappropriate ioctl for device" has been prevented from the laravel team. Thanks for this one!

Most developers would like to avoid errors/warnings when we do development, so it seems like the fix (a possible fix) we needed.

Important note: I haven't tested this solution too much, but the box starts without the "mesg: ttyname failed Inappropriate ioctl for device" error! You are free to try it and if you experience any problems, just drop a comment to save somebody else's time!

Minister

Posted 2016-12-25T09:43:18.867

Reputation: 232

1Note, this seems to break vagrant ssh -c '...'. Possibly as arguments provided are ignored. – Skeen – 2017-09-19T14:33:02.777

This seems to just hide this error for me but it still doesn't work – OZZIE – 2019-10-08T06:54:55.447

17

1) open /root/.profile

2) remove the offensive line

3) replace it with:

tty -s && mesg n

Happy linuxing and a merry new year.

George Hart, LSU

George Hart

Posted 2016-12-25T09:43:18.867

Reputation: 187

5Sigh. If only the ubuntu (and other?) distro(s) would fix this in the standard /root/.profile ... Though, man tty on MacOS says that "The -s option is deprecated in favor of the ``test -t 0'' command.", so a better replacement might be test -t 0 && mesg n – lindes – 2017-12-16T04:39:35.150

1To automate this, you can use sed -i -e 's/mesg n .*true/tty -s \&\& mesg n/g' – Gogowitsch – 2019-03-18T08:37:59.307

12

It looks like this is caused by an interaction between the default vagrant configuration of config.ssh.shell to be bash -l (which simulates a login shell, thus processing login-related configuration files such as .profile) with a line in the /root/.profile file on at least some distributions of Linux (including, e.g., the one in the ubuntu/xenial64 vagrant box), which has:

mesg n || true

A better option for this line in that file would probably be to have it say:

test -t 0 && mesg n

... and, given that that's hard to change as an individual vagrant user, a more immediate solution is to drop the -l option from the vagrant configuration, e.g. with (within Vagrantfile):

config.ssh.shell="bash"

(Caveat: It's conceivable that this change could have potentially-negative side effects. It seemed to work great for me, though, with some basic shell provisioners, e.g. with apt-get update, and so forth.)

lindes

Posted 2016-12-25T09:43:18.867

Reputation: 370

Thank you very much for this!

My take: Override /root/.profile

https://github.com/felixhummel/saltstates/blob/debian9/warts/bash/root_profile#L11

– felixhummel – 2018-03-10T02:04:09.383

1

What versions of Vagrant and VirtualBox are you using?

I was facing this issue yesterday when using Vagrant 1.8.5 with VirtualBox 5.1.4 (with Ubunty 16.04). However, after I upgraded to Vagrant 1.9.2 and VirtualBox 5.1.14 today, the issue went away.

Note that, prior to upgrading, as @Minister also mentioned, the script executed without issue. It was just outputting that "ttyname failed" message, which gave the impression that an error occurred, when actually the provisioning script executed successfully.

kvjava1

Posted 2016-12-25T09:43:18.867

Reputation: 121

0

I had this issue start happening in a Vagrant installation that I had been using for years and had upgraded from time to time as well. I upgraded to the latest Vagrant ( 1.9.1 -> 2.0.3 ) and the problem went away. ( it also eliminated some other quirky things as well that had crept into its operation )

Not sure if it was the new version that fixed it or that existing files/configs were freshened in the upgrade process or a combination of the two.

G-Man

Posted 2016-12-25T09:43:18.867

Reputation: 101

0

Seems like it only works in VirtualBox v6.0.2 for Mojave/Catalina! (+vagrant 2.2.2 - not sure it matters though!)

EDIT:

This fixed it for me now in your host Mac:

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

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

OZZIE

Posted 2016-12-25T09:43:18.867

Reputation: 204