当前位置: 首页 > 知识库问答 >
问题:

PHP脚本在exec命令后挂起

石超
2023-03-14

我是PHP和phpseclib实现的新SSH。

我有以下代码:

$ssh = new Net_SSH2($_SESSION['targetAddress']);
if (!$ssh->login(SSH_USER, SSH_PASSWORD)) {
    exit('Login Failed');
} 

$ssh->setTimeout(400);
$a = 0;

while(isset($file[$a])) {
    $ssh->exec('cd '.$_SESSION['path'].'; find -L '.$file[$a].' > /tmp/ligacoes; for i in `cat /tmp/ligacoes`; do cp $i /var/tmp/; done');
    $a++;
}

我在这里试图完成的是将用户在远程服务器上选择的文件复制到同一服务器上的新目录。在执行脚本时,它成功地找到第一个文件并将其复制到新目录,但之后脚本就停止了。即使用户只选择了一个项目,脚本也会挂起并且不会继续。它甚至不增加$a

对可能发生的事情有什么想法吗?

更新:

实时NET_SSH2日志

我还直接在服务器上运行了这个命令,它工作得非常好。我想问题只限于$ssh-

更新2:

我改变了我的$ssh-


共有2个答案

师谦
2023-03-14

下面是超时的工作方式w. r. t. exec()。

exec()方法的第一行是:

$this->curTimeout = $this->timeout;

稍后会有一个而(true)循环,其中包含以下行:

$temp = $this->_get_channel_packet(self::CHANNEL_EXEC);

_get_channel_packet也有一个而(true)循环。它循环,直到超时或在适当的通道上接收数据。这是超时代码:

        if ($this->curTimeout) {
            if ($this->curTimeout < 0) {
                $this->is_timeout = true;
                return true;
            }
            $read = array($this->fsock);
            $write = $except = null;
            $start = microtime(true);
            $sec = floor($this->curTimeout);
            $usec = 1000000 * ($this->curTimeout - $sec);
            // on windows this returns a "Warning: Invalid CRT parameters detected" error
            if (!@stream_select($read, $write, $except, $sec, $usec) && !count($read)) {
                $this->is_timeout = true;
                return true;
            }
            $elapsed = microtime(true) - $start;
            $this->curTimeout-= $elapsed;
        }

stream_select块,直到可以读取数据。根据您的SSH服务器的行为,它可以很好地阻止400秒。谁知道呢...也许在你的系统stream_select会在400秒前崩溃。

也就是说,在该函数上启用了错误抑制功能,如stream\u select调用上方的注释所述。您可以删除错误抑制,这可能会提供一些见解。

此外,请记住,超时只是跟踪数据可用所需的时间。例如,解密所需的时间不计入超时。

例如

$ssh->write("cat /dev/urandom\n");

$ssh->setTimeout(10);
$start = microtime(true);
echo $ssh->exec('ping google.com');
$elapsed = microtime(true) - $start;

echo "took $elapsed seconds\n";

我这样做了,$ssh-

商焕
2023-03-14

可能有帮助的事情:

  1. $ssh-

mybash.sh

cd /example/path/; 
find -L example_file > /tmp/ligacoes;
for i in `cat /tmp/ligacoes`;
do cp $i /var/tmp/;
done

在你的php中

$ssh->exec('mybash.sh');

如果这样做有效,那么您可以将其展开以发送变量

cd $1; 
find -L $2 > /tmp/ligacoes;
for i in `cat /tmp/ligacoes`;
do cp $i /var/tmp/;
done

$\u会话['path']中这样调用它将是$1

$ssh->exec('mybash.sh '.$_SESSION['path'].' '.$file[$a]);

 类似资料:
  • 我目前有一个PHP页面,我的网络服务器服务。为了显示我需要在页面上显示的所有信息,我需要从外部python脚本输出。所以我一直在使用php的exec()命令来执行python脚本,并捕获字符串数组中的输出,如下所示: 然而,从来没有任何要打印的条目,但是当我直接在服务器的控制台上运行该命令时,它将正确输出。我已经尝试在我正在执行的网页上回显命令,这是正确的命令。我认为它唯一能做的就是exec()不

  • 按照在CMD之前执行脚本的建议(我需要在容器重新启动之前清除一个临时dir,以修复一个bug),我将docker文件从使用CMD修改为entrypoint,如下所示: 并且在入口点文件中,在rm-rf命令之后结束: 但是docker无法启动容器,它退出,容器日志显示:

  • 我正在处理我的一个项目。我正在windows机器上使用XAMPP开发该项目。这就是我面临的问题。我需要在服务器上执行shell脚本,并在网页上显示结果。问题是,大多数脚本都按预期运行,但我无法获得以下命令的输出:, ls, cat, pwd 因为这些命令返回给我一个空白数组。 我找不到确切的问题。

  • 对不起,英语不好。。 我有这样的php文件: 这是剧本: 现在当加载文件时。对于浏览器,脚本可以工作,但只执行wget和sed命令,cp不工作。。不复制文件!如果我手动运行脚本到终端(Debian 8),所有cmd都会执行。。。问题在哪里?谢谢约勒

  • 问题内容: 我试图通过Linux中的命令行在后台连续运行PHP脚本。我已经尝试过该命令,但是脚本执行似乎很快终止,而脚本应继续运行直到该过程终止。 有什么建议么? 问题答案: 您确定脚本不包含任何错误吗?这就是通常使“ 执行很快终止 ”的原因。 首先,附加: 在脚本顶部显示可能存在的任何错误,然后可以使用: 即使会话断开连接或用户注销,nohup也会运行命令。 要么 与上述相同,但不创建文件。 您

  • 问题内容: 如何从PHP脚本运行linux命令?我正在运行Linux Debian和PHP5。我希望能够向控制台发出命令。 我正在寻找的示例如下所示: 我还能回显该函数的输出吗? 问题答案: 使用运行任何命令。但是请注意不要执行任何用户输入,因为这可能严重损害服务器。 另外,请注意,大多数共享服务器都会阻止该功能,因此您将无法使用它。 最后,作为一种简写,您可以将要执行的命令包装在反引号中。