Gắn kết SSHFS tồn tại ngắt kết nối


56

Tôi đang sử dụng SSHFS gắn kết từ máy tính xách tay của tôi đến một máy chủ trung tâm.

Rõ ràng, gắn kết SSHFS bị hỏng sau khi ngắt kết nối lâu hơn (ví dụ: trong khi tạm dừng), khiến kết nối SSH cơ bản đã hết thời gian.

Có cách nào để gắn kết SSHFS sống sót sau khi ngắt kết nối lâu dài (> 5 phút) hoặc thậm chí quay số lại với một IP khác không?

Câu trả lời:


62

Sử dụng -o reconnect,ServerAliveInterval=15,ServerAliveCountMax=3

Sự kết hợp này ServerAliveInterval=15,ServerAliveCountMax=3khiến các lỗi I / O bật ra sau một phút ngừng hoạt động mạng. Điều này rất quan trọng nhưng phần lớn không có giấy tờ. Nếu ServerAliveIntervaltùy chọn được để mặc định (vì vậy không có kiểm tra trực tiếp), các quá trình trải nghiệm I / O bị treo dường như ngủ vô thời hạn, ngay cả sau khi sshfs được reconnect'ed. Tôi coi đây là một hành vi vô dụng.

Nói cách khác, những gì xảy ra -o reconnectmà không cần gán ServerAliveIntervallà bất kỳ I / O nào cũng sẽ thành công hoặc treo ứng dụng vô thời hạn nếu ssh kết nối lại bên dưới. Một ứng dụng điển hình trở thành hoàn toàn treo như là kết quả. Nếu bạn muốn cho phép I / O trả lại lỗi và tiếp tục ứng dụng, bạn cần ServerAliveInterval=1hoặc cao hơn.

Các ServerAliveCountMax=3là mặc định dù sao, nhưng tôi muốn xác định nó cho dễ đọc.


Điều này làm cho tôi. Ngoài ra, bạn có thể sử dụng một khoảng thời gian ngắn hơn, vì nó không nên gây ra quá nhiều rắc rối và làm cho toàn bộ điều này trở nên nhanh nhạy hơn.
Manux

Tôi đã không đọc tài liệu, nhưng tôi thấy một giải pháp khác có nội dung "ServerAliveCountMax = 0" có nghĩa là nó sẽ tiếp tục thử vô thời hạn. Tôi giả sử giải pháp của bạn cho nó 3 lần thử lại sau mỗi lần thất bại?
PJ Brunet

@PJBrunet man 5 ssh_configđể biết thêm chi tiết, nhưng ý chính là cứ sau 15 giây ssh sẽ gửi một cái gì đó như ping 'giữ mạng' cứ sau 15 giây để đảm bảo các máy tính vẫn phản hồi với nhau. Nếu ba lần ping liên tiếp thất bại (45 giây), hãy kết nối lại.
Wyatt8740

@ Wyatt8740 Tôi đã nghiên cứu thêm về điều này và đọc tài liệu, tôi tin rằng nó ServerAliveCountMax=3có một ý nghĩa khác. Nếu có lỗi, nó sẽ thử kết nối lại 3 lần nữa rồi bỏ cuộc. Tại một số điểm thử lại là vô ích, nhưng điều đó phụ thuộc vào ứng dụng. Sau đó, một lần nữa, tôi nghĩ rằng trang người đàn ông có thể cụ thể hơn, có nhiều cách khác nhau để diễn giải cách nó diễn đạt IMO. FWIW vấn đề cụ thể của tôi đã biến mất sau khi chuyển sang ProtonVPN. Tôi nghĩ rằng cũng đáng để kiểm tra cấu hình ssh trên máy khách và máy chủ, chúng có các tùy chọn riêng biệt, vì vậy tất cả những gì bạn thực sự cần là-o reconnect
PJ Brunet

1
Đây phải là câu trả lời được chấp nhận.
Fl0v0

52

Cảm ơn lời khuyên của autossh và autofs.

Tuy nhiên, với mục đích trực tiếp của mình, tôi đã tìm thấy một giải pháp đơn giản hơn nhiều mà không được ghi chép lại quá tốt:

sshfs -o reconnect server:/path/to/mount

Ngọt! Điều này khiến tôi thực sự muốn sắp xếp xác thực khi viết: serverfault.com/q/379728/96905
Jeff Burdges

12

Autossh tự động kết nối lại các phiên ssh khi thông báo ssh đã chết hoặc ngừng lưu lượng. Vì nó chỉ là ssh tự động, nó sẽ hoạt động từ các IP khác nhau và tạm ngưng (ngay cả khi máy tính xách tay thức dậy trên một làn đường khác).


Có lẽ Mosh thậm chí còn tốt hơn cho một phiên SSH tương tác.
Martin Uting

@MartinUting Tôi đã tra cứu Mosh nhưng a) không hoạt động với sshfs b) có vẻ như bạn cũng cần cài đặt nó trên máy chủ, điều này làm cho nó ít hấp dẫn hơn, IMO.
PJ Brunet

9

Một điều bạn có thể làm là gắn kết hệ thống tập tin của bạn thông qua autofs . Autofs là một công cụ sẽ gắn kết một hệ thống tập tin khi bạn sử dụng một cái gì đó trong thư mục mà hệ thống tập tin sẽ được gắn kết. Khi nó phát hiện hoạt động, hệ thống tập tin được gắn kết. Khi không có gì xảy ra trên hệ thống tập tin thì nó không được đếm.

Đây là một howto tôi tìm thấy trên google để thực hiện điều này, có nơi một số người khác.


2

Tôi nghi ngờ là không có, bởi vì ngay cả khi bạn có thể định cấu hình máy khách SSH của mình không ngắt kết nối, máy chủ có thể được cấu hình để làm như vậy sau một khoảng thời gian không hoạt động được chỉ định và bạn sẽ không thể ghi đè lên. Ngay cả khi bạn có thể, nếu bạn không bao giờ khôi phục kết nối, máy chủ sẽ bị treo và theo thời gian có thể dẫn đến lãng phí đáng kể tài nguyên máy chủ.

Một kỹ thuật tốt hơn, tôi nghĩ, là ngắt kết nối hệ thống tập tin trước khi tạm dừng máy tính của bạn và kết nối lại khi máy tính thức dậy một lần nữa. Cơ chế để làm như vậy có thể phụ thuộc vào chính xác cách bạn tạm ngưng máy tính của mình - Tôi sử dụng nhân tuxonice và để làm một cái gì đó như thế này tôi có một chỉ thị như

Unmount /mnt/sshfs

trong /etc/hibernate/common.conf.


0

Câu trả lời của kubanchot là tuyệt vời. Tôi gặp vấn đề với việc đóng băng toàn bộ giao diện vì sshfs quá tham lam, giờ đây để kết nối dễ dàng được bắt đầu bởi một tập lệnh kết nối lại khi máy tính xách tay được mở và không bị đóng băng khi kết nối chậm hơn, bạn có thể sử dụng tập lệnh bash như thế (có thể không an toàn lắm, nhưng thuận tiện cho nhiều dự án web chẳng hạn):

#!/bin/bash
echo PWD | sshfs USER@SERVER:/ MOUNT_PATH -o password_stdin,reconnect,ServerAliveInterval=15,ServerAliveCountMax=3 -p PORT -C -oStrictHostKeyChecking=no
if xhost >& /dev/null ; then
    pcmanfm MOUNT_PATH
fi
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.