【问题标题】:Drush commands not executing using Paramiko不使用 Paramiko 执行的 Drush 命令
【发布时间】:2012-02-13 13:22:03
【问题描述】:

我已经按照这里的步骤http://jessenoller.com/2009/02/05/ssh-programming-with-paramiko-completely-different/

通过 Python 使用 ssh 连接到我的服务器。我可以正常连接并发送命令。

但是,当我运行 stderr.readlines() 时,它每次都会向我显示下面的错误消息,即使该命令似乎已正确执行。我已经关闭了连接并重新启动了 Python,结果还是一样。

这是一个 Python 示例:

>>> stdin, stdout, stderr = myssh.exec_command("xyz")
>>> stderr.readlines()
['which: no php in (/usr/bin:/bin:/usr/sbin:/sbin:/big/dom/mydomain/pear/drush)\n', '/big/dom/mydomain/pear/drush/drush: line 89: exec: : not found\n', 'bash: xyz: command not found\n']

我已经安装了 drush,它似乎工作正常。如果我在服务器上输入“which php”,我会被告知它所在的位置,而不是上面的错误消息。我发送了一些其他命令来故意获取错误消息,以查看它是否清除了任何内容。相反,它在最后添加了一些东西。

根据错误消息,我去查看了引用的 drush 文件。这是第 89 行:

exec "$php" $php_options "$SCRIPT_PATH" --php="$php" --php-options="$php_options" "$@"

我相信“which php”命令来自这一行上方块中的 $php 变量

if [ ! -z "$DRUSH_PHP" ] ; then
  # Use the DRUSH_PHP environment variable if it is available.
  php="$DRUSH_PHP"
else
  # Default to using the php that we find on the PATH.
  # Note that we need the full path to php here for Dreamhost, which behaves oddly.  See http://drupal.org/node/662926
  php=`which php`

  # We check for a command line (cli) version of php, and if found use that.
  which php-cli >/dev/null 2>&1
  if [ "$?" = 0 ] ; then
    php=`which php-cli`
  fi

  # On MSYSGIT, we need to use "php", not the full path to php
  if [ ! -z "$MSYSTEM" ] && [ "x${MSYSTEM:0:5}" = "xMINGW" ] ; then
    php="php"
  fi
fi

文件全文在这里:http://pastebin.com/29AXmHKF

如果我尝试执行任何 drush 命令,我会得到同样的错误。但是,如果我只使用 python/paramiko 直接将自己登录到服务器,则 d​​rush 命令可以正常工作。

【问题讨论】:

    标签: python drupal unix paramiko drush


    【解决方案1】:

    我首先要了解的是 $PATH 变量在执行命令时所持有的内容。我跑了

    >>> stdin, stdout, stderr = myssh.exec_command("echo $PATH")
    >>> stderr.readlines()
    

    并意识到我的 $PATH 与我直接在服务器上运行 echo $PATH 时不同!我只能猜测在打开通道并发送我的命令后的某个时间点,额外的路径会附加到 $PATH 变量中。

    但是,$PATH 包含的是我之前添加到主文件夹中 .bashrc 文件中的 drush 路径。所以,我所要做的就是在那里添加 php 的路径(即使当我在服务器上运行“echo $PATH”时该路径就在那里)。

    现在我没有收到错误消息,我可以执行 drush 命令。

    【讨论】:

      【解决方案2】:

      我使用了 Mike Ryan 的解决方案(感谢 Mike!),但在 stdout 中找到了信息,而不是在 stderr 中。

      stdin, stdout, stderr = server.ssh_client.exec_command("echo $PATH")
      print stdout.readlines()
      

      【讨论】:

        【解决方案3】:

        如果您以交互方式 ssh 到该服务器并运行 xyz,会发生什么?

        您只有在实际阅读错误信息时才能阅读它,而不是在您发送命令时阅读它。 (谢谢你,队长。)

        错误输出看起来很像您的xyz 是一个以#!which php shebang 行开头的PHP 脚本。但是 shell 找不到任何 PHP 可执行文件。这可能是由于在登录脚本中未正确设置PATH。确保您了解 ssh 到该框时运行的登录脚本(通常是 ~/.bash_profile 和/或 ~/.profile,不一定是 ~/.bashrc)。

        【讨论】:

        • 如果我在服务器提示符下输入 xyz,我会收到与上面的 stderr 相同的错误消息。设置 PATH 可能与它有关。我在共享服务器上,所以我必须在 .bashrc 中添加一行以将另一个目录附加到 $PATH。我会看看我做了什么。
        最近更新 更多