2014-05-13 22 views

Trả lời

17

Có, có nghĩa là, bằng cách thêm thích hợp header arguments vào dòng #+BEGIN_SRC:

#+BEGIN_SRC sh :dir /sudo:: 
apt-get update 
#+END_SRC 

Nguồn: Running a sudo in a #+begin_src sh fails to get tty and askpass trên mailing list emacs-orgmode.

Giải thích: Các :dir luận

xác định thư mục mặc định trong khi thực hiện khối mã. Nếu nó vắng mặt, thì thư mục kết hợp với bộ đệm hiện tại được sử dụng.

Bằng cách vượt qua /sudo:: như một giá trị cho :dir chúng tôi đang tận dụng TRAMP cú pháp để truy cập các tập tin hoặc thư mục với quyền superuser. Lưu ý rằng trong ví dụ trên, chúng tôi không chỉ định thư mục để sử dụng sau ::. Trong trường hợp này, /root sẽ được sử dụng làm mặc định. Vì vậy, về cơ bản, những gì chúng tôi đang nói đến Org Babel là "Truy cập /root làm thư mục gốc và sử dụng vị trí đó làm thư mục mặc định khi thực thi mã này".

Bạn có thể chỉ định một thư mục khác nhau để sử dụng bằng cách thay đổi /sudo:: để

/sudo::/path/to/dir 

EDIT

Nếu bạn cần một số lệnh trong khối mã để chạy mà không đặc quyền superuser, bạn có thể làm như vậy bằng cách đặt

sudo -u <username> 

trước mặt chúng (thay thế <username> bằng tên người dùng của người dùng thông thường). Vì mục đích minh họa, giả sử tên người dùng của bạn là enchanter và bạn muốn bất kỳ lệnh nào trong khối mã của mình không yêu cầu đặc quyền superuser sẽ được chạy dưới dạng người dùng của riêng bạn. Trong trường hợp này, bạn sẽ phải thêm tiền tố mỗi một trong các lệnh với

sudo -u enchanter 

Bạn có thể kiểm tra các công trình này sử dụng whoami (mà in tên của người sử dụng đó là hiện "hoạt động"). Thêm

#+BEGIN_SRC sh :dir /sudo:: 
whoami 
sudo -u enchanter whoami 
whoami 
#+END_SRC 

vào tệp org-mode và đánh giá nó.Kết quả sẽ là:

#+RESULTS: 
| root  | 
| enchanter | 
| root  | 

Tín

Tôi chắc chắn có những bài viết khác trên StackExchange/Các Internet giải quyết vấn đề chạy các lệnh như một người dùng khác, nhưng tôi đã ngừng tìm kiếm sau khi tôi đã tìm thấy những ...

+0

Cảm ơn bạn trả lời. Nhưng tôi nghĩ rằng sẽ làm cho tất cả các lệnh trong khối chạy như sudo. Nhưng tôi chỉ mong đợi một số người trong số họ chạy như SUDO. Tôi có một giải pháp xấu xí khác bây giờ là sử dụng "echo" "| sudo -S '. Tôi phải đặt mật khẩu của mình vào tệp org mà tôi không thực sự thích. – enchanter

+0

@enchanter Có một giải pháp cho điều đó là tốt. Tôi đã chỉnh sửa câu trả lời của tôi để bao gồm nó. (Và có, lưu trữ mật khẩu trong văn bản thuần túy là một ý tưởng tồi. – itsjeyd

+0

Thật tuyệt vời. Nó thực sự mở ra tâm trí của tôi và cố gắng giải quyết vấn đề theo một cách khác. – enchanter

3

Câu trả lời từ @itsjeyd là tốt khi bạn có hầu hết các lệnh để chạy dưới dạng SUDO.

Nhưng khi bạn chỉ có một lệnh nhỏ để chạy dưới dạng SUDO, bạn phải mã rất nhiều sudo -u <username> và bạn phải chuyển tên người dùng thành biến nếu bạn muốn người dùng đó có thể chạy khối đó.

Đối với trường hợp đó, tôi có một giải pháp để sử dụng echo <password> | sudo -S <your command>

Dưới đây là ví dụ:

#+BEGIN_SRC sh :var PASSWORD=(read-passwd "Sudo Password: ") 
    # some normal commands here and there 

    # run sudo 
    echo ${PASSWORD} | sudo -S <your command> 

    # more normal commands 
#+END_SRC 
+0

IMHO đây thực sự là một ý tưởng tồi. Bằng cách này, bạn đang hiển thị root' mật khẩu trong danh sách quá trình và bất kỳ người dùng/ứng dụng trên máy tính của bạn có thể nhận được nó. – Kepi

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