【发布时间】:2015-08-12 16:26:43
【问题描述】:
我正在编写一个脚本来自动从我的 Windows 开发 PC 部署到共享托管服务器。
我得到不同的结果取决于我是通过 Putty 还是 PHP 执行命令(都在我的 PC 上运行)。
在putty中,当我通过SSH登录服务器时,可以运行如下命令:
cd /www/
ls -la #outputs contents of /www
但是当我通过 PHP 和 phpseclib 进行操作时,如下所示,任何 cd 命令都将被完全忽略:
<?php
require_once __DIR__.'/vendor/autoload.php';
use phpseclib\Net\SSH2;
$ssh = new SSH2('ssh.mydomain.com');
if (!$ssh->login('mydomain.com', 'mypassword')) {
trigger_error("Login Failed", E_ERROR);
}
echo $ssh->exec('pwd');
$ssh->exec('cd /www/');
echo $ssh->exec('pwd'); // unchanged
echo $ssh->exec('ls -la'); // does NOT output contents of /www/
echo $ssh->exec('ls /www/ -la'); // DOES output contents of /www/
在上面指定绝对 URL 是一种可接受的解决方法。但是,以下是一个主要问题。
如果我将文件 stuff.zip 上传到 /www/ 然后尝试提取它,则通过 Putty 执行以下操作:
unzip /www/stuff.zip -d /www/
但如果我通过 PHP 尝试:
echo $ssh->exec('unzip /www/stuff.zip -d /www/');
我得到错误:
解压缩:找不到或打开 /www/stuff.zip、/www/stuff.zip.zip 或 /www/stuff.zip.ZIP。
我试过chmod 777 /www/stuff.zip,但没什么区别。
如何诊断/解决此问题?
【问题讨论】:
-
您的网络服务器使用
www-data用户,检查其对/www/目录的权限。 -
我是从我的 PC 上运行 PHP 脚本,而不是在服务器上,所以如果我理解正确,这无关紧要吗?
-
啊,对不起。我没有看到您正在使用 Windows 开发环境。
-
$ssh->exec('cd /www/; ls -la')适合你吗?