Permissions

Incrond 執行但不執行命令 CentOS 6.4

  • April 1, 2018

我已經從 StackOverflow 複製了這個問題…

我已經從 EPEL 儲存庫(0.5.9)安裝了 incron(在你問之前;是的,我還嘗試下載原始碼並在本地編譯(0.5.10);相同的結果)並試圖在我的 CentOS 6.4 上設置一個程序(最終)我在本地 Ubuntu 12.04 機器上成功原型化的虛擬盒子(包括incron在 Ubuntu 下完美執行的過程):

前面的一些資訊:

libsepol.policydb_read: policydb magic number 0x696c6f70 does not match expected magic number 0xf97cff8c or 0xf97cff8d semodule_package: Error while reading policy module from incron.te

當我嘗試使用semodule_package

  • 我試圖通過這樣做在腳本本身和預腳本中定義環境,caller.sh我能夠env > /tmp/envfile.txt表明腳本正在sudo env(如我所願)的複製中執行但是我仍然沒有從我的腳本中得到輸出,它應該在它的輸入文件或它的任何日誌上做的工作……
  • 應該是權限吧?(我離只chmod -r 777在根文件系統上做這件事還有一天的時間;))
  • 在 Ubuntu 12.04 下,執行sudo incrotab -e和輸入的簡單操作/tmp/ IN_CREATE,IN_NO_LOOP env > /home/username/envfile.txt表明 incron 已經在 root/sudo 環境中執行,正如 incron 文件所建議的那樣。
  • 這是所有與 SELinux 相關的東西,還是 CentOS 中發生的其他事情讓這變得如此困難?

如果我從命令行呼叫我的腳本,sudo /path/to/my/script.sh arguments它就像一個魅力。

或者就此而言,如果我呼叫caller.sh它一切正常,但是當caller.sh它被incrond它呼叫時,甚至不能env > /dev/pts/0從它呼叫。(雖然我可以 env > /tmp/envfile.txt

sudo service incrond status驗證 incrond 是否正在執行。root 和 myusername 添加到/etc/incron.allow,/etc/incron.deny為空。

以下內容已棄用,請參閱上面的要點,但請閱讀它以了解背景故事和擴展…

我的根目錄是:

/path/to/dropfolder/ IN_CLOSE_WRITE sudo /path/to/my/script.sh $@/$#

事件/path/to/dropfolder/導致沒有任何有用的事情發生。日誌在 /var/log/cron 中生成,沒有消息,文件夾中的文件不會發生任何操作。

所以我進行了研究:建議cron在最小環境中執行,並且要執行複雜的命令/腳本,您可能必須.bashrc在 cron 命令的開頭執行和/或導出 PATH。

**編輯:**文件表明incron從系統表執行或 root 從其主機環境中獲取 env,因此僅incron由非 root 使用者執行應該需要任何類型的 env 或 PATH 擺弄

所以…… root 的 incrontab:

/path/to/dropfolder IN_CLOSE_WRITE . /home/myusername/.bashrc; export PATH=$PATH:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin; sudo /path/to/my/script.sh $@/$#"

沒有骰子……嘗試&&而不是;=沒有骰子。如果你能想到上面的變化,我可能已經嘗試過了……

所以,讓我們嘗試一些小動作restorecond -R /usr/sbin/incrond /etc/incron*!呵呵,也沒有變化。 service incrond stop緊隨其後的是service incrond start……service incrond restart不,不,不。

激烈的措施:yum remove incronyum install incronchkconfig incrond on然後為良好的措施 a sudo reboot

ol’touch ./autorelabel和重啟怎麼樣?不!

沒有。

我什至沒有從中得到任何東西/tmp/ IN_ALL_EVENTS echo boo> > /home/myusername/boofile.txt,因此我什env > envfile.txt至無法檢查是否incron在稀疏環境中執行……(見上面的註釋)

然而:service incrond status產量incrond (pid xxxx) is running...

像這樣進一步檢查/var/log/cron產量結果:-是的Aug 14 15:05:30 hostname incrond[1584]: (root) CMD (sudo /path/to/DropFolder/script/subfolder/script-Beta-1.sh /home/username/DropFolder/testfile.file),我確保我的腳本是可執行的..

如果我將 root 的 incrontab 設置為包含/tmp/ IN_ALL_EVENTS,IN_NO_LOOP env > /tmp/envfile.txt,我什麼也得不到。尾部/var/log/cron包含:Aug 15 10:06:32 hostname incrond[1584]: (root) CMD (env > /tmp/envfile.txt)但文件不存在於/tmp/

所以 incrond 確實在嘗試做某事,但是我在任何地方都沒有輸出……甚至 a 也會echo > /dev/pts/0產生 nada 結果。

incrontab /tmp/ IN_ALL_EVENTS,IN_NO_LOOP . ./home/print/.bashrc; env > /tmp/envfile.txt如果我按照我發現處理cron環境問題的多個執行緒中的建議創建root ,我得到Aug 15 12:30:25 hostname incrond[1726]: cannot exec process: Permission deniedpid這裡與聲稱它發出命令的不同,所以顯然這裡發生了一些子程序產生……上面的 SELinux 政策連結,我覺得它們是相關的,但 PREMISSIVE 和 DISABLED SELinux 設置不應該不在乎嗎?

在我嘗試將 SELinux 設置為 DISABLED 之前,我收到的條目/var/log/audit/audit.log表明 incron 正在嘗試做某事並且它們res=success在最後被標記…這似乎表明 SELinux 正在讓事情發生,但沒有任何反應!由於將 SELinux 設置為 DISABLED 並返回 PERMISSIVE 並重新啟動(多次),除了其他相關的事情之外,我沒有得到任何/var/log/audit/audit.log與 incrond 相關的條目service start。什麼?


我已經以 root ( )、普通使用者以及系統表sudo incrontab(位於/etc/incron.d

我已經把廚房水槽扔到了這裡(據我了解水槽的內容),我找不到解決方案……我錯過了什麼?我希望有人能讓我在短時間內覺得自己像個白痴!

好的,這是答案:

儘管我可以找到所有文件聲明它是相反的,但incrond在 CentOS 6.4 下執行在稀疏環境中並且表現為cron. 在 Ubuntu 下情況並非如此,其中 incron 從 root 繼承了系統表和根表的環境,並且只有使用者表在稀疏環境中執行。這當然意味著如果您正在呼叫一個腳本(我是),該腳本需要建構它的環境,並且每件事都必須有一個完整的路徑。一切。(好吧,除了shell內置:p)

許多 Google 和 Bing 以及 Stack Overflow 和 Server Fault 搜尋都告訴我以cron這種方式執行,但它們似乎也都表明incron按照文件中描述的方式執行,它在 Ubuntu 下確實如此……

最重要的是,它現在可以工作了,耶!

  • 我想這只是為了表明:當有疑問時定義環境並使用完整路徑……呃,實際上,只要一直這樣做,就不會讓自己頭疼。

(這並沒有解決我為 應用 SELinux 安全策略的問題incron,但我稍後會擔心,在另一篇文章中……)

我遇到過同樣的問題。經過大量的試驗和錯誤,我發現我原來的線路

/path/to/watch IN_CLOSE_WRITE /usr/local/bin/mycommand $@/$#

不工作,但以下工作:

/path/to/watch IN_CLOSE_WRITE /bin/sh /usr/local/bin/mycommand $@/$#

我猜 incron 不尊重帶有 shebang 的腳本(但是?)並且需要在命令中使用解釋器。

編輯:經過更多測試後,我發現如果命令是(bash 或 shell)腳本,它將需要 .sh 副檔名,或者需要在前面加上 /bin/sh 之類的解釋器。所以下面的例子都可以工作(至少在 CentOS 6.4 下)

/path/to/watch IN_CLOSE_WRITE /bin/sh /usr/local/bin/mycommand $@/$#
/path/to/watch IN_CLOSE_WRITE /usr/local/bin/mycommand.sh $@/$#

引用自:https://serverfault.com/questions/531296