2013-04-25 21 views
5

Tôi đang cố gắng viết một kịch bản mong đợi sẽ ssh vào một máy chủ, gửi sudo su, sau đó kiểm tra trạng thái iptables và đưa đầu ra vào tệp nhật ký trên máy chủ. Dưới đây là kịch bản.mong đợi kịch bản để ssh trả về tên lệnh không hợp lệ

1 #!/usr/bin/expect 
    2 exp_internal 1 
    3 log_user 0 
    4 set timeout 10 
    5 set password "******" 
    6 
    7 spawn /usr/bin/ssh -l subhasish *.*.*.* -p 10022 
    8 
    9 expect { 
10  -re "password: " {send "$password\r"} 
11  -re "$ " {send "sudo su\r"} 
12  -re "[sudo] password for subhasish:" {send "$password\r"} 
13  -re "# " {send "service iptables status\r"} 
14  } 
15 set output $expect_out(buffer) 
16 send "exit\r" 
17 puts "$output\r\n" >> output.log 

Nhưng trong khi chạy ở chế độ gỡ lỗi, tôi nhận được lỗi như thế này;

expect -d testcase 
expect version 5.44.1.15 
argv[0] = expect argv[1] = -d argv[2] = testcase 
set argc 0 
set argv0 "testcase" 
set argv "" 
executing commands from command file testcase 
parent: waiting for sync byte 
parent: telling child to go ahead 
parent: now unsynchronized from child 
spawn: returns {24105} 
invalid command name "sudo" 
    while executing 
"sudo" 
    invoked from within 
"expect { 
    -re "password: " {send "$password\r"} 
    -re "$ " {send "sudo su\r"} 
    -re "[sudo] password for subhasish:" {send "$password\r"} 
..." 
    (file "testcase" line 9) 

Không chắc chắn tôi đang đi sai. Nó nói tên lệnh không hợp lệ "sudo", tôi đoán điều này là bởi vì mong đợi không hiểu lệnh này. Làm thế nào để đi xung quanh nó. Hãy giúp tôi. Cảm ơn.

Trả lời

11

Vấn đề là ở dòng này

-re "[sudo] password for subhasish:" {send "$password\r"} 

Trong Tcl (và do đó trong mong đợi) các dấu ngoặc vuông là cú pháp để thay thế lệnh (như backticks trong vỏ). Vì vậy, bạn cần phải thoát khỏi dấu ngoặc vuông hoặc sử dụng các dấu ngoặc kép khác nhau ngăn chặn các mở rộng khác nhau:

-re {[sudo] password for subhasish:} {send "$password\r"} 

Điều này sẽ dẫn đến một vấn đề khác: bạn có mong đợi thấy những ký tự chính xác này không? Bởi vì bạn đang hướng dẫn trông đợi điều đó như một biểu thức chính quy, và các dấu ngoặc vuông trong một biểu thức chính quy có nghĩa là một lớp nhân vật, vì vậy nó sẽ khớp với một ký tự đơn lẻ, 's', 'u', 'd' hoặc 'o '. Vì vậy, những gì bạn có thể cần là thế này:

-re {\[sudo\] password for subhasish:} {send "$password\r"} 

hoặc

-ex {[sudo] password for subhasish:} {send "$password\r"} 
+0

Tôi đã thay đổi sudo su mong đợi để "mật khẩu cho subhasish:" và cũng như cách bạn đã đề cập, không phải trường hợp nó làm việc; sử dụng mã được cập nhật bên dưới, #!/usr/bin/expect -f #!/Bin/bash bộ thời gian chờ 60 log_user 1 bộ máy chủ *. *. *. * bộ mật khẩu ****** tập người dùng Subhasish set logfile output.txt spawn ssh -p 10022 $ user @ $ host mong đợi "* assword: *" gửi - "$ password \ r" log_user 1 mong đợi "$" gửi - "sudo su \ r" mong đợi "mật khẩu cho Subhasish:" gửi - - "$ password \ r" mong muốn "#" gửi - "trạng thái dịch vụ iptables \ r" log_file /home/subhasish/output.log mong đợi "#" log_file gửi - "thoát \ r"; gửi - "thoát \ r"; thoát 0 –

+0

nhật ký thủ công trông giống như thế này, [root @ localhost subhasish] # ssh -p 10022 [email protected]*.*.*.* mật khẩu của [email protected]*.*.*.*: Lần đăng nhập gần nhất: Thứ Hai Ngày 29 tháng 4 07:19:52 2013 từ *. *. *.* [Subhasish @ testhost ~] $ sudo su [sudo] password cho Subhasish: [root @ testhost Subhasish] # –

+0

debug script cho thấy nó bị mắc kẹt trong mong đợi: mong đợi: không "\ r \ nLast đăng nhập: Mon Ngày 29 tháng 4 07:35:36 2013 từ *. *. *. * \ R \ r \ n \ u001b] 0; subhasish @ testhost: ~ \ u0007 "(spawn_id exp4) khớp mẫu glob" mật khẩu cho subhasish: "? không [subhasish @ testhost ~] $ kỳ vọng: không "\ r \ nLưu trữ nhanh: Thứ Hai 29 tháng 4 07:35:36 2013 từ *. *. *. * \ r \ r \ n \ u001b] 0; subhasish @ testhost: ~ \ u0007 \ u001b [? 1034h [subhasish @ testhost ~] $ "(spawn_id exp4) khớp mẫu glob" mật khẩu cho subhasish: "? no –

3

Cảm ơn Glenn, nó làm việc bây giờ. Một lý do nữa tại sao nó không hoạt động là nó cần phải ngủ giữa đăng nhập bình thường và đăng nhập sudo, nếu không "sudo su" đã được gửi trước khi $ prompt trả lại, để tham khảo cho người khác, đây là mã,

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

set timeout 60 
log_user 1 
set host *.*.*.* 
set password ****** 
set user subhasish 
set logfile output.txt 
spawn ssh -p 10022 [email protected]$host 
expect "*?assword:*" 
send -- "$password\r" 
#log_user 1 
sleep 2 
expect "$" 
send -- "sudo su\r" 
expect -gl {*password for subhasish:*} 
send -- "$password\r" 
expect "#" 
send -- "service iptables status\r" 
log_file /home/subhasish/output.log 
expect "#" 
log_file 
send -- "exit\r"; 
send -- "exit\r"; 
exit 0 
+0

Đang đợi lời nhắc rất hữu ích. – phyatt

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