Thiết lập công việc định kỳ thực hiện chmod / chown


9

Tôi muốn thiết lập một công việc định kỳ mà chmod / chown trên một thư mục (thư mục dropbox).

Điều này hoạt động khi tôi thực hiện các lệnh thủ công như:

sudo chown -R $USER ~/Dropbox
sudo chmod -R u+rw ~/Dropbox

Tôi đã cố gắng chuyển đổi nó thành một công việc định kỳ như thế này:

10      *       *       *       *       sudo chown -R $USER ~/Dropbox

Nhưng nó dường như không làm được việc.

làm như thế nào?


incron+ inotifysẽ là giải pháp sạch hơn :)
franzlorenzon

Câu trả lời:


9

Bạn muốn tập lệnh gốc của bạn (chỉnh sửa bằng cách chạy sudo crontab -e) là:

 55 * * * * /bin/chown -R somename /home/somename/Dropbox && /bin/chmod u+rw /home/somename/Dropbox

Giả sử người dùng được đặt tên somenamevà đó /home/somename/Dropboxlà đường dẫn đầy đủ của thư mục Dropbox của bạn. Là người dùng root, ~ đi đến /root.


1
Cảm ơn câu trả lời rõ ràng! Tôi nghĩ rằng điều này cho tôi thấy một số liên kết còn thiếu tôi đang tìm kiếm. Tôi sẽ kiểm tra điều đầu tiên vào ngày mai :)
tvgemert

Đã thử nó, và nó hoạt động!
tvgemert

2
Tuyệt quá; rất vui vì nó làm việc Các bài học là (a) không mong muốn các biến môi trường $PATHđược xác định tương đương với các biến của người dùng đã đăng nhập trong cronjob (ví dụ: trên linuxbox của tôi $ HOME được xác định, nhưng $ PATH được đặt thành /usr/bin/bintừ crontab và $ USER không được xác định, vì vậy trong trường hợp này bạn không cần chỉ định /bintrước chmod / chown), (b) tránh sudotrong tập lệnh (chạy tác vụ cron với tư cách rootngười dùng), (c) vì người dùng root $HOMEsẽ tham chiếu / root chứ không phải người dùng bình thường của bạn , (d) ~nên tránh trong các tập lệnh cron (theo mặc định chạy dưới dạng #!/bin/sh.
dr jimbob

Tôi cũng khuyên bạn nên đưa ra một kịch bản theo lời khuyên của David nếu bạn từng làm bất cứ điều gì phức tạp hơn thế này; một kịch bản có vẻ quá mức cho sự kết hợp của một chmod / chown. Tuy nhiên, nếu bạn bắt đầu áp dụng cho Dropboxes của người dùng khác hoặc các thư mục khác hoặc quyết định chỉ chạy trên các tệp đã thay đổi gần đây (ví dụ: kết quả của find), v.v., điều đó hợp lý hơn khi đưa vào tập lệnh.
dr jimbob

16

sudonên hầu như không bao giờ được sử dụng trong các nhiệm vụ theo lịch trình. Nó hy vọng có thể nói chuyện với một thiết bị đầu cuối, và yêu cầu các cờ cụ thể để tránh cố gắng làm như vậy.

Tạo công việc định kỳ của bạn dưới dạng root (trong /etc/crontab- Lưu ý rằng định dạng của tệp này hơi khác :) thay vào đó. Điều này cũng có lợi ích khi làm việc trên các hệ thống không được cài đặt.minute hour mday month wdayusercommand
sudo


Cảm ơn! Tôi đã tạo ra cái này, nhưng tôi vẫn không chắc về nó. Tôi đã không nhận được kết quả như mong đợi: 55 * * * * root chown -R somename ~/Dropbox
tvgemert

3
somenamecó thể là bất cứ nơi nào; nó là một con đường tương đối Thứ hai, ~chỉ được hiểu bởi vỏ; sử dụng $HOME. Sử dụng một lệnh như thế này: chown -R /some/path/somename $HOME/Dropbox(điều này sẽ sử dụng rootthư mục nhà của ...)
Mei

@David: somenamekhông phải là đường dẫn, nhưng tên người dùng (và cũng nên chứa tên nhóm somename:somegroup:);)
knittl

5
@tvgemert Những gì David nói ở trên (và trong câu trả lời của anh ấy) liên quan đến các đường dẫn / đường dẫn tương đối / đường dẫn biểu tượng ( ~) là QUAN TRỌNG QUAN TRỌNG - Vui lòng dành thời gian với các trang của cron và crontab và chắc chắn bạn hiểu những gì đang diễn ra (nếu nghi ngờ , tạo một công việc định kỳ thực hiện echo "what you want to do" > /tmp/what-i-would-runvà nhìn vào kết quả để chắc chắn rằng họ lành mạnh - RẤT ít cơ hội phá hủy vũ trụ.)
voretaq7

Cảm ơn những lời khuyên hữu ích, đã cho tôi cái nhìn sâu sắc hơn!
tvgemert

6

Hai vấn đề:

1) Các đường dẫn thường không được thiết lập theo cron giống như khi bạn đăng nhập. Hãy thử / usr / bin / sudo / bin / chown ... (hoặc bất cứ đường dẫn nào phù hợp với các chương trình đó trên hệ thống của bạn).

2) sudo thường yêu cầu mật khẩu của bạn, hoặc có thể không vui khi chạy không tương tác. Tôi đề nghị bạn đặt các lệnh trong crontab của root mà không có sudo thay vào đó, sau đó các lệnh chạy dưới dạng root.


5

Có nhiều vấn đề với crontab của bạn:

10 * * * sudo chown -R $USER ~/Dropbox

Các vấn đề:

  • sudokhông nên được sử dụng ở đây; nó đòi hỏi đầu vào thiết bị đầu cuối
  • chowncần được chỉ định đầy đủ (nghĩa là /bin/chown)
  • USERnhư một biến thực tế có thể không tồn tại; một số hệ thống sử dụngLOGNAME
  • ~(dấu ngã) sẽ chỉ được nhận ra bởi một cái vỏ - một người trần chownsẽ không hiểu nó
  • Chỉ định HOME trong crontab của root đi đến nhà của root

Tôi nghĩ rằng tôi thực sự kịch bản nó:

#!/bin/bash

# FILE: /usr/local/bin/myscript

USER=$1
eval chown -R $1 ~$1/Dropbox
eval chmod -R u+rw ~$1/Dropbox

(The evallà cần thiết để chuyển đổi ~$1để ~user sau đó đến /home/user.)

Chạy tập lệnh này từ crontab của root:

# root's crontab
10 * * * /usr/local/bin/myscript someuser

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.