ssh2_exec () не изменит каталог с помощью "cd" - PullRequest
6 голосов
/ 07 января 2011

У меня проблема с ssh_exec() отказом выполнить команду "cd".

Если я захожу на сервер напрямую и выполняю команду, она работает нормально, поэтому я не думаю, что проблемас моей командой.

Мой код выглядит следующим образом:

$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);

Я вошел в систему как пользователь root.

Первая команда выполняется правильно и копирует файл вместо нахождения.Вторая команда не выполняется, но не выдает ошибок.Третья команда отображает ошибку (очевидно, поскольку предыдущая команда cd не работает).

Я знаю, что она не изменила dirs, так как, когда я выполняю «pwd», она возвращает сообщение о том, что она находится вroot dir still.

Как уже упоминалось ранее, если я запускаю команды из оболочки, они выполняются нормально, поэтому я на 99,9% уверен, что мой синтаксис правильный.

Это выделенный сервер, предоставленныйна 1 & 1, работает CentOS и Plesk 9.

1 Ответ

14 голосов
/ 07 января 2011

Для выполнения ssh2_exec() PHP запускает процесс, который будет выполнять ssh, выполняемый на удаленном сервере.

Удаленный процесс оболочки имеет свою собственную среду, включая текущий рабочий каталог.
Команда cd изменит рабочий каталог shell, который был запущен вашей второй командой.

Когда эта вторая команда заканчивается, оболочка умирает вместе с ней. Вместе с информацией о рабочем каталоге.

Другими словами, команда n оболочка среды не запомнится при выполнении команды n + 1 .

Если вы хотите, чтобы команды оболочки работали и зависели друг от друга с точки зрения среды, вы должны поместить несколько команд в уникальный ssh2_exec, такой как

 $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);
...