开发者

ssh2_exec() wont change directory with "cd"

开发者 https://www.devze.com 2023-02-02 20:48 出处:网络
I have a problem with ssh_exec() refusing to execute the \"cd\" command. If I log into the server directly and execute the command, it works fine, so I don\'t think the problem is with my command.

I have a problem with ssh_exec() refusing to execute the "cd" command.

If I log into the server directly and execute the command, it works fine, so I don't think the problem is with my command.

My code is as follows:

$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');
开发者_Go百科$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);

I am logged in as root.

The first command runs correctly and copies the file to the location. The second command doesn't execute, but outputs no errors. The third command displays an error (obviously as the previous cd command doesn't work).

I know it hasn't changed dirs, as when I execute the "pwd", it returns saying it is in the root dir still.

As mentioned before, if I run the commands from shell, they execute fine, so I'm 99.9% sure my syntax is correct.

This is a dedicated server provided by 1&1, running CentOS and Plesk 9.


To execute ssh2_exec() PHP starts a process that will perform a ssh executed on the remote server.

The shell process created remotely has its own environment, including the current working directory.
The cd command will change the working directory of the shell that was started by your second command.

When that second command ends, the shell dies with it. Along with the working dir information.

In other terms, the shell environment of the command N will not be remembered during the execution of command N+1.

If you want the shell commands to be working while depending on each other in terms of environment, you should put several commands in a unique ssh2_exec like

 $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

精彩评论

暂无评论...
验证码 换一张
取 消