2015-09-18 7 views
0

я должен вызвать PHP скрипт, который принимает аргументы ..PHP скрипт с аргументами работают над не-интерактивной сессии SSH не работает

php /home/flintarm/www/store/magmi-importer/cli/magmi.cli.php -profile=Category -mode=create -logger=CLILogger 

Это отлично работает, если я войти в систему с PuTTY и иметь интерактивный вход в систему.

Я пытаюсь вызвать эту командную строку из задачи надстройки SSIS. (COZYROC SSH Execute Task, на самом деле не имеет значения), который, кажется, работает не интерактивно.

Когда она работает она стартует php штраф, но игнорирует аргументы (так что это не хорошо)

Ниже приведен исходный PHP ..

<?php 

/** 
* MAGENTO MASS IMPORTER CLI SCRIPT 
* 
* version : 0.1 
* author : S.BRACQUEMONT aka dweeves 
* updated : 2010-08-02 
* 
*/ 

require_once(dirname(dirname(__FILE__))."/inc/magmi_defs.php"); 
require_once('magmi_loggers.php'); 
$script=array_shift($argv); 

function buildOptions($argv) 
{ 
    $options=array(); 
    foreach($argv as $option) 
    { 
     $isopt=$option[0]=="-"; 

     if($isopt) 
     { 
      $optarr=explode("=",substr($option,1),2); 
      $optname=$optarr[0]; 
      if(count($optarr)>1) 
      { 
       $optval=$optarr[1]; 
      } 
      else 
      { 
       $optval=1; 
      } 
      $options[$optname]=$optval; 
     } 
    } 
    return $options; 
} 


function getClassInstance($cval,$cdir=".") 
{ 
    $cdef=explode(":",$cval); 
    $cname=$cdef[0]; 
    $cclass=$cdef[1]; 
    $cinst=null; 
    $cfile="$cdir/$cname.php"; 
    if(file_exists($cfile)) 
    { 
     require_once($cfile); 
     if(class_exists($cclass)) 
     { 
      $cinst=new $cclass();    
     } 
    } 
    if($cinst==null) 
    { 
    die("Invalid class definition : ".$cval); 
    } 
    return $cinst; 

} 

function getEngineInstance($options) 
{ 
    if(!isset($options["engine"])) 
    { 
     $options["engine"]="magmi_productimportengine:Magmi_ProductImportEngine"; 
    } 
    $enginst=getClassInstance($options["engine"],dirname(dirname(__FILE__))."/engines"); 
    return $enginst; 
} 

$options=buildOptions($argv); 
$importer=getEngineInstance($options); 
if(isset($importer)) 
{ 
    $loggerclass=isset($options['logger'])?$options['logger']:"FileLogger"; 
    $importer->setLogger(new $loggerclass()); 
    if(!isset($options["chain"])) 
    { 
     $options["chain"]=isset($options["profile"])?$options["profile"]:""; 
     $options["chain"].=isset($options["mode"])?":".$options["mode"]:""; 
    } 
    $pdefs=explode(",",$options["chain"]); 
    foreach($pdefs as $pdef) 
    { 
     $pm=explode(":",$pdef); 
     $eargv=array(); 
     if(!empty($pm[0])) 
     { 
      $eargv[]="-profile=".$pm[0]; 
     } 
     if(isset($pm[1])) 
     { 
      $eargv[]="-mode=".$pm[1]; 
     } 
     $eoptions=buildOptions($eargv); 
     $importer->run(array_merge($eoptions,$options)); 
    } 
} 
?> 

У меня нет точного SSH поскольку он находится в коде компонента SSIS. «Многословный» журнал производит показывает, что это:

2015-09-18 16:36:13.459 VERBOSE SshSession(1)[6] SSH: Received packet SSH_MSG_USERAUTH_SUCCESS (1 bytes). 
0000 |34            | 4 
2015-09-18 16:36:13.459 DEBUG SshSession(1)[6] SSH: Authentication successful. 
2015-09-18 16:36:13.459 VERBOSE SshSession(1)[6] SSH: Sending packet SSH_MSG_CHANNEL_OPEN (24 bytes). 
0000 |5A-00-00-00-07-73-65-73 73-69-6F-6E-00-00-00-00| Z....session.... 
0010 |00-02-00-00-00-00-40-00      | [email protected] 
2015-09-18 16:36:13.490 VERBOSE SshSession(1)[6] SSH: Received packet SSH_MSG_CHANNEL_OPEN_CONFIRMATION (17 bytes). 
0000 |5B-00-00-00-00-00-00-00 00-00-00-00-00-00-00-80| [............... 
0010 |00            | . 
2015-09-18 16:36:13.490 DEBUG SshSession(1)[6] SSH: Executing command 'php /home/flintarm/www/store/magmi-importer/cli/magmi.cli.php -profile=Category -mode=create -logger=CLILogger'. 
2015-09-18 16:36:13.490 VERBOSE SshSession(1)[6] SSH: Sending packet SSH_MSG_CHANNEL_REQUEST (128 bytes). 
0000 |62-00-00-00-00-00-00-00 04-65-78-65-63-01-00-00| b........exec... 
0010 |00-6E-70-68-70-20-2F-68 6F-6D-65-2F-66-6C-69-6E| .nphp /home/flin 
0020 |74-61-72-6D-2F-77-77-77 2F-73-74-6F-72-65-2F-6D| tarm/www/store/m 
0030 |61-67-6D-69-2D-69-6D-70 6F-72-74-65-72-2F-63-6C| agmi-importer/cl 
0040 |69-2F-6D-61-67-6D-69-2E 63-6C-69-2E-70-68-70-20| i/magmi.cli.php 
0050 |2D-70-72-6F-66-69-6C-65 3D-43-61-74-65-67-6F-72| -profile=Categor 
0060 |79-20-2D-6D-6F-64-65-3D 63-72-65-61-74-65-20-2D| y -mode=create - 
0070 |6C-6F-67-67-65-72-3D-43 4C-49-4C-6F-67-67-65-72| logger=CLILogger 
2015-09-18 16:36:13.537 VERBOSE SshSession(1)[6] SSH: Received packet SSH_MSG_CHANNEL_WINDOW_ADJUST (9 bytes). 
0000 |5D-00-00-00-00-00-20-00 00      | ]..... .. 
2015-09-18 16:36:13.537 VERBOSE SshSession(1)[6] SSH: Received packet SSH_MSG_CHANNEL_SUCCESS (5 bytes). 
0000 |63-00-00-00-00         | c.... 
+0

Показать команды SSH, который вы выполняющийся. – Barmar

+1

Несколько вещей, которые вы можете изменить в своем вопросе: какая команда отправляется через SSH? Под «стартом php» вы подразумеваете, что он запускает скрипт? Или просто PHP вообще? Если сценарий запущен, попробуйте 'print_r ($ argv)', чтобы вы могли видеть, как PHP видит передаваемые аргументы. Возможно, все они объединены в первом аргументе или полностью отсутствуют, в зависимости от того, какая команда отправляется через SSH. –

+0

Я обновил сообщение, чтобы показать журнал из SSIS SSH addon – user1005246

ответ

0

При запуске без интерактивного сеанса, другой набор сценариев начальной загрузки, запуска и/или различные пути в скриптах принимаются (на основе TTY переменной) ,

Так что ваша окружающая среда может (скорее всего, будет) отличаться.

Это может повлиять на выполнение скрипта PHP. В вашем случае у вас может быть не включен register_argc_argv. Таким образом, $argv не установлен.

Я предлагаю вам переписать сценарий, чтобы не полагаться на нестандартные настройки PHP. В частности, используйте $_SERVER["argv"] вместо .

Или положите phpinfo() в начале вашего скрипта, запустите его как в интерактивном режиме, так и в интерактивном режиме, и посмотрите, что вызывает разницу в конфигурации PHP. Затем исправьте сценарии запуска, чтобы установить одну и ту же конфигурацию PHP для интерактивных и неинтерактивных сеансов.


Или, если вы не хотите возиться со сценарием, поставить это в самом начале:

$argv = $_SERVER["argv"]; 
+0

Я попробовал параметр -n. Он должен был использовать настройки по умолчанию, позволяющие register_argc_argv быть активными, и это не сработало. I AM DONE messing с этим не нужно .. в скрипте PHP .. как я могу переопределить аргументы, которые переданы и предоставить мои собственные вручную в скрипте? – user1005246

+0

По умолчанию параметр 'register_argc_argv' отключен. –

+0

В любом случае, как насчет копирования '$ _SERVER [" argv "]' в '$ argv'. См. Мой отредактированный ответ. –