【问题标题】:Is read() necessary before write() with SSH via PHPSecLib?在通过 PHPSecLib 使用 SSH 进行 write() 之前是否需要 read()?
【发布时间】:2014-08-27 13:07:08
【问题描述】:

我编写了一个小脚本,通过write() 向一台Linux 机器发出一系列命令,每个命令之间有5 秒sleep()。手动输入时完全相同的命令有效,但尽管连接成功,但从 PHP 脚本中使用时似乎无效。

既然如此,我很好奇在发出write() 命令之前使用read() 是否绝对必要?

<?php

include('Net/SSH2.php');

    $serverhostname = "IP_HERE";
    $ssh_username = "root";
    $ssh_password = "PASS_HERE";

    // Establish new SSH2 Connection
    $connection = new Net_SSH2($serverhostname, 22);

    if($connection->login($ssh_username, $ssh_password))
    {
        echo "LOGGED IN! </br>";

        sleep(5);

        $result = $connection->write('en PASS_HERE\r\n');
        echo "RESULT: " . $result . " </br>";

        sleep(5);

        $result = $connection->write('configure terminal\r\n');
        echo "RESULT: " . $result . " </br>";

        sleep(5);

        $result = $connection->write('interface ve 110\r\n');
        echo "RESULT: " . $result . " </br>";

        sleep(5);

        $result = $connection->write('port-name Test_Brett\r\n');
        echo "RESULT: " . $result . " </br>";
    }
    else
    {
        echo "SSH Connection Failed. Check that the remote host is online and accepting connections!";
    }

?>

更新

$result = $connection->write('en PASS_HERE\n');
$result = $connection->write('configure terminal\n');
$result = $connection->write('interface ve 110\n');
$result = $connection->write('port-name Test_Brett\n');
$connection->setTimeout(5);
echo $connection->read();

【问题讨论】:

  • 这里发送\r\n是否正确?当您以交互方式执行此操作时,您可能会按下我希望只发送 \r 的回车键。
  • 根据我的经验,您需要发送的是 \n - 而不是 \r。
  • 我正在尝试使用“\n”、“\r”和“\r\n”。文档说它将是取决于操作系统的 3 个之一,但我只是碰巧在此处设置了“\r\n”。在大多数情况下,我只使用“\n”进行测试。

标签: php linux ssh phpseclib libssh2


【解决方案1】:

我刚刚这样做了:

$connection->write("ls -la\n");
$connection->write("pwd\n");
$connection->setTimeout(5);
echo $connection->read();

在两个write() 之间没有read() 的情况下,它似乎可以很好地执行命令。但也可能是read() 必须在最后完成,即使只是一次。

如果我是你,我会做的不是sleep(5),而是$connection-&gt;setTimeout(5); $connection-&gt;read();。你可以扔掉read()的返回值。如果您知道会发生什么,您可以使用$connection-&gt;read('pattern'),这样会更快,但如果您不这样做,为了安全起见,我会使用$connection-&gt;setTimeout(5); 路线。

【讨论】:

  • 我尝试过(也将我使用的代码添加到原始帖子中)进行所有写入,然后设置超时并读取。我也尝试使用 echo $connection->read();每次写之前也是如此。这两种方式都会导致“注意:在第 2303 行的 /public_html/brocade/Net/SSH2.php 中的连接过早关闭”,所以我很困惑。
  • 我想查看成功连接和失败连接的日志会有所帮助。您可以通过在文件顶部执行 define('NET_SSH2_LOGGING', 3); 来获取日志。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-22
相关资源
最近更新 更多