Команды Drush, не выполняющиеся с использованием Paramiko - PullRequest
2 голосов
/ 19 января 2012

Я следовал за шагами здесь http://jessenoller.com/2009/02/05/ssh-programming-with-paramiko-completely-different/

для подключения к моему серверу через ssh через Python. Я могу подключиться нормально и отправлять команды.

Однако, когда я запускаю 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, и, кажется, он работает нормально. Если я введу «какой 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. Но команды drush работают нормально, если я просто захожу на сервер напрямую без использования python / paramiko.

Ответы [ 3 ]

1 голос
/ 20 января 2012

Первое, что я должен был понять, - это то, что переменная $ PATH содержала во время выполнения команды.Я запустил

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

и понял, что мой $ PATH был не таким, как когда я запускал echo $ PATH прямо на сервере!Я могу только догадываться, что дополнительные пути добавляются к переменной $ PATH в какой-то момент после открытия канала и отправки моей команды.

Однако $ PATH содержал путь к drush, который я ранее добавил к файлу .bashrc в моей домашней папке.Итак, все, что мне нужно было сделать, это также добавить туда путь к php (хотя этот путь и есть, когда я запускаю «echo $ PATH» на сервере).

Теперь я не получаюсообщение об ошибке, и я могу выполнять команды drush.

1 голос
/ 24 июня 2015

Я использовал решение Майка Райана (спасибо, Майк!), Но нашел информацию в stdout, а не в stderr.

stdin, stdout, stderr = server.ssh_client.exec_command("echo $PATH")
print stdout.readlines()
0 голосов
/ 19 января 2012

Что произойдет, если вы подключитесь к этому серверу в интерактивном режиме и запустите xyz?

Сообщение об ошибке читается только тогда, когда вы действительно его читаете, а не при отправке команды.(Спасибо, капитан.)

Вывод ошибки очень похож на то, что ваш xyz - это PHP-скрипт, начинающийся с строки #!which php shebang.Но оболочка не может найти никакого исполняемого файла PHP.Это может быть связано с неправильной настройкой PATH в сценарии входа в систему.Убедитесь, что вы понимаете, какой скрипт входа в систему запускается, когда вы подключаетесь к ssh (обычно это ~/.bash_profile и / или ~/.profile, а не обязательно ~/.bashrc).

...