繁体   English   中英

ssh2_exec分配pty失败

[英]php - ssh2_exec failed allocating pty

使用PHP,我需要使用SSH在Draytek 2925路由器上定期执行远程命令。

我已经可以在Linux上使用标准的“ ssh”命令连接到路由器,但是在进行身份验证之后,我收到“通道0上的PTY分配请求失败”的信息。 但是,尽管有该消息,我仍然可以发送命令。

当我尝试使用PHP进行相同操作时,我得到2个结果中的1个,但都没有返回我需要的结果。

我的代码如下:

<?
if (!($connection = ssh2_connect('my.router.local', 22)))
    die('CONN');
else if (!ssh2_auth_password($connection, 'admin', 'password'))
    die('AUTH');
else
{
    $stream = ssh2_exec($connection, 'sys version');
    stream_set_blocking($stream, true);
    $stream_out = ssh2_fetch_stream($stream, SSH2_STREAM_STDIO);
    echo stream_get_contents($stream_out);
    exit();
}
?>

PHP在ssh2_exec()处失败。 如果指定第三个参数(pty),则会得到以下结果:

Warning: ssh2_exec(): Failed allocating 1 pty at 80x25 characters

但是,不指定第三个参数会导致:

Warning: ssh2_exec(): Unable to request command execution on remote host

即使我输入@ ssh2_exec(),也不会收到警告,但也不会得到结果。

如果PHP不可行,我尝试以相同的方式使用sshpass,但是结果如下:

# sshpass -f sshpwd -v ssh admin@my.router.local 'sys version'
SSHPASS searching for password prompt using match "assword"
SSHPASS read: admin@my.router.local's password:
SSHPASS detected prompt. Sending password.
SSHPASS read:

exec request failed on channel 0
#

我最终只需要进行身份验证,发送命令并返回结果。 我做错了什么吗?还是有更简单的方法?

我已经改用TELNET解决了我的查询。 是的,它不像SSH一样安全,但是由于它是通过LAN内部使用的,因此没有关系。

对于感兴趣的任何人,我都使用Net_Telnet和以下代码:

<?php
require_once "Net/Telnet.php";

$router   = 'my.router.local';
$password = 'password';

try
{
    $t = new Net_Telnet($router);
    $t->connect();

    $t->login([
                  'login_prompt'  => 'Account:',
                  'login_success' => ' User login successful, expired time is "Unlimited".',
                  'login_fail'    => '% Access denied',
                  'login'         => 'admin',
                  'password'      => $password,
                  'prompt'        => "{$router}>",
              ]
    );

    echo $t->cmd('sys version');

    $t->disconnect();

    // catch any buffered data
    echo $t->get_data();
    echo "\n";
} catch (Exception $e)
{
    echo "Caught Exception ('{$e->getMessage()}')\n{$e}\n";
}

exit();
?>

结果是:

# php -f telnet.php
 sys version
Router Model: Vigor2925n    Version: 3.8.4 English
Profile version: 3.0.0    Status: 1 (0x48245e4c)
Router IP: 0.0.0.0    Netmask: 255.255.255.0
Firmware Build Date/Time: Dec 15 2016 17:26:01
Router Name: my.router.local
Revision: 61327 V384_2925

>
#

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM