2014-10-06 14 views
6

Gấu với tôi, mô tả là dài.ssh không đáng tin cậy trở đầu ra từ lệnh từ xa

Trong perl, tôi muốn thực thi một lệnh từ xa đơn giản và nắm bắt đầu ra bằng cách sử dụng perl :: Mong đợi). Tuy nhiên tôi thấy rằng mảng kết quả của tôi đôi khi trống. Tôi đã thực hiện rất nhiều thử nghiệm và tin rằng vấn đề là kết nối ssh từ xa của tôi đang kết thúc, với thành công, trước khi lệnh từ xa có thể tuôn ra để mập mạp.

  • hành vi là giống nhau cho dù chạy perl :: Mong đợi hoặc ssh trực tiếp từ dòng lệnh bash.
  • tất cả các host trong trung tâm dữ liệu của tôi có hành vi này. Các máy chủ lưu trữ được tải nhiều hơn là lỗi thường xuyên hơn. Đối với các máy chủ nặng, tôi không đạt được kết quả khoảng 15% thời gian. Tỷ lệ lỗi gần 0 trên các máy chủ nhẹ hơn.
  • Lệnh từ xa không quan trọng.
  • Tôi biết tôi nhận được quá khứ nhắc mật khẩu và vào máy chủ từ xa. Sử dụng 'ssh -vvv' Tôi thấy lệnh từ xa được thực thi mỗi lần.
  • Tôi đã thử nghiệm bằng cách thực hiện một lệnh giả sau và kiểm tra mã trả về từ xa với hy vọng xóa bộ đệm stdout. Không có gì đáng tin cậy.

Các ví dụ sau đã được đặt tên người dùng/nhóm/máy chủ lưu trữ. Bên cạnh đó đầu ra là một cut-and-paste chưa được chỉnh sửa.

 
> while true ; do echo "start"; ssh -l user host 'date; ls -l abc; echo $?'; echo "end"; done 
start 
Password: 
Mon Oct 6 13:06:51 PDT 2014 
-rw-r--r-- 1 user group 34538 Dec 6 2012 abc 
0 
end 
start 
Password: 
end 
start 
Password: 
Mon Oct 6 13:06:54 PDT 2014 
end 

Nếu tôi phát lệnh từ xa đến tệp giả thì stdout cũng bị xóa và tôi luôn nhận được đầu ra từ lệnh của mình mỗi lần. Thật không may, đây là một công việc hack xung quanh.

 
while true ; do echo "start"; ssh -l user host 'date | tee -a /tmp/date.txt' ; echo "end"; done 

Không nên để treo lên trên các chi tiết perl trong ví dụ này. Bit thú vị là mảng @output trả về. Trong perl Tôi có lệnh sau:

địa phương :: rc :: Utils :: executeRemoteCommand ($ cmd, $ pass, 0, undef, undef, \ @output)

mà cuối cùng khoan xuống để gọi đây :

my $ ssh = Expect-> spawn ($ command);

Kết quả là $ command là thế này: "ls -l abc; echo 'Xong'; echo $"

ssh -l sử dụng máy chủ

thành công 'in Dumper \ @output':

$VAR1 = [ 
     #0 
     " ", 
     #1 
     "-rw-r--r-- 1 user group 34538 Dec 6 2012 abc", 
     #2 
     "DONE", 
     #3 
     0 
    ]; 

Không 'in Dumper \ @output':

$VAR1 = [ 
    #0 
    " ", 
    #1 
    "DONE", 
    #2 
    0 
]; 

Lưu ý cách kết quả từ 'ls' đã không bị bắt nhưng các tiếng vang của 'DONE' là. Tôi cũng đã thấy nơi mảng đầu ra có kết quả ls nhưng không phải là echo. Tôi cũng đã thấy cả hai kết quả đều thiếu.

Mọi thông tin chi tiết sẽ được đánh giá cao. Tại thời điểm này tôi stumped và bây giờ phải lập trình các cuộc gọi từ xa vào một vòng kiểm tra cho một kết quả mong đợi. Đây là một hack khủng khiếp. Tôi muốn sửa chữa nguyên nhân gốc rễ.

nhờ nhiều

+0

'" ssh -l máy chủ người dùng "ls -l abc; echo" DONE "; echo $?" ' Bất kỳ lý do cụ thể nào về' '' trước 'ls' có ở đó không? Có một số lẻ dấu ngoặc kép – Travis

+0

nữa, tôi sẽ thử nghiệm với việc bảo vệ giá trị '$?' Khỏi bị xáo trộn với giá trị hiện tại. Vì vậy, tôi sẽ thử một số biến thể trên \ '\ $?', '\\\ $?'. Chúc may mắn. – shellter

+0

Travis - báo giá cố định. Đây chỉ là lỗi đánh máy trong bài đăng này. Việc thực hiện thực tế là chính xác. Tất cả ba lệnh được thực thi ở phía xa. –

Trả lời

1

tôi không thể tái tạo nó, nhưng có lẽ bạn nên thử sử dụng các tham số -t cho ssh.

Các vấn đề liên quan