簡體   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