2011-01-07 16 views
6

Mam problem z ssh_exec() odmową wykonania polecenia "cd".ssh2_exec() nie zmienia katalogu z "cd"

Jeśli loguję się bezpośrednio do serwera i wykonuję polecenie, działa dobrze, więc nie sądzę, że problem dotyczy mojego polecenia.

Mój kod wygląda następująco:

$str = ssh2_exec($sshStream, 'cp /var/www/compressed.tar.gz /var/www/vhosts/demo-domain1.com/httpdocs/'); 
$errstr = ssh2_fetch_stream($str, SSH2_STREAM_STDERR); 
stream_set_blocking($str, true); 
stream_set_blocking($errstr, true); 
echo "Output: " . stream_get_contents($str); 
echo "Error: " . stream_get_contents($errstr); 

$str = ssh2_exec($sshStream, 'cd /var/www/vhosts/demo-domain1.com/httpdocs/'); 
$errstr = ssh2_fetch_stream($str, SSH2_STREAM_STDERR); 
stream_set_blocking($str, true); 
stream_set_blocking($errstr, true); 
echo "Output: " . stream_get_contents($str); 
echo "Error: " . stream_get_contents($errstr); 

$str = ssh2_exec($sshStream, 'tar xzf c-class.tar.gz'); 
$errstr = ssh2_fetch_stream($str, SSH2_STREAM_STDERR); 
stream_set_blocking($str, true); 
stream_set_blocking($errstr, true); 
echo "Output: " . stream_get_contents($str); 
echo "Error: " . stream_get_contents($errstr); 

jestem zalogowany jako root.

Pierwsze polecenie działa poprawnie i kopiuje plik do lokalizacji. Drugie polecenie nie wykonuje, ale nie wysyła żadnych błędów. Trzecie polecenie wyświetla błąd (oczywiście, ponieważ poprzednie polecenie cd nie działa).

Wiem, że nie zmienił katalogów, tak jak wtedy, gdy wykonuję "pwd", to powraca, mówiąc, że jest w katalogu głównym.

Jak już wspomniano, jeśli uruchamiam polecenia z powłoki, działają one poprawnie, więc mam 99,9% pewności, że moja składnia jest poprawna.

Jest to serwer dedykowany dostarczone przez 1 & 1, uruchomiony CentOS i Plesk 9.

+0

Co się dzieje, kiedy zmienić komendę 'cd/var/www/vhosts/demo-domain1.com/httpdocs/|| echo "cd failed" '? –

Odpowiedz

14

Aby wykonać ssh2_exec() PHP uruchamia proces, który wykona ssh wykonywany na serwerze zdalnym.

Utworzony zdalnie proces powłoki ma własne środowisko, w tym bieżący katalog roboczy.
Polecenie cd zmieni katalog roboczy shell, który został uruchomiony przez twoje drugie polecenie.

Po zakończeniu tego drugiego polecenia powłoka znika wraz z nim. Wraz z informacją o pracujących reżimach.

Innymi słowy, każ n powłoki środowisko nie zostanie zapamiętany w trakcie wykonywania rozkazu n + 1.

Jeśli chcesz komendy powłoki do pracy, podczas gdy w zależności od siebie pod względem środowiska, należy umieścić kilka poleceń w unikalnym ssh2_exec jak

$str = ssh2_exec($sshStream, 'cd /var/www/vhosts/demo-domain1.com/httpdocs/;' 
          . 'tar xzf c-class.tar.gz'); 

$errstr = ssh2_fetch_stream($str, SSH2_STREAM_STDERR); 
stream_set_blocking($str, true); 
stream_set_blocking($errstr, true); 
echo "Output: " . stream_get_contents($str); 
echo "Error: " . stream_get_contents($errstr); 
+0

Dzięki ring0 To działa idealnie :) –

+0

Inne odpowiedzi w Internecie były bardzo mylące, to jedno dało jasno, dlaczego nie działa. Musiałem umieścić wszystkie moje polecenia w jednym ssh2_exec zamiast w wielu, ponieważ wynikały one od siebie nawzajem. –

Powiązane problemy