允许用户执行shell脚本而不查看其内容?


1

我想要一个使用gmail帐户发送电子邮件的hg钩子。显然我不希望任何人能够阅读除我或root之外的电子邮件发送脚本,因为它有密码,所以这就是我尝试过的:

-rwsr-xr-x  1 james james   58 Feb 18 12:05 incoming.email.sh
-rwx--x--x  1 james james  262 Feb 18 12:04 send-incoming-email.sh

哪里 incoming.email.sh 是作为钩子执行的文件:

#! /bin/bash
/path/to/send-incoming-email.sh

但是,当我尝试以另一个用户身份运行时,我收到错误:

/bin/bash: /path/to/send-incoming-email.sh: Permission denied

send-incoming-email.sh 当我像我一样跑时文件工作正常。

我正在尝试做什么,或者setuid不会传播到从shell脚本执行的命令?

系统是Ubuntu 10.04.2 LTS。

Answers:


3

如果你需要你的解决方案按原样工作,一个简单的黑客就是使用一个简短的C程序而不是shell脚本:

int main(){
setuid(geteuid());
system("/path/to/send-incoming-email.sh");
}

并拥有该setuid,从而避免竞争条件,同时允许您以root身份执行脚本执行。

到目前为止,这不是最佳解决方案,但它将解决所描述的问题。


setuid(geteuid()) 似乎是必要的。
grawity

非常正确,好抓!编辑以反映这一点。
Jeremy Sturdivant

当我作为另一个用户运行时,我仍然被拒绝许可: /bin/bash: /path/to/send-incoming-email.sh: Permission denied (权限: -rwsr-xr-x 1 james james 7227 Feb 18 16:45 incoming.email
James

为了澄清,您正在从另一个用户运行incoming.email,并且该消息会产生?尝试运行“id”而不是传入的电子邮件脚本来测试setuid操作,并确保传入的电子邮件脚本仍然直接来自您的用户。
Jeremy Sturdivant

2

Linux会忽略它 setuid shell脚本,以避免可能的竞争条件。


在Unix / Linux系统上发送电子邮件的“正确”方式是配置MTA,例如 后缀 的exim4 要么 发邮件 并让它处理SMTP身份验证混乱。还有“仅限中继”的MTA - ESMTP msmtp会 ssmtp中 。所有这些都可以通过身份验证进行SMTP中继(“smarthost”),例如通过Gmail服务器。它在多用户机器上变得更加棘手,但仍然可行。

(配置MTA时,通过将数据传递到发送电子邮件来完成 /usr/sbin/sendmail rcpt@address。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.