Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP script hangs after exec command

I'm new to PHP and the phpseclib implementation of SSH.

I have the following code :

$ssh = new Net_SSH2($_SESSION['targetAddress']);
if (!$ssh->login(SSH_USER, SSH_PASSWORD)) {
    exit('Login Failed');
} 

$ssh->setTimeout(400);
$a = 0;

while(isset($file[$a])) {
    $ssh->exec('cd '.$_SESSION['path'].'; find -L '.$file[$a].' > /tmp/ligacoes; for i in `cat /tmp/ligacoes`; do cp $i /var/tmp/; done');
    $a++;
}

What I am trying to accomplish here is to copy files chosen by user on a remote server to a new directory on the same server. When executing the script, it successfully find and copy the first file to the new directory, but after that the script just stops. Even if the user choose just one item the script hangs and does not continue. It doesn't even increment $a

Any thoughts on what may be happening ?

UPDATE:

Real Time NET_SSH2 Log

I also ran the command directly in the server and it works perfectly. I guess the issue is limited to $ssh->exec();

UPDATE 2:

I changed my $ssh->exec('cd '.$_SESSION['path'].'; find -L '.$file[$a].' > /tmp/ligacoes; for i in 'cat /tmp/ligacoes'; do cp $i /var/tmp/; done'); to $ssh->exec('cd '.$_SESSION['path'].'; cp '.$file[$a].' /var/tmp;'); and that solved part of the problem. Now I am able to copy one selected file to a new directory and the script does not hang. The issue keeps happening when two or more files are selected.

like image 590
Murilo Komirchuk Avatar asked Apr 07 '26 07:04

Murilo Komirchuk


1 Answers

Things that may help:

  1. $ssh->exec echos both stdout and stderr. Check those.
  2. Try just echo $ssh->exec('echo hello');
  3. Connect manually first to be sure the "The authenticity of host...Are you sure you want to continue connecting?" has been accepted.
  4. Be certain to **check each of your commands manually to be sure they work before piping them through your script.
  5. Put one example of your commands in a bash file and try to execute only the bash file. If that works, you may be able to send the variables via exec() to the bash file for processing. Something like:

mybash.sh

cd /example/path/; 
find -L example_file > /tmp/ligacoes;
for i in `cat /tmp/ligacoes`;
do cp $i /var/tmp/;
done

and in your php

$ssh->exec('mybash.sh');

If that works, then you can expand it to send variables

cd $1; 
find -L $2 > /tmp/ligacoes;
for i in `cat /tmp/ligacoes`;
do cp $i /var/tmp/;
done

calling it like this where $_SESSION['path'] will be $1:

$ssh->exec('mybash.sh '.$_SESSION['path'].' '.$file[$a]);
like image 88
WEBjuju Avatar answered Apr 09 '26 19:04

WEBjuju