Bagaimana mengatasi `ttyname gagal: ioctl tidak pantas untuk perangkat` di Vagrant?

21

Saat menggunakan cuplikan ini (penyedia shell inline):

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

itu menghasilkan:

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

Sepertinya orang lain juga menemukan masalah ini . Adakah yang tahu bagaimana mengatasinya?

030
sumber
Saya perhatikan bahwa meskipun pesan ini ditampilkan sebagai kesalahan, skrip telah dieksekusi dengan sukses! Beberapa hari kemudian saya melihat kemungkinan perbaikan dan saya mengirim jawaban di sini . Jadi mungkin Anda hanya tidak membutuhkannya, tetapi Anda dapat mencobanya dan menggunakannya jika itu bekerja untuk Anda.
Menteri
@ Menteri Terima kasih. Ini memecahkan masalah. Bisakah Anda menghapus jawaban dari SO dan mempostingnya di SuperUser? Stackoverflow adalah tentang pemrograman.
030
Saya senang solusinya juga bekerja untuk Anda! Terima kasih atas konfirmasi cepat Anda! Saya baru saja mengirim jawaban di sini, tetapi saya tidak yakin apakah saya harus menghapus jawaban saya dari SO atau moderator harus memindahkan pertanyaan dari SO di sini di SU? Saya baik-baik saja jika seseorang dengan izin yang sesuai mengedit / menghapus jawaban saya di sana, tetapi mungkin membantu orang lain, jadi saya membiarkannya "apa adanya" untuk saat ini, menyadari itu semacam duplikat (seperti pertanyaannya). ..
Menteri

Jawaban:

10

Saya perhatikan bahwa bahkan pesan ini ditampilkan sebagai kesalahan (dalam warna MERAH), skrip telah dieksekusi dengan sukses! Beberapa hari kemudian saya melihat kemungkinan perbaikan dan saya mengirim jawaban pada SO . "Memperbaiki" adalah:

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

Mungkin Anda tidak membutuhkannya, tetapi Anda dapat mencobanya dan menggunakannya jika itu berhasil untuk Anda.

Seperti yang dapat Anda lihat di baris komentar di atas - "mesg: ttyname gagal Ioctl untuk perangkat" telah dicegah dari tim laravel. Terima kasih untuk yang ini!

Sebagian besar pengembang ingin menghindari kesalahan / peringatan ketika kami melakukan pengembangan, jadi sepertinya perbaikan (kemungkinan perbaikan) yang kami butuhkan.

Catatan penting: Saya belum menguji solusi ini terlalu banyak, tetapi kotak mulai tanpa kesalahan "mesg: ttyname Gagal ioctl untuk perangkat"! Anda bebas untuk mencobanya dan jika Anda mengalami masalah, berikan komentar untuk menghemat waktu orang lain!

Menteri
sumber
1
Catatan, ini sepertinya pecah vagrant ssh -c '...'. Mungkin karena argumen yang diberikan diabaikan.
Skeen
Ini sepertinya menyembunyikan kesalahan ini untuk saya tetapi masih tidak berhasil
OZZIE
16

1) buka / root / profil

2) menghapus garis ofensif

3) ganti dengan:

tty -s && mesg n

Selamat linuxing dan selamat tahun baru.

George Hart, LSU

George Hart
sumber
5
Mendesah. Jika hanya distro ubuntu (dan lainnya?) Yang akan memperbaikinya dalam standar /root/.profile... Meskipun, man ttypada MacOS mengatakan bahwa "Opsi -s ditinggalkan karena mendukung perintah` `test -t 0 ''." , jadi pengganti yang lebih baik mungkintest -t 0 && mesg n
lindes
1
Untuk mengotomatiskan ini, Anda dapat menggunakansed -i -e 's/mesg n .*true/tty -s \&\& mesg n/g'
Gogowitsch
11

Sepertinya ini disebabkan oleh interaksi antara default konfigurasi gelandangan dari config.ssh.shellmenjadi bash -l(yang mensimulasikan shell login, sehingga pengolahan file-file konfigurasi yang terkait dengan login seperti .profile) dengan garis di /root/.profilefile di setidaknya beberapa distribusi Linux (termasuk, mis., yang ada di kotak gelran ubuntu / xenial64 ), yang memiliki:

mesg n || true

Opsi yang lebih baik untuk baris ini di file itu mungkin mengatakan:

test -t 0 && mesg n

... dan, mengingat bahwa itu sulit untuk diubah sebagai pengguna gelandangan individual, solusi yang lebih cepat adalah dengan menjatuhkan -lopsi dari konfigurasi gelandangan, misalnya dengan (dalam Vagrantfile):

config.ssh.shell="bash"

(Peringatan: Dapat dibayangkan bahwa perubahan ini dapat memiliki efek samping yang berpotensi negatif. Namun, tampaknya ini bekerja baik bagi saya, dengan beberapa penentu shell dasar, misalnya dengan apt-get update, dan sebagainya.)

lindes
sumber
Terima kasih banyak untuk ini! Saya ambil: Override /root/.profile github.com/felixhummel/saltstates/blob/debian9/warts/bash/…
felixhummel
1

Versi Vagrant dan VirtualBox apa yang Anda gunakan?

Saya menghadapi masalah ini kemarin ketika menggunakan Vagrant 1.8.5 dengan VirtualBox 5.1.4 (dengan Ubunty 16.04). Namun, setelah saya memutakhirkan ke Vagrant 1.9.2 dan VirtualBox 5.1.14 hari ini, masalahnya hilang.

Perhatikan bahwa, sebelum meningkatkan, seperti @Minister juga menyebutkan, skrip dieksekusi tanpa masalah. Itu hanya keluaran bahwa pesan "ttyname gagal", yang memberi kesan bahwa kesalahan terjadi, ketika sebenarnya skrip penyediaan dijalankan dengan sukses.

kvjava1
sumber
0

Saya memiliki masalah ini mulai terjadi di instalasi Vagrant yang telah saya gunakan selama bertahun-tahun dan telah ditingkatkan dari waktu ke waktu juga. Saya memutakhirkan ke Vagrant terbaru (1.9.1 -> 2.0.3) dan masalahnya hilang. (Ini juga menghilangkan beberapa hal aneh lainnya yang telah merayap ke dalam operasinya)

Tidak yakin apakah itu versi baru yang memperbaikinya atau file / konfigurasi yang ada disegarkan dalam proses peningkatan atau kombinasi keduanya.

G-Man
sumber
0

Sepertinya itu hanya berfungsi di VirtualBox v6.0.2 untuk Mojave / Catalina! (+ gelandangan 2.2.2 - tidak yakin itu penting!)

EDIT:

Ini memperbaikinya bagi saya sekarang di Mac host Anda:

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

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

OZZIE
sumber