Jaw*_*wzX 5 permissions selinux cron shell-scripting centos6
我已经从 StackOverflow 复制了这个问题...
我已经从 EPEL 存储库 (0.5.9) 安装了 incron(在你问之前;是的,我也尝试下载源代码并在本地编译(0.5.10);相同的结果)并试图在我的 CentOS 6.4 上设置一个进程(最终)我在本地 Ubuntu 12.04 机器上成功原型化的虚拟框(包括incron
在 Ubuntu 下完美运行的过程):
前面的一些信息:
visudo
解决一些权限问题......我曾尝试应用此处所描述的 incron 策略http://blog.siphos.be/2013/05/a-selinux-policy-for-incron-finishing-up/但我一直收到
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
从中调用。(虽然我CAN env > /tmp/envfile.txt
sudo service incrond status
验证 incrond 正在运行。root 和 myusername 添加到/etc/incron.allow
,/etc/incron.deny
为空。
我的 root 的 incrotab 是:
/path/to/dropfolder/ IN_CLOSE_WRITE sudo /path/to/my/script.sh $@/$#
Run Code Online (Sandbox Code Playgroud)
事件/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 $@/$#"
Run Code Online (Sandbox Code Playgroud)
没有骰子......尝试&&
而不是;
=没有骰子。如果你能想到上述的变化,我可能已经尝试过了……
那么,让我们尝试一些小动作restorecond -R /usr/sbin/incrond /etc/incron*
吧!呵呵,那里也没有变化。
service incrond stop
其次是service incrond start
然后service incrond restart
……不,不,不。
激烈的措施:yum remove incron
和yum install incron
,chkconfig 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确实试图做一些事情,但我在任何地方都没有输出......甚至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 denied
的pid
这里与声称它发出命令的那个不同,所以显然这里发生了一些子进程产生......上面的 SELinux 政策链接,我觉得它们是相关的,但是 PREMISSIVE 和 DISABLED SELinux 设置不应该不关心吗??
在我尝试将 SELinux 设置为 DISABLED 之前,我收到/var/log/audit/audit.log
了表明 incron 正在尝试做的事情的条目,并且它们res=success
在最后被标记......这似乎表明 SELinux 正在让事情发生,但没有任何反应!自从将 SELinux 设置为 DISABLED 并返回到 PERMISSIVE 并重新启动(几次)后/var/log/audit/audit.log
,除了与其他service start
相关的事情之外,我没有得到任何与 incrond 相关的条目。什么?
我已经以 root ( sudo incrontab
)、普通用户的身份尝试了上述所有 incron 策略,尽管系统表(位于/etc/incron.d
)具有相同的结果:p
我已经把厨房水槽扔了(据我了解水槽的内容),我找不到解决方案......我错过了什么?我希望有人能在短时间内让我觉得自己像个白痴!
我遇到过同样的问题。经过大量的试验和错误,我发现我原来的路线
/path/to/watch IN_CLOSE_WRITE /usr/local/bin/mycommand $@/$#
Run Code Online (Sandbox Code Playgroud)
不起作用,但以下方法有效:
/path/to/watch IN_CLOSE_WRITE /bin/sh /usr/local/bin/mycommand $@/$#
Run Code Online (Sandbox Code Playgroud)
我猜 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 $@/$#
Run Code Online (Sandbox Code Playgroud)
好的,答案如下:
尽管我可以找到所有文档来声明情况恰恰相反,incrond
但 CentOS 6.4 在稀疏环境中运行并且行为与cron
. 在 Ubuntu 下情况并非如此,其中 incron 从 root 继承系统表和根表的环境,并且只有用户表在稀疏环境中运行。这当然意味着,如果您调用脚本(我是),则脚本需要构建其环境,并且每件事都必须有完整路径。一切。(好吧,除了 shell 内置函数:p)
大量的 Google、Bing、Stack Overflow 和服务器故障搜索都告诉我是cron
这样操作的,但它们似乎也都表明incron
按照文档中描述的方式操作,在 Ubuntu 下也是如此......
最重要的是,它现在可以工作了,耶!
(这并不能解决我应用 SELinux 安全策略的问题incron
,但我稍后会在另一篇文章中担心这个问题......)
归档时间: |
|
查看次数: |
15647 次 |
最近记录: |