这里就是我想要实现:打开一个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命令是错误的,开始(错误:中断的管道)。 但我实在看不出任何其他方式的第一个错误...任何想法? 或后续的问题,如果上述言论是完全不清楚(它可能不是)。