Làm thế nào để giải quyết `ttyname không thành công: ioctl không phù hợp cho thiết bị` trong Vagrant?


21

Khi sử dụng đoạn mã này (nhà cung cấp shell nội tuyến):

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

nó dẫn đến:

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

Có vẻ như những người khác cũng đã tìm thấy vấn đề này . Có ai biết làm thế nào để giải quyết nó?


Tôi nhận thấy rằng ngay cả thông báo này đã được hiển thị là một lỗi, tập lệnh đã được thực thi thành công! Vài ngày sau tôi thấy một sửa chữa có thể và tôi đã đăng một câu trả lời ở đây . Vì vậy, có thể bạn không cần nó, nhưng bạn có thể dùng thử và sử dụng nó nếu nó hiệu quả với bạn.
Bộ trưởng

@Minister Cảm ơn bạn. Nó giải quyết vấn đề. Bạn có thể xóa câu trả lời khỏi SO và đăng nó lên SuperUser không? Stackoverflow là về lập trình.
030

Tôi rất vui vì giải pháp cũng hiệu quả với bạn! Cảm ơn bạn đã xác nhận nhanh chóng của bạn! Tôi vừa mới đăng câu trả lời ở đây, nhưng tôi không chắc liệu tôi có phải xóa câu trả lời của mình khỏi SO hay người điều hành nên chuyển câu hỏi từ SO ở đây trên SU không? Tôi ổn nếu ai đó có quyền thích hợp chỉnh sửa / xóa câu trả lời của tôi ở đó, nhưng nó có thể giúp đỡ người khác, vì vậy hiện tại tôi đang để nó "như hiện tại", nhận ra đây là một dạng trùng lặp (như câu hỏi có vẻ như vậy). ..
Bộ trưởng

Câu trả lời:


10

Tôi nhận thấy rằng ngay cả thông báo này đã được hiển thị là một lỗi (màu ĐỎ), tập lệnh đã được thực thi thành công! Vài ngày sau tôi thấy một sửa chữa có thể và tôi đã đăng một câu trả lời trên SO . "Sửa" là:

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

Có thể bạn không cần nó, nhưng bạn có thể dùng thử và sử dụng nó nếu nó hiệu quả với bạn.

Như bạn có thể thấy trong dòng nhận xét ở trên - "mesg: ttyname fail ioctl không phù hợp cho thiết bị" đã bị ngăn chặn từ nhóm laravel. Cảm ơn vì điều này!

Hầu hết các nhà phát triển muốn tránh lỗi / cảnh báo khi chúng tôi phát triển, vì vậy có vẻ như đó là bản sửa lỗi (một bản sửa lỗi có thể) mà chúng tôi cần.

Lưu ý quan trọng: Tôi chưa thử nghiệm giải pháp này quá nhiều, nhưng hộp bắt đầu mà không có lỗi "mesg: ttyname không thành công ioctl không phù hợp cho thiết bị"! Bạn có thể tự do dùng thử và nếu bạn gặp bất kỳ vấn đề nào, chỉ cần bỏ một bình luận để tiết kiệm thời gian của người khác!


1
Lưu ý, điều này dường như để phá vỡ vagrant ssh -c '...'. Có thể như các đối số được cung cấp được bỏ qua.
Skeen

Điều này dường như chỉ che giấu lỗi này cho tôi nhưng nó vẫn không hoạt động
OZZIE

16

1) mở /root/.profile

2) xóa dòng tấn công

3) thay thế nó bằng:

tty -s && mesg n

Chúc mừng linuxing và một năm mới vui vẻ.

George Hart, LSU


5
Thở dài. Nếu chỉ có các bản phân phối Ubuntu (và các loại khác?) Sẽ sửa lỗi này trong tiêu chuẩn /root/.profile... Mặc dù vậy, man ttytrên MacOS nói rằng "Tùy chọn -s không được dùng theo lệnh` `test -t 0 ''." , vì vậy một sự thay thế tốt hơn có thể làtest -t 0 && mesg n
lindes 16/12/17

1
Để tự động hóa việc này, bạn có thể sử dụngsed -i -e 's/mesg n .*true/tty -s \&\& mesg n/g'
Gogowitsch

11

Dường như điều này là do sự tương tác giữa các mặc định cấu hình lang thang của config.ssh.shellđược bash -l(mà mô phỏng một vỏ đăng nhập, do đó xử lý các file cấu hình đăng nhập liên quan đến như .profile) với một dòng trong /root/.profiletập tin trên ít nhất một số các bản phân phối của Linux (bao gồm, ví dụ: một trong hộp vagrant ubfox / xenial64 ), có:

mesg n || true

Một lựa chọn tốt hơn cho dòng này trong tập tin đó có thể là để nó nói:

test -t 0 && mesg n

... và, cho rằng điều đó khó thay đổi với tư cách là một người dùng mơ hồ, một giải pháp tức thời hơn là bỏ -ltùy chọn khỏi cấu hình mơ hồ, ví dụ như với (bên trong Vagrantfile):

config.ssh.shell="bash"

(Nên biết trước: Đó là có thể tưởng tượng rằng sự thay đổi này có thể có tác dụng phụ tiềm tàng âm Nó dường như rất tốt công việc cho tôi, tuy nhiên, với một số provisioners vỏ cơ bản, ví dụ như với. apt-get update, Và vân vân.)


Cảm ơn bạn rất nhiều cho việc này! Tôi mất: Override /root/.profile github.com/felixhummel/saltstates/blob/debian9/warts/bash/...
felixhummel

1

Phiên bản nào của Vagrant và VirtualBox bạn đang sử dụng?

Tôi đã phải đối mặt với vấn đề này ngày hôm qua khi sử dụng Vagrant 1.8.5 với VirtualBox 5.1.4 (với Ubunty 16.04). Tuy nhiên, sau khi tôi nâng cấp lên Vagrant 1.9.2 và VirtualBox 5.1.14 hôm nay, vấn đề đã biến mất.

Lưu ý rằng, trước khi nâng cấp, như @Minister cũng đã đề cập, tập lệnh được thực thi mà không gặp sự cố. Nó chỉ xuất ra thông báo "ttyname fail", điều này mang lại cảm giác rằng đã xảy ra lỗi, khi thực sự kịch bản cung cấp được thực thi thành công.


0

Tôi đã có vấn đề này bắt đầu xảy ra trong một bản cài đặt Vagrant mà tôi đã sử dụng trong nhiều năm và cũng đã nâng cấp theo thời gian. Tôi đã nâng cấp lên Vagrant mới nhất (1.9.1 -> 2.0.3) và vấn đề đã biến mất. (nó cũng loại bỏ một số điều kỳ quặc khác cũng đã len lỏi vào hoạt động của nó)

Không chắc chắn nếu đó là phiên bản mới đã sửa nó hoặc các tệp / cấu hình hiện có đã được làm mới trong quá trình nâng cấp hoặc kết hợp cả hai.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.