2017-05-16 13 views
0

Mit PHP muss ich regelmäßig einen Remote-Befehl auf einem Draytek 2925 Router mit SSH ausführen.php - ssh2_exec fehlgeschlagen Zuordnung pty

Ich kann bereits eine Verbindung zum Router mit dem Standard-Befehl "ssh" unter Linux, aber nach der Authentifizierung bekomme ich "PTY-Zuweisung Anfrage auf Kanal 0 fehlgeschlagen". Trotz dieser Nachricht kann ich trotzdem Befehle senden.

Wenn ich versuche, das gleiche mit PHP zu tun, bekomme ich 1 von 2 Ergebnissen, von denen keines die Ergebnisse liefert, die ich brauche.

Mein Code ist wie folgt:

<? 
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(); 
} 
?> 

Die PHP versagt bei ssh2_exec(). Wenn ich das dritte Argument (pty) angeben, erhalte ich dieses Ergebnis:

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

jedoch nicht die dritte Argument Ergebnisse bei der Angabe:

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

Auch wenn ich @ ssh2_exec Typ(), I don Ich bekomme keine Warnung, aber ich bekomme auch kein Ergebnis.

Wenn PHP ein No-Go ist, habe ich versucht, sshpass in der gleichen Art und Weise verwenden, aber das ergibt sich folgende:

# sshpass -f sshpwd -v ssh [email protected] 'sys version' 
SSHPASS searching for password prompt using match "assword" 
SSHPASS read: [email protected]'s password: 
SSHPASS detected prompt. Sending password. 
SSHPASS read: 

exec request failed on channel 0 
# 

ich schließlich müssen nur authentifizieren, einen Befehl und geben das Ergebnis zu senden. Gibt es irgendetwas, was ich falsch mache oder gibt es einen einfacheren Weg?

Antwort

0

Ich habe meine Abfrage gelöst, indem Sie stattdessen TELNET verwenden. Ja, es ist nicht sicher wie SSH, aber da es intern über das LAN verwendet wird, spielt es keine Rolle.

Für alle Interessierten, benutzte ich Net_Telnet und den folgenden Code:

<?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(); 
?> 

was zur Folge hat:

# 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 

> 
#