proc_open互动(proc_open interaction)

2019-06-23 12:31发布

这里就是我想要实现:打开一个shell(科恩或bash,无所谓),从外壳,我想开一个ssh连接( ssh user@host )。 在某些时候,它很可能发生,我会被提示输入密码或我可能会问是否我敢肯定,我想连接(违规键)。

有人问前:是的,我知道有对SSH2 exec调用插件,但我工作的服务器不支持它,而且不太可能这样做。

以下是我试过到目前为止:

$desc = array(array('pipe','r'),array('pipe','w'));//used in all example code
$p = proc_open('ssh user@host',$desc,$pipes);
if(!is_resource($p)){ die('@!#$%');}//will omit this line from now on
sleep(1);//omitting this,too but it's there every time I need it

然后我试图读取控制台输出( stream_get_contents($pipes[1])看看有什么我必须要通过下一个(或密码,是或返回'connection failed: '.stream_get_contents($pipes[1])和proc_close $ P 。

这给了我以下错误:

伪终端不会被分配,因为标准输入不是终端。

所以,我虽然SSH被称为在php:// IO流背景下,似乎出现上述错误的一个合理的解释。

下一页:我虽然对我的第一个问题,SO ,并决定它可能是一个好主意,先打开一个bash / KSH的Shell:

$p = proc_open('bash',$desc,$pipes);

并从那里,但我得到了确切的相同的错误消息,只是这一次,该脚本停止运行,但没有SSH运行。 所以,我希望,然后就觉得自己很笨,最终绝望:

$p=proc_open('bash && ssh user@host',$desc,$pipes);

几秒钟后,等待,我得到了以下错误:

PHP致命错误:用尽134217728个字节允许存储器大小(试图分配133693440个字节)

调用堆栈保持造就了stream_get_contents线,即使在我的最后愿望:

#!/path/to/bin/php -n
<?php
    $p = proc_open('bash && ssh user@host',array(array('pipe','r'),array('pipe','w')),$ps);
    if (!is_resource($p))
    {
        die('FFS');
    }
    usleep(10);
    fwrite($ps[0],'yes'."\n");
    fflush($ps[0]);
    usleep(20);
    fwrite($ps[0],'password'."\n");
    fflush($ps[0]);
    usleep(20);
    fwrite($ps[0],'whoami'."\n");
    fflush($ps[0]);
    usleep(2);
    $msg = stream_get_contents($ps[1]);
    fwrite($ps[0],'exit'."\n");
    fclose($ps[0]);
    fclose($ps[1]);
    proc_close($p);
?>

我知道,它的一个烂摊子,很多fflush和冗余性,但问题是:我知道这方面首先会提示我要得罪键,然后问密码。 我的猜测是在$管道流[1]持有SSH连接,因此它的内容是巨大的。 我需要的话,就是一个管道管内...这甚至可能吗? 我必须失去了一些东西,有什么好是管,如果这是不可能的......我的猜测是proc_open命令是错误的,开始(错误:中断的管道)。 但我实在看不出任何其他方式的第一个错误...任何想法? 或后续的问题,如果上述言论是完全不清楚(它可能不是)。

Answer 1:

有人问前:是的,我知道有对SSH2 exec调用插件,但我工作的服务器不支持它,而且不太可能这样做。

实际上有两个。 该PECL模块,这是大多数服务器没有安装反正皮塔和phpseclib,纯PHP SSH2实现 。 其使用的一个例子:

<?php
include('Net/SSH2.php');

$ssh = new Net_SSH2('www.domain.tld');
if (!$ssh->login('username', 'password')) {
    exit('Login Failed');
}

echo $ssh->exec('pwd');
echo $ssh->exec('ls -la');
?>


文章来源: proc_open interaction