Tôi đang vật lộn với vấn đề về nhập mật khẩu tự động trong ssh và giống như mọi người khác mà tôi đang gặp phải trong bóng tối về kỳ vọng. Cuối cùng tôi gom góp một kịch bản mà kinda làm việc:kỳ vọng thoát {} mà không có thời gian chờ
#!/usr/bin/expect -f
# command line args
set user_at_host [lrange $argv 0 0]
set password [lrange $argv 1 1]
set timeout 1
# ssh command
spawn ssh -S ~/.ssh/tmp.$user_at_host -M -N -f $user_at_host
# deal with ssh prompts
expect {
"*yes/no*" { send "yes\r" ; exp_continue }
"*assword:" { send "$password\r" ; exp_continue }
}
Kịch bản này chấm dứt chỉ nhờ vào dòng timeout 1
, mà không có nó một cách đơn giản treo, và sẽ chấm dứt chỉ bằng cách tương tác người dùng (^C
).
Khi dòng spawn
là lệnh ssh thẳng về phía trước, tập lệnh chấm dứt ngay lập tức, tuy nhiên đây là not your straight forward ssh. Điều có thể khác nhau là tùy chọn -f
làm cho nó chạy ở chế độ nền (nhưng tôi đã thử tập lệnh mà không có nó để không có kết quả).
Tôi đọc rằng interact
hoặc expect eof
có thể hữu ích, nhưng tôi không thể tìm thấy đúng câu thần chú thực sự sẽ làm điều đó.
Câu hỏi của tôi (Tôi nghĩ) là Làm cách nào để tạo tập lệnh mong đợi, tạo ra một quá trình nền, chấm dứt mà không có thời gian chờ?
Chỉnh sửa: Tôi nên dự kiến (không có ý định chơi chữ) câu trả lời "sử dụng mật khẩu ssh". Trong khi đây là lời khuyên âm thanh, nó không phải là giải pháp thích hợp trong kịch bản của tôi: Tự động kiểm tra hệ thống được cài đặt vani trong môi trường đáng tin cậy, nơi thêm các khóa tin cậy vào hình ảnh là không mong muốn/có thể.
Có cách nào để thoát ngay sau khi '* mật khẩu:'? Khi tôi cố gắng thay thế 'exp_continue' bằng bất kỳ thứ gì khác, nó đã thoát ngay lập tức, nhưng dường như không gửi' the '$ {password}'. –
Có thể một 'giấc ngủ 1' hoặc' mong đợi eof' hoặc 'chờ đợi'? –
Xin lỗi vì đã đạp xe, nhưng tôi đang khoe khoang, và có lẽ bạn có thể giúp tôi giảm số lượng hoán vị mà tôi phải kiểm tra: 'Chờ eof'/'ngủ 1' ở trong hay ngoài' kỳ vọng {...} '" vòng lặp "? –