Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 未使用Paramiko执行Drush命令_Python_Drupal_Unix_Paramiko_Drush - Fatal编程技术网

Python 未使用Paramiko执行Drush命令

Python 未使用Paramiko执行Drush命令,python,drupal,unix,paramiko,drush,Python,Drupal,Unix,Paramiko,Drush,我已经按照这里的步骤做了 通过Python使用ssh连接到我的服务器。我可以很好地连接并发送命令 但是,当我运行stderr.readlines()时,它每次都会向我显示下面的错误消息,即使命令似乎已正确执行。我已经关闭了连接并重新启动了Python,结果仍然是一样的 下面是一个Python示例: >>> stdin, stdout, stderr = myssh.exec_command("xyz") >>> stderr.readlines() ['whi

我已经按照这里的步骤做了

通过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
文件全文如下:


如果我尝试执行任何drush命令,我会得到相同的错误。但是,如果我使用python/paramiko直接登录到服务器,drush命令就可以正常工作。

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

只有在实际读取错误消息时,才可以读取它,而不是在发送命令时。(谢谢你,船长。)


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

我必须了解的第一件事是执行命令时$PATH变量所包含的内容。我跑

>>> stdin, stdout, stderr = myssh.exec_command("echo $PATH")
>>> stderr.readlines()
并意识到我的$PATH与直接在服务器上运行echo$PATH时不一样!我只能猜测,在打开通道并发送命令后的某个时刻,额外的路径会附加到$PATH变量

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


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

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

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

如果在服务器提示符处键入xyz,则会收到与上面添加到stderr的错误消息相同的错误消息。设置路径可能与此有关。我在共享服务器上,所以我必须在.bashrc中添加一行,以便将另一个目录附加到$PATH。我来看看我做了什么。