2013-02-27 29 views
5

Tôi đang cố gắng sử dụng vải để tự động hóa một số công việc quản trị mà tôi đang thực hiện trên một vài máy chủ. Dòng chảy chung như sau:Chạy các kịch bản lệnh bằng vải như là root

  1. SSH với người dùng cục bộ
  2. chạy: sudo su - để trở thành root (cung cấp mật khẩu người dùng cục bộ một lần nữa)
  3. làm công việc như là người chủ :)

Thật không may sử dụng run('sudo su -') chặn thực thi các tập lệnh và cho phép người dùng nhập. Khi tôi nhập exit hoặc Ctrl+D hồ sơ scipt, nhưng không có đặc quyền root.

Tôi đã thấy một vấn đề tương tự trong Switching user in Fabric nhưng tôi hạn chế sudo su - bởi vì tôi không được phép thay đổi các tập tin /etc/sudoers chứa các dòng sau:

localuser ALL = /usr/bin/su -

tôi duyệt nguồn gốc của vải cố gắng để tìm cách giải quyết nhưng không thành công.

+0

Hãy xem http://docs.fabfile.org/en/1.4.2/usage/env.html#sudo-prefix và ví dụ này: http://stackoverflow.com/questions/12641514/switch- to-different-user-using-fabric – alecxe

+0

Sử dụng 'sudo_prefix = 'su - -c'' như được mô tả trong bài đăng đó yêu cầu mật khẩu gốc. Nếu tôi sử dụng 'sudo_prefix = 'sudo su - -c'' Tôi nhận được thông báo lỗi này 'Xin lỗi, người dùng cục bộ không được phép thực thi'/usr/bin/su - -c/bin/bash -l -c pwd 'làm root trên tên máy chủ.' – Marin

+0

Đặt 'shell = False' dường như không có hiệu lực.Thiết lập 'pty = False' trả về lỗi' sudo: no tty present và không có chương trình askpass nào được chỉ định' – Marin

Trả lời

1

Có một số giải pháp cho vấn đề của bạn. Trước tiên, bạn muốn chạy các lệnh bằng cách sử dụng sudo. Bạn có thể sử dụng phương pháp vải sudo thay vì run rằng runs a shell command on a remote host, with superuser privileges (sudo ref).

Ví dụ, các lệnh này được thực hiện sử dụng sudo:

sudo("~/install_script.py") 
sudo("mkdir /var/www/new_docroot", user="www-data") 
sudo("ls /home/jdoe", user=1001) 
result = sudo("ls /tmp/") 

ý tưởng khác là bạn muốn quấn một tập các lệnh (mà cần phải sudo ed). Bạn có thể sử dụng trình quản lý ngữ cảnh Fabric (ref) để thực hiện điều đó. Đặc biệt, bạn có thể sử dụng prefix hoặc settings.

Ví dụ:

with settings(user='root'): 
    run('do something') 
    run('do another thing') 

sẽ yêu cầu bạn một lần mật khẩu gốc sau đó thực hiện các lệnh như root. Bạn có thể thiết lập tweek để lưu trữ mật khẩu.

+0

Cả hai giải pháp đều không làm việc cho tôi. Tôi đã thử cái đầu tiên và 'sudo ('pwd')' dịch thành mật khẩu sudo-S -p 'sudo:'/bin/bash -l -c "pwd" 'và tôi nhận được thông báo lỗi 'Xin lỗi, user localuser không được phép thực hiện '/ bin/bash -l -c pwd' làm gốc trên tên máy chủ.' Các giải pháp thứ hai ngụ ý rằng tôi có mật khẩu gốc mà tôi không có. – Marin

+0

Đối với giải pháp thứ hai, bạn không thể sử dụng mật khẩu bạn sẽ sử dụng bình thường để có quyền truy cập superuser? – gbozee

4

Sau khi phải đối mặt với vấn đề tương tự như bạn, (chỉ sudo su - user phép bởi admin, sudo -u user -c cmd không được phép), đây là giải pháp làm việc của tôi với fabric:

from ilogue.fexpect import expect, expecting, run 

def sudosu(user, cmd): 
    cmd += ' ;exit' 
    prompts = [] 
    prompts += expect('bash', cmd) 
    prompts += expect('assword:', env.password) 

    with expecting(prompts): 
     run('sudo su - ' + user) 

def host_type(): 
    sudosu('root', 'uname -s') 
+0

Điều này trông giống như một giải pháp tốt, nhưng nó đòi hỏi python phải được trên máy từ xa. – jchysk

0

Có một giải pháp cho các vấn đề sau đây Sorry, user localuser is not allowed to execute '/usr/bin/su - -c /bin/bash -l -c pwd' as root on hostname. Bạn có thể hãy thử sudo('mkdir ~/test_fabric',shell=False). Sử dụng tham số shell để tránh thông số bash -l.

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