2012-07-21 23 views
9

Có cách nào để thực thi kịch bản lệnh nhiều dòng bằng cách đường ống tới đầu vào tiêu chuẩn của vỏ từ xa trong fabric? Hoặc tôi phải luôn luôn ghi nó vào hệ thống tập tin từ xa, sau đó chạy nó, sau đó xóa nó? Tôi thích gửi đến stdin vì nó tránh được tệp tạm thời. Nếu không có API vải (và có vẻ như không dựa trên nghiên cứu của tôi), có lẽ tôi chỉ có thể sử dụng mô-đun ssh trực tiếp. Về cơ bản, tôi muốn fabric.api.run không bị giới hạn bởi lệnh 1 dòng được chuyển tới shell như một đối số dòng lệnh, nhưng thay vào đó sẽ lấy một kịch bản nhiều dòng và ghi nó vào đầu vào tiêu chuẩn của remote shell.Chạy kịch bản lệnh shell bằng cách sử dụng văn bản lệnh và văn bản đường dẫn đến tiêu chuẩn của vỏ sò

Để làm rõ Tôi muốn tương đương với vải của dòng lệnh này:

ssh somehost /bin/sh < /tmp/test.sh 

Ngoại trừ trong python các coude nguồn kịch bản sẽ không đến từ một tập tin trên hệ thống tập tin địa phương, nó sẽ chỉ là một chuỗi multiline trong ký ức. Lưu ý rằng đây là một thao tác logic duy nhất và không có tệp tạm thời nào ở phía bên trái, có nghĩa là các lỗi không mong muốn và các sự cố không để lại các tệp mồ côi. Nếu có một lựa chọn như vậy trong vải (đó là những gì tôi hỏi về), sẽ không cần phải là một tập tin tạm thời ở hai bên và điều này sẽ chỉ đòi hỏi một hoạt động ssh duy nhất.

+0

Tại sao không chỉ làm điều gì đó như 'chạy ('command1 && command2 && command2' ')? – Tshepang

+4

Vì A) không dễ đọc hoặc viết hoặc duy trì như mã shell-in-python, B) && ảnh hưởng đến luồng mã của bạn theo những cách bạn có thể hoặc không muốn và C) thế giới đã đầy vỏ hiện có kịch bản tôi muốn chạy qua vải mà không cần chuyển đổi chúng thành một dòng. –

Trả lời

0

Không có cách tích hợp để thực hiện điều đó. Bạn có thể lập trình nó mặc dù:

from fabric.api import run 

scriptfilehandle = open('myscript.sh') 
for line in scriptfilehandle: 
    run(line) 
+5

Điều đó sẽ không hoạt động. Bạn không thể chạy một khối multiline if/for/while bằng cách gọi một quá trình shell mới cho mỗi dòng. –

+1

Điểm tốt. Ofcourse câu trả lời của tôi giả định kịch bản bao gồm các lệnh đơn giản, không có logic thực sự. Đề nghị của tôi vẫn còn, rằng bạn có thể chia công việc thành các phần khác nhau và chạy những người riêng biệt. –

+1

Nhưng thực tế nói, tôi sẽ nói rằng các tùy chọn bạn đề nghị mình, của 'đưa' các tập tin hơn thực hiện nó từ xa sẽ được tốt hơn.Có lẽ bạn có thể làm rõ lý do tại sao đó không phải là một lựa chọn? –

2

Nếu kịch bản là trong một tập tin, bạn có thể đọc nó, sau đó vượt qua nội dung của nó để run. Viết lại ví dụ của Jasper:

from fabric.api import run 

script_file = open('myscript.sh') 
run(script_file.read()) 
script_file.close() 
+1

có, nhưng vải có ghi tập tin từ xa, sau đó chạy nó, và sau đó xóa nó như là 3 hoạt động riêng biệt. –

3

Bạn có thể sử dụng các thao tác Vải. bạn có thể sử dụng fabric.operations.put(local_path, remote_path, use_sudo=False,mirror_local_mode=False,mode=None)

để sao chép tệp tập lệnh vào đường dẫn từ xa rồi thực thi nó.

hay,

bạn có thể sử dụng fabric.operations.open_shell, nhưng điều đó sẽ chỉ làm việc cho hàng loạt các lệnh đơn giản, đối với kịch bản liên quan đến dòng chảy hợp lý, nó là tốt hơn để sử dụng hoạt động đưa và thực thi kịch bản giống như bạn làm trên một địa phương máy chủ.

1

Đối với những gì nó có giá trị, điều này hoạt động hoàn toàn tốt đẹp. Nó sử dụng ký hiệu chuỗi nhiều dòng của python ''' và ngắt dòng của bash (\ trước dòng mới). Bạn có thể sử dụng dấu chấm phẩy để tách dòng độc lập hay chỉ là hoạt động đường ống như &&

run('''echo hello;\ 
    echo testing;\ 
    echo is this thing on?;''') 
run('''echo hello && \ 
    echo testing && \ 
    echo is this thing on?''') 

Dưới đây là kết quả tôi nhận được:

[[email protected]:49300] run: echo hello;  echo testing;  echo is this thing on?; 
[[email protected]:49300] out: hello 
[[email protected]:49300] out: testing 
[[email protected]:49300] out: is this thing on? 
[[email protected]:49300] out: 

[[email protected]:49300] run: echo hello &&  echo testing &&  echo is this thing on? 
[[email protected]:49300] out: hello 
[[email protected]:49300] out: testing 
[[email protected]:49300] out: is this thing on? 
[[email protected]:49300] out: 
+0

làm cách nào tôi có thể chuyển giá trị đầu vào/biến tùy chỉnh trong lệnh chạy nhiều dòng? – Spike

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