Drush命令没有使用Paramiko执行

时间:2012-01-18 20:04:40

标签: python drupal unix paramiko drush

我已按照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" "$@"

我相信“哪个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直接登录服务器,那么drush命令工作正常。

3 个答案:

答案 0 :(得分:1)

我必须要了解的第一件事是在执行命令时保存的$ PATH变量。我跑了

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

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

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

如果您以交互方式ssh到该服务器并运行xyz

会发生什么

您只有在实际阅读时才会阅读错误消息,而不是在发送命令时。 (谢谢船长。)

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