Rupync dường như không tương thích với .bashrc (nguyên nhân là vì vỏ của bạn sạch?


16

Hóa ra rsync không thể hoạt động với máy chủ từ xa có tệp .bashrc?

Tại máy khách cục bộ, tôi nhận được khi chạy rsync:

protocol version mismatch -- is your shell clean?
(see the rsync man page for an explanation)
rsync error: protocol incompatibility (code 2) at compat.c(180) [sender=3.0.7]

Như đã đề xuất ở đây, loại bỏ .bashrc trên máy chủ đã giải quyết vấn đề. Làm thế nào để giải quyết nó mà không xóa tệp .bashrc (tạm thời)?


1
Kiểm tra nếu ssh được kích hoạt cho tài khoản đó.
Lamy

Các câu trả lời dưới đây có khả năng không chính xác. Gần đây tôi đã bắt đầu gặp lỗi này sau khi nâng cấp Ubuntu thường xuyên, mặc dù không có gì thay đổi trong các tệp .bashrc của tôi.
Cerin

Không - nếu xóa tệp .bashrc sẽ sửa nó (như đã nêu trong câu hỏi này), thì vấn đề là đầu ra từ .bashrc. Một bản nâng cấp chắc chắn có thể giới thiệu một sự không tương thích giao thức thực tế, đây là một vấn đề hoàn toàn khác.
Randall

Câu trả lời:


21

Bạn có thể gặp sự cố nếu .bashrctrên máy chủ từ xa xuất bất cứ thứ gì đến thiết bị đầu cuối. Rupync có thể không mong đợi điều đó và kết quả là có thể có vấn đề.

Bạn có thể khắc phục điều này bằng cách xóa bất kỳ lệnh nào trong .bashrcvăn bản đầu ra đó hoặc bằng cách chuyển bất kỳ đầu ra nào sang / dev / null.


3
Vậy làm thế nào để chuyển bất kỳ đầu ra nào thành / dev / null nếu tôi chỉ có thể sửa đổi các tệp trên máy khách?
Computist

1
Tôi cho rằng bạn có thể là quản trị viên hệ thống của bạn để được hỗ trợ. Bạn cũng có thể sửa đổi các tệp trên máy chủ theo cách khác, chẳng hạn như FTP hoặc scp.
Greg Hewgill

Vâng, tệp .bashrc của tôi chứa tiếng vang "*** Bắt đầu ROOT Shell ***" và echo "(Vui lòng sử dụng sudo thay vì shell root bất cứ khi nào có thể!)". Loại bỏ những tiếng vang đã khắc phục vấn đề.
Kentgrav

1
Từ trang man rsync: "phiên bản giao thức không khớp - vỏ của bạn có sạch không?" Thông báo này thường được gây ra bởi các tập lệnh khởi động hoặc cơ sở shell từ xa tạo ra rác không mong muốn trên luồng mà rsync đang sử dụng để vận chuyển. Cách để chẩn đoán vấn đề này là chạy shell từ xa của bạn như thế này: ssh remotehost / bin / true> out.dat sau đó xem tệp out.dat. Nếu mọi thứ đều hoạt động chính xác thì out.dat phải là một tệp có độ dài bằng không.
Kentgrav

8

.Bashrc thực sự không phải là nơi chính xác để tạo đầu ra, vì nó gây ra loại vấn đề này. Mặc dù vậy, rất nhiều người thoát khỏi nó cho đến khi họ cố gắng chạy rsync :-)

Bất kỳ đầu ra mong muốn nào (và logic và các lệnh liên quan) nên được chuyển đến .bash_profile của bạn (xem, ví dụ: câu hỏi về Lỗi máy chủ ".profile so với .bash_profile so với .bashrc" để thảo luận thêm về sự khác biệt giữa các tệp).

Bằng cách đó, bạn sẽ không cần phải hy sinh đầu ra khi đăng nhập, cũng như không xử lý các thay đổi tạm thời đối với .bashrc khi bạn muốn sử dụng rsync.


6

Tôi đã luôn có các tệp .bashrc trên tài khoản người dùng của mình và chưa bao giờ gặp sự cố này cho đến hôm nay tôi đã cố gắng đồng bộ hóa một cái gì đó với máy chủ của mình bằng tài khoản root. Bài viết của bạn đã giúp tôi tìm ra giải pháp:

Các tệp $ user / .bashrc của tôi luôn bắt đầu với phần sau để ngăn loại sự cố này. Tôi đã sao chép nó vào .bashrc gốc và bây giờ hoạt động như một cơ duyên!

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

HTH


Điều này thường không hoạt động rsync, vì nó là vì bất kỳ lý do gì được phân loại là "vỏ tương tác". Nhưng dù sao nó cũng là một dòng tốt để thêm vào, bởi vì nó có thể làm hỏng các vỏ không tương tác nếu không có đầu ra.
Michael Schubert

Tôi nghĩ rằng đây là giải pháp tốt nhất cho câu hỏi. Câu trả lời chấp nhận "xóa bất kỳ lệnh nào trong .bashrc mà văn bản đầu ra" là không thực tế.
Qinsi

4

những lý do phức tạp, rsync / scp / sftp chạy .bashrc khi kết nối với máy chủ khác. Bạn phải có bất kỳ lệnh nào trong số các lệnh này ở đầu .bashrc :

hoặc

[[ $- != *i* ]] && return

hoặc là

[ -z "$PS1" ] && return

Bất kỳ lệnh nào ở trên sẽ chỉ cho phép thực thi phần còn lại của các lệnh .bashrc cho các phiên tương tác . Theo như tôi biết, bạn không cần chúng cho bất kỳ loại phiên nào khác (và thực sự tôi đã thấy bashrc mặc định từ Arch và Debian sử dụng kỹ thuật này trong bashrc của chúng).

Tuy nhiên, nếu bạn muốn hoang tưởng thêm về việc để các lệnh bashrc của bạn chạy ngay cả đối với các phiên không tương tác, ít nhất bạn nên bọc các lệnh của bashrc để tạo đầu ra như thế này ( tham chiếu ) để chúng chỉ chạy trong các phiên tương tác:

if shopt -q login_shell; then
    # this is an interactive session, we _can_ display output
    ...code that produces output goes here...
fi

Lưu ý rằng những người khác đề xuất các lệnh di chuyển văn bản xuất ra bash_profile của bạn nhưng tôi nghi ngờ liệu điều này có luôn tốt hay không (vì lý do được giải thích ở đây )

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.