2011-11-28 23 views
19

Tìm kiếm phương tiện để có được Fabric để tự động (thay vì tương tác người dùng) tương tác với các lệnh shell (và không chỉ yêu cầu mật khẩu, mà còn yêu cầu người dùng nhập khi không có "stdin/ghi đè tương tác" như apt-get install -y).Làm thế nào để có được Fabric để tự động (thay vì tương tác với người dùng) tương tác với các lệnh shell? Kết hợp với pexpect?

This question cùng với các Fabric docs đề xuất rằng Vải chỉ có thể "đẩy tương tác" trở lại người dùng đang chạy chương trình Vải. Tìm kiếm để thay thế hoàn toàn tự động mà không có bất kỳ sự hiện diện của con người. Chưa có một vấn đề hiện tại "thực", để giải quyết, chỉ chuẩn bị cho những trở ngại có thể có trong tương lai.

Có thể hữu ích khi kết hợp với pexpect (hoặc cơ chế thay thế tương tự) nếu Vải không thể tự động xử lý tất cả lệnh stdin/nhắc nhở tự động? Hy vọng nó không cần phải là "either/or" kind of thing. Tại sao không tận dụng cả hai (pexpect và Fabric) nếu thích hợp, nếu có, trong cùng một chương trình/tự động hóa?

Trả lời

18

Như Glenn, tôi sẽ nói sử dụng pexpect; ngoài ra,

có một cái nhìn tại wrapper này tôi viết cho kịch bản hành vi Pexpect từ vải:

from ilogue.fexpect import expect, expecting, run 

prompts = [] 
prompts += expect('What is your name?','John') 
prompts += expect('Where do you live?','New York') 

with expecting(prompts): 
    run('command') 

Xem thêm bài đăng trên blog của tôi trên fexpect or how to handle prompts in fabric with pexpect

+0

Tuyệt vời, nhiều đánh giá cao Jasper. –

15

Nó không phải là một trong hai hoặc. Bạn chỉ cần chạy lệnh fab thông qua pexpect:

child = pexpect.spawn('fab <task>') 
child.expect('prompt:') 
child.send('reponse to prompt') 
... etc 

Lệnh fab giống như bất kỳ lệnh nào khác, vì vậy nó có thể được viết thông qua triển vọng.

+0

Ah, khai sáng. Trước đây đã nghĩ đến việc chạy pexpect bên trong công cụ fabric.py, có ý nghĩa (ít nhất) để chạy ngược lại. –

+0

Vì vậy, không có cách nào bạn nhận thức được để sử dụng nó theo cách khác xung quanh, nơi xử lý thiết bị đầu cuối của pexpect có thể được kịch bản bên trong một nhiệm vụ vải? – Shabbyrobe

+0

Tôi không thể nghĩ ra bất kỳ cách nào vì vải 'run' trả về một chuỗi khi nó được thực hiện, vì vậy không có luồng cho mong đợi mong đợi. – Glenn

2

Đối với người dùng Windows, sử dụng winpexpect. Đảm bảo sử dụng phiên bản này tôi đã liên kết vì phiên bản này khắc phục một số lỗi trong các phiên bản trước.

import sys, winpexpect 
child = winpexpect.winspawn('ftp', ['<ftp host>']) 
child.logfile = sys.stdout 
child.expect('User.*:') 
child.sendline('username') 
child.expect('Password:') 
child.direct_sendline('password') 
child .sendline('ls') 
print('Now enter the FTP interactive mode') 
child.interact() 
Các vấn đề liên quan