我有一个程序,必须以root身份运行,并且需要由外部进程启动(由构build进程完成触发)。 这不是一个计划,所以cron不是一个选项。 我们最初有直接的SSH,但现在必须禁用,所以这不是一个选项。 有没有办法远程通知根在该机器上运行特定的程序? 不是任何程序,而是一个特定的授权程序?
我可以login,sudo root,并手动运行,没有问题。 我们正在尝试在构build之后自动完成部分安装过程。 这是在Redhat 6.4下。
当你把它做成SSH的时候,使用SSH作为另一个用户,并且允许自动化用户使用sudo以root身份执行那个特定的命令。 所以你可以从构build服务器执行命令,如ssh sudo /scripts/myscript 。
你要求一种方法来执行一个任务,为此ssh或多或less是每个人都可以使用的工具,然后说它不能用ssh来完成。 这意味着你很可能会遇到一个更糟糕的解决scheme。
如果你有ssh访问权限,但是不能通过ssh运行一个root shell,它仍然可以完成。 事实上,正确的解决scheme可能不是有权访问一个根shell。
可以以root身份访问ssh,但不能使用密码,而只能使用~root/.ssh/authorized_keys的密钥。 这样的密钥可以被限制为只运行一个特定的命令,例如你可以有这样一行:
command="ls /tmp",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa ...
如果这是不可接受的,你可以ssh作为一个不同的用户,并运行suid根可执行文件。 然而编写一个suid可执行文件需要很多的关心,所以我不会推荐它。 它可能位于一个只能被特定组访问的目录中,以限制谁可以运行它。
您也可以在端口上列出守护程序列表,然后在访问该端口后运行该命令。 这可能会使你受到多种攻击。 最安全的守护进程是一个永远不会从networking套接字读取任何东西的东西,在某些情况下这可能是合适的。 但是这也使得很难做任何forms的authentication。
总之,使用标准工具可能会更好,而ssh可能只是您需要的标准工具。
你可以使用类似func的东西来进行远程执行,但是你也可以使用排队系统,比如redis中的 beanstalk或PubSubfunction,以及目标端的本地守护进程,轮询队列并根据它执行命令。
编写一个监视命名pipe道(或网页,或networking套接字)的脚本,并执行你的代码作为回应。
我一直在做一些非常相似的事情,但是更加精致一些,通过Samba授予访问权限,并且我通知用于触发执行。
我正在logging在我的博客上
devise分析
概念的初步certificate