Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过PHPSecLib使用SSH在write()之前需要read()吗?_Php_Linux_Ssh_Phpseclib_Libssh2 - Fatal编程技术网

通过PHPSecLib使用SSH在write()之前需要read()吗?

通过PHPSecLib使用SSH在write()之前需要read()吗?,php,linux,ssh,phpseclib,libssh2,Php,Linux,Ssh,Phpseclib,Libssh2,我编写了一个小脚本,它通过write()向linux机器发出一系列命令,每个命令之间有5秒钟的sleep()。同样的命令在手动输入时也可以工作,但尽管连接成功,但在从PHP脚本使用时似乎不起作用 在这种情况下,我很好奇在发出write()命令之前是否绝对需要使用read() <?php include('Net/SSH2.php'); $serverhostname = "IP_HERE"; $ssh_username = "root"; $ssh_passwo

我编写了一个小脚本,它通过
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!";
    }

?>
我只是这样做了:

$connection->write("ls -la\n");
$connection->write("pwd\n");
$connection->setTimeout(5);
echo $connection->read();
而且它似乎可以很好地执行命令,在两个
write()
之间没有
read()
。但也可能是必须执行
read()
,即使最后只执行一次


如果我是你,我会做的是,而不是做
sleep(5)
do
$connection->setTimeout(5)$连接->读取()。您可以丢弃
read()
的返回值。如果你知道会发生什么,你可以做
$connection->read('pattern')
,这会更快,但是如果你不知道,我会做
$connection->setTimeout(5)路由只是为了安全。

在这里发送\r\n是否正确?当您以交互方式执行此操作时,您可能正在按enter键,我希望该键只发送\r。根据我的经验,您需要发送的是\n,而不是\r。我尝试使用“\n”、“r”和“\r\n”。文档中说,根据操作系统的不同,这将是3个选项之一,但我恰好在此处设置了“\r\n”。在大多数情况下,我只使用“\n”进行测试。我尝试过(将我使用的代码添加到原始帖子中)执行所有写入操作,然后设置超时和读取。我还尝试了使用echo$connection->read();每次写之前也要写。这两种方式都会导致在第一行write()之后出现“注意:第2303行/public_html/brocade/Net/SSH2.php中的连接过早关闭”,因此我非常困惑。我想看到成功连接和失败连接的日志会有所帮助。您可以通过执行
define('NET\u SSH2\u LOGGING',3)来获取日志位于文件顶部。
$connection->write("ls -la\n");
$connection->write("pwd\n");
$connection->setTimeout(5);
echo $connection->read();