【问题标题】:Why would SSH commands through Putty work differently to those via PHP's phpseclib?为什么通过 Putty 的 SSH 命令与通过 PHP 的 phpseclib 的 SSH 命令的工作方式不同?
【发布时间】: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-&gt;exec('cd /www/; ls -la') 适合你吗?

标签: php ssh putty phpseclib


【解决方案1】:

From the documentation:

连续调用 exec()

如果在交互式 shell 上完成,您收到的第一个密码的输出将(取决于您的系统设置方式)与第二个密码的输出不同。然而,上面的代码 sn-p 将产生两条相同的行。

这样做的原因是,一旦运行 exec() 并删除了通道,您对一次性 shell 所做的任何“状态更改”都会消失。

我看到两个选项。选项 1:

试试interactive shell examplesread()write() 函数,这对我来说看起来很丑。

选项 2:

将您的脚本编写为服务器上的 shell 脚本,并通过单个 $ssh-&gt;exec() 调用来调用该脚本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-27
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多