2013-05-15 28 views
7

Tôi đang viết kịch bản bằng cách sử dụng mong đợi trong đó tôi phải đăng nhập lại vào một số máy chủ & sau đó tôi cần gửi một số lệnh. Bây giờ tôi muốn thoát khỏi máy chủ đó và relogin lại cho một số máy chủ khác và gửi một số lệnh. Nhưng việc chạy tập lệnh của tôi không chờ máy chủ đầu tiên hoàn thành công việc của mình và thoát ra ngoài thay vào đó nó sẽ gửi các lệnh khác ở giữa quá trình trước đó. Làm thế nào tôi có thể đạt được điều này bằng cách sử dụng mong đợi xin vui lòng hướng dẫn?Cách đợi quá trình hoàn thành bằng cách sử dụng tcl-mong đợi

Mẫu mã là như sau:

#!/usr/local/bin/expect -f 

spawn rlogin host1 
expect "%" 
send "source xyz.csh\r" 
send "exit\r" 
expect "%" 

spawn rlogin host2 
some set of commands 

Trả lời

0

Bạn có thể xây dựng trên

Tôi cố gắng này và nó đã làm việc.

spawn ssh host1 
expect ":" 
send pwd1 
expect "%" 
send "echo hi\r" 
expect "%" 
send "exit\r" 
expect eof 
spawn ssh host2  
expect ":" 
send pwd2 
7

bạn đang quên "gõ enter". Sau khi gửi xuất cảnh, con đường để chờ cho quá trình kết thúc os expect eof: "vẫn kịch bản gửi phần còn lại của lệnh ở giữa quá trình trước"

send "source xyz.csh\r" 
expect "%" 
send "exit\r" 
expect eof 
+0

nó đã có trong mã của tôi, tôi quên đề cập đến nó ở đây trong mã của tôi –

+0

những gì đã có? 'eof' hoặc' \ r'? Vui lòng cập nhật câu hỏi của bạn để chính xác hơn. –

+0

mong đợi eof cũng không hoạt động. vẫn kịch bản gửi phần còn lại của các lệnh ở giữa quá trình trước đó. –

1

Cố gắng xây dựng này khi command là tốn thời gian:

. . . 
send "command\r" 

expect { 
    timeout { 
     puts "Running..." 
     exp_continue 
    } 
    "%PROMPT%" { 
     puts "Finished." 
    } 
} 

send "next command\r" 
. . . 

On timeout bạn sẽ được liên tục chờ đợi với exp_continue lệnh cho %PROMPT%.

+0

Cuộc sống tiết kiệm người đàn ông! cảm ơn câu trả lời này! –

1

Tôi tìm thấy bài đăng này sau khi tôi gặp sự cố về tình trạng chủng tộc: đôi khi tập lệnh hoàn thành là được mong đợi và các thời điểm khác không được. Thêm một tuyên bố catch để kịch bản đảm bảo các kết quả mong muốn mỗi lần:

[...] 
expect eof 
catch wait result 
+0

bắt "một số dòng cuối cùng", đã loại bỏ thành công một cuộc đua-điều kiện cho tôi. Đầu ra từ mong đợi bây giờ luôn hoàn thành. Thay vì chỉ đôi khi. – user18099