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

过程开放式交互

姜卜霸
2023-03-14

下面是我试图实现的:打开一个shell(korn或bash,没关系),从该shell,我想打开一个ssh连接(sshuser@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\u get\u contents($pipes[1])),查看下一步必须传递的内容(密码,yes或返回'connection failed:')。stream\u get\u contents($pipes[1])和proc\u close$p。

这给了我以下错误:

不会分配伪终端,因为stdin不是终端。

所以,我认为ssh是在php://io-stream上下文中调用的,似乎是上述错误的合理解释。

接下来:我考虑了我的第一个SO问题,并决定首先打开bash/ksh shell可能是个好主意:

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

从这里开始,我得到了完全相同的错误消息,只是这一次,脚本停止运行,但是ssh确实运行了。所以我满怀希望,然后觉得自己很愚蠢,最后绝望了:

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

等待几秒钟后,我出现以下错误:

PHP致命错误:允许内存大小为134217728字节耗尽(尝试分配133693440字节)

即使在我最后一次孤注一掷的尝试中,调用堆栈也会不断打开stream\u get\u 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和冗余,但问题是:我知道这个连接将首先提示我有问题的密钥,然后询问密码。我猜$pipes[1]中的流持有ssh连接,因此它的内容是巨大的。我需要的是一根管子里面的管子。。。这可能吗?我一定错过了什么,如果这不可能,烟斗有什么用。。。我猜proc_open命令一开始就错了,(错误:管道断裂)。但我真的看不到任何其他方法来解决第一个错误。。。有什么想法吗?或者,如果上面的咆哮一点也不清楚(很可能不清楚),就跟进问题。

共有1个答案

夏侯英纵
2023-03-14

在有人问之前:是的,我知道有一个ssh2 exec调用插件,但是我正在使用的服务器不支持它,也不太可能这样做。

实际上有两个。PECL模块是大多数服务器都没有安装的PITA,phpseclib是一个纯phpsh2实现。其使用示例如下:

<?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');
?>
 类似资料:
  • 本文向大家介绍ruby开发的交互式程序例子,包括了ruby开发的交互式程序例子的使用技巧和注意事项,需要的朋友参考一下 实现pry,ronin,msf类似的终端下交互功能,这里主要用到了ripl gem: 1.能够调用定义的方法,如help 2.能够执行系统命令 3.能够类似irb/pry进行ruby语言解析 安装: 示例 ripl这个gem,它也提供很多插件,如下是一个简单的终端下交互实现: 使

  • 我知道当我在Openssl中使用CBC模式时,我可以给出一个块大小的倍数作为输入。但其他模式呢?ECB,CFB,OFB?我看到了一个医生,但我并不完全清楚。我应该打电话给他们吗? 比如说欧洲央行。它一次加密64位。所以伪代码应该是这样的(应该是这样的)? 但是上面的代码并不好。当我将更改为时,没关系。有什么好方法可以做到这一点?我的意思是,我们都知道8x8=64位,所以这应该是正确的,但事实并非如

  • 我有一个问题,在IE和边缘浏览器与使用'Open Sans'字体,在本地. css文件中定义。 open-sans.html: 在Chrome或FF中,我看到了正确的字体(本地我没有安装“开放式SAN”;OS-Windows10)。。。在IE/Edge中-字体不起作用。但是,如果我删除了指向open-sans.css的链接,并将使用指向font.googleapis.com的链接,那么IE/Edg

  • 过程管理/生命周期 瀑布式开发 PCM RUP 敏捷开发 Agile & Scrum 硝烟中的Scrum和XP(http://www.infoq.com/cn/minibooks/scrum-xp-from-the-trenches) Kanban

  • 学习各种组件和工具帮助你对Django应用进行改进和测试:

  • 我想创建一个到RabbitMQ的Openshift路径。 据我了解https://docs.openshift.com/container-platform/3.11/architecture/networking/routes.html,“TLS with SNI”支持应该能够检查SNI标头,然后将流量路由到适当的服务。 不幸的是,我在边缘终止和重新加密终止方面都遇到了问题。在这两种情况下,HA