2009-12-09 30 views
5

Tôi đang viết một tập lệnh Mong đợi và gặp sự cố khi xử lý dấu nhắc trình bao (trên Linux). Tập lệnh Kỳ vọng của tôi sinh ra rlogin và hệ thống từ xa đang sử dụng ksh. Lời nhắc trên hệ thống từ xa chứa thư mục hiện tại theo sau là " > " (khoảng cách lớn hơn không gian). Một đoạn kịch bản có thể là:Làm cách nào để xóa bộ đệm đầu vào trong tập lệnh mong muốn?

send "some command here\r" 
expect " > " 

này hoạt động cho các lệnh đơn giản, nhưng mọi thứ bắt đầu đi sai khi lệnh tôi gửi vượt quá chiều rộng của nhà ga (hay chính xác hơn, những gì ksh nghĩ là chiều rộng của thiết bị đầu cuối). Trong trường hợp đó, ksh thực hiện một số cuộn ngang kỳ lạ của dòng lệnh tương tác, có vẻ như viết lại dấu nhắc và gắn thêm ">" vào đầu ra. Đương nhiên điều này khiến cho tập lệnh Expect bị nhầm lẫn và không đồng bộ khi xuất hiện nhiều dấu nhắc trong đầu ra sau khi thực hiện lệnh (tập lệnh của tôi chứa một số cặp send/expect).

Tôi đã thử thay đổi PS1 trên hệ thống từ xa thành một cái gì đó đặc biệt hơn như "prompt>" nhưng một vấn đề tương tự phát sinh cho tôi biết đó không phải là cách phù hợp để giải quyết vấn đề này.

Những gì tôi nghĩ có thể giúp là khả năng kịch bản cho biết Mong đợi rằng "Tôi biết tôi đã đồng bộ hóa đúng với hệ thống từ xa tại thời điểm này, vì vậy hãy xóa bộ đệm đầu vào ngay bây giờ." Câu lệnh expect có cờ -notransferkhông loại bỏ bộ đệm đầu vào ngay cả khi mẫu phù hợp, vì vậy tôi nghĩ rằng tôi cần điều ngược lại.

Có bất kỳ kỹ thuật hữu ích nào khác mà tôi có thể sử dụng để làm cho vỏ từ xa hoạt động tốt hơn dự đoán được không? Tôi hiểu rằng Mong đợi trải qua rất nhiều công việc để đảm bảo rằng phiên được sinh ra xuất hiện tương tác với hệ thống từ xa, nhưng tôi muốn một số tính năng tương tác gây phiền nhiễu hơn (chẳng hạn như cuộn ngang ksh) bị tắt.

Trả lời

7

Nếu bạn muốn vứt bỏ tất cả sản lượng Mong đợi đã thấy cho đến nay, hãy thử

expect -re $ 

Đây là một trận đấu regexp trên $ có nghĩa là sự kết thúc của bộ đệm đầu vào, vì vậy nó sẽ chỉ cần bỏ qua tất cả mọi thứ đã nhận được rất xa. Thêm chi tiết tại số Expect man page.

+0

Tuyệt vời, dường như chỉ là những gì tôi cần. –

1

Bạn có thể thử "set -o multiline" hoặc COLUMNS = 1000000 (hoặc một số giá trị phù hợp lớn khác).

+0

'ksh' trên hệ thống này dường như không có tùy chọn' multiline', nhưng tôi đã phát hiện ra rằng nếu tôi 'set + o emacs' (tắt tùy chọn chỉnh sửa dòng emacs, có vẻ như là mặc định ở đây) thì cuộn ngang cũng bị tắt. –

0

Tôi gặp khó khăn với ksh và Mong đợi trong quá khứ. Giải pháp của tôi là sử dụng một cái gì đó khác ngoài ksh cho một vỏ đăng nhập.

Nếu bạn có thể thay đổi thông tin đăng nhập từ xa sang khác với ksh (sử dụng lệnh chsh hoặc chỉnh sửa/etc/passwd) thì bạn có thể thử với/bin/sh làm shell.

Một giải pháp khác là cho KSH biết rằng thiết bị đầu cuối là thiết bị đầu cuối câm - không cho phép thực hiện bất kỳ xử lý đặc biệt nào.

$ export TERM="" 

có thể thực hiện thủ thuật.

+0

Thật không may, trong tình huống này rất nhiều thứ khác phụ thuộc vào shell là ksh. Tôi sẽ thử xóa 'TERM', đó là một ý kiến ​​hay. –

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