【问题标题】:Pipe to program fails, but runs OK in SSH console管道到程序失败,但在 SSH 控制台中运行正常
【发布时间】:2014-04-27 21:29:16
【问题描述】:

我正在尝试让 Rails 4.1 接收退回电子邮件,但要做到这一点真的很困难。当我以 root 身份登录时,我可以在 SSH 控制台中运行以下命令,但是当我将它放入我的 /etc/valiases 文件时,我从脚本中得到一个反弹,说“以下地址失败”。

runuser -l useraccount -c "cd /home/useraccount/rails_deployments/dev.www/current/bin && rails runner -e development 'EBlast.receive(STDIN.read)'"

/etc/valiases/dev.mydomain.com

eblast-bounce@dev.mydomain.com: "|runuser -l useraccount -c "cd /home/useraccount/rails_deployments/dev.www/current/bin && rails runner -e development 'EBlast.receive(STDIN.read)'""

我也试过转义双引号无济于事。

我需要以用户帐户身份运行,因为 RVM 环境变量不存在用于 root。以 root 身份登录时在 SSH 控制台中运行第一个命令可以工作,但当 exim 收到电子邮件时则不行。

【问题讨论】:

    标签: linux ruby-on-rails-4 pipe exim


    【解决方案1】:

    如果不进行转义,就不能在双引号内使用双引号。一旦开始转义引号,知道何时还需要转义其他字符会变得很复杂。您的示例似乎并不太复杂,但我建议使用不同的方法。

    恕我直言,您应该使用要运行的管道命令创建一个 shell 脚本,例如 eblast-bounce-script。然后将您的别名设置为:

    eblast-bounce@dev.mydomain.com: "|/path/to/eblast-bounce-script"
    

    确保使脚本可执行,并且可由 exim 调用它的用户运行。如果您将脚本模式设置为 755,由 root 拥有,那就足够了。

    【讨论】:

    • eblast-bounce@dev.mydomain.com: "|runuser -l useraccount -c 'cd /home/useraccount/rails_deployments/dev.www/current && script/receive_eblast_bounce'"
    • 我还尝试将所有脚本移动到 receive_eblast_bounce 文件中,并像您提到的那样仅使用 valiases 文件中的文件引用,但我得到了相同的结果。 FWIW receive_eblast_bounce 文件是可执行的。
    • 我认为它与 runuser 命令有关。在 SSH 中,我尝试以用户帐户登录时运行 receive_eblast_bounce,但我得到 runuser: cannot set groups: Operation not allowed。我敢打赌,编程用户的管道也是如此。但是,否则我将如何加载我的用户环境?
    • 脚本似乎永远不会运行。在脚本中我回显了“WTF”> /home/useraccount/bad.txt 并且该文件永远不会生成。
    • 看起来还有更多内容,我正在处理 Bluehost 技术支持。似乎 exim 正在使用用户帐户,除了通过 SSH 登录时通常加载的环境变量 (PATH) 不存在。所以 ruby​​ 无法加载,因为我正在使用 RVM 来管理 rubies,而除此之外的所有其他内容都取决于 RVM/gemsets。
    【解决方案2】:

    我必须做一些事情来解决这个问题:

    1) 将运行器脚本作为Todd suggested 移动到自己的文件中;嵌套引号导致脚本无法运行。

    2) 使文件可执行;权限已设置为 755。

    3) 虽然 exim 使用我的用户名执行脚本,但 PATH 和 HOME 等环境变量根本没有设置!这导致ruby 成为未知命令。这导致了许多其他问题,因为大多数应用程序都依赖于 RVM 及其 gemsets。所以我不能让红宝石运行,更不用说轨道了。即使我要显式调用 ruby​​ 包装器,spring 也会中断,因为 $HOME 未设置。只是一连串的问题,因为没有设置用户环境。我也不能只发出su - username -c 'whatever',因为exim使用的帐户没有使用su的权限。


    所以工作设置如下所示:

    /etc/valiases/dev.mydomain.com

    eblast-bounce@dev.mydomain.com: "|/bin/bash -l -c '/home/useraccount/rails_deployments/dev.www/current/script/receive_eblast_bounce'"
    *: ":fail: No Such User Here"
    

    /home/useraccount/rails_deployments/dev.www/current/script/receive_eblast_bounce

    D=`pwd`
    
    HOME=/home/useraccount
    
    if [ -f /etc/bashrc ]; then
        . /etc/bashrc
    fi
    
    if [[ -s "/home/useraccount/.rvm/scripts/rvm" ]] ; then
      source "/home/useraccount/.rvm/scripts/rvm"
    fi
    
    cd /home/useraccount/rails_deployments/dev.www/current
    ./bin/rails runner -e development 'EBlast.receive(STDIN.read)'
    
    cd $D
    

    我现在在 ActionMailer 不应该使用 SSL 时遇到问题,我不知道这是否与我在这里所做的事情有关,但至少它执行 rails 脚本。

    【讨论】:

    • 我突然想到,它对您这样做的部分原因是 exim 不执行诸如 bash 之类的 shell 来生成应用程序。它直接执行应用程序,这就是为什么您必须获取 bash 在其启动过程中为您完成的环境文件。
    猜你喜欢
    • 1970-01-01
    • 2019-11-30
    • 1970-01-01
    • 2018-02-01
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多