Mam pewien problem z przerzucaniem plików na serwer, kod wygląda następująco:
$archive="report-666";
$ds=array(0=>array("pipe","r"),1=>array("pipe", "w"),2=>array("pipe","w"));
$env=array();
$cmd="sftp -i ./key.ssh -o \"StrictHostKeyChecking=no\" -o \"UserKnownHostsFile=/dev/null\" user@localhost 2>&1";
echo "cmd=$cmd\n";
$process=proc_open($cmd,$ds,$pipes,'./',$env);
if(is_resource($process))
{
$stdin=$pipes[0];
$stdout=$pipes[1];
$stderr=$pipes[2];
sleep(30);
fwrite($stdin,"binary\n");
sleep(10);
echo "out: ".stream_get_contents($stdout);
echo "err: ".stream_get_contents($stderr);
fwrite($stdin,"cd upload\n");
sleep(10);
echo "out: ".stream_get_contents($stdout);
echo "err: ".stream_get_contents($stderr);
fwrite($stdin,"mkdir $archive\n");
sleep(10);
echo "out: ".stream_get_contents($stdout);
echo "err: ".stream_get_contents($stderr);
fwrite($stdin,"cd $archive\n");
sleep(10);
echo "out: ".stream_get_contents($stdout);
echo "err: ".stream_get_contents($stderr);
fwrite($stdin,"mkdir master\n");
sleep(10);
echo "out: ".stream_get_contents($stdout);
echo "err: ".stream_get_contents($stderr);
fwrite($stdin,"cd master\n");
sleep(10);
echo "out: ".stream_get_contents($stdout);
echo "err: ".stream_get_contents($stderr);
foreach($files as $add)
{
fwrite($stdin,"rm \"$add\"\n");
sleep(10);
echo "out: ".stream_get_contents($stdout);
echo "err: ".stream_get_contents($stderr);
fwrite($stdin,"put \"$add\"\n");
sleep(10);
echo "out: ".stream_get_contents($stdout);
echo "err: ".stream_get_contents($stderr);
}
fwrite($stdin,"bye\n");
sleep(10);
echo "out: ".stream_get_contents($stdout);
echo "err: ".stream_get_contents($stderr);
fclose($stdout);
fclose($stdin);
fclose($stderr);
$ret=proc_close($process);
echo "ret=$ret\n";
}
Jak widać podałem sleep(10);
wszędzie ale czasami brakuje tego czasu, jednak nie chce wszędzie dawać 60 sek z wiadomych przyczyn.
Z tym że jak ręcznie robię to w sftp to tam gdzie jest sleep(10);
wystarczy poczekać aż sftp wypisze sftp>
.
Próbowałem to zorganizować czyli najpierw odczytać 5 znaków z $stdout
(te sftp>
) ale niestety w żaden sposób się nie udało tego zrobić.
Próbowałem warianty:
-
fgets($stdout)
-
while(...) fgetc($stdout)
-
fread($stdout,5)
Nie mogę również użyć batch formy, ponieważ sftp przerywa batch po pierwszym błędzie, więc:
przy pierwszym ładowaniu padnie na fwrite($stdin,"rm \"$add\"\n");
(bo jeszcze go tam nie ma)
zaś przy kolejnych padnie na fwrite($stdin,"mkdir $archive\n");
(bo folder już istnieje)
Jakieś sugestie?