phpseclib read() 获取之前的命令输出

phpseclib read() takes previous command output

我正在使用 phpseclib 将文件从远程主机复制到本地主机。在我进一步进行之前,我尝试使用交互式 shell 以便我能够理解其行为。我对当前代码中的行为感到困惑,它的 read() 函数似乎也显示了上一个命令的结果。见下文:

if (!$ssh->login("myusername", "mypwd")) { 
    exit('Login Failed');
}

$ssh->read('/.*@.*[$|#]/', NET_SSH2_READ_REGEX); 
$ssh->write("cd /tmp; ls *.csv1\n");
$output = $ssh->read('/.*@.*[$|#]/', NET_SSH2_READ_REGEX);
$ansi->appendString($output);
echo $output = htmlspecialchars_decode(strip_tags($ansi->getScreen()));

$ssh->read('/.*@.*[$|#]/', NET_SSH2_READ_REGEX); 
$ssh->write("cd /tmp; ls *.txt\n");
$txt_output = $ssh->read('/.*@.*[$|#]/', NET_SSH2_READ_REGEX);
$ansi->appendString($txt_output);
echo $txt_output = htmlspecialchars_decode(strip_tags($ansi->getScreen()));

下面是输出:

cd /tmp; ls *.csv1 ls: *.csv1: No such file or directory [user@host tmp]#

cd /tmp; ls *.csv1 ls: *.csv1: No such file or directory [user@host tmp]#cd /tmp; ls *.txt ls: *.txt: No such file or directory [user@host tmp]#

在我看来,当我的代码处理第二个命令时,它也会执行第一个命令。如何在新模式下执行第二个命令?感谢您的回复,谢谢。

所以在玩了更多代码之后,我开始意识到一种模式。在我看来,每次我想使用它时,我都需要重新初始化 ANSI

$ansi = new File_ANSI(); // <== NOTE THIS LINE
$ssh->read('/.*@.*[$|#]/', NET_SSH2_READ_REGEX); 
$ssh->write("cd /tmp; ls *.csv1\n");
$output = $ssh->read('/.*@.*[$|#]/', NET_SSH2_READ_REGEX);
$ansi->appendString($output);
echo $output = htmlspecialchars_decode(strip_tags($ansi->getScreen()));

$ansi = new File_ANSI(); // <== INITIALIZE AGAIN TO OUTPUT
$ssh->read('/.*@.*[$|#]/', NET_SSH2_READ_REGEX); 
$ssh->write("cd /tmp; ls *.txt\n");
$txt_output = $ssh->read('/.*@.*[$|#]/', NET_SSH2_READ_REGEX);
$ansi->appendString($txt_output);
echo $txt_output = htmlspecialchars_decode(strip_tags($ansi->getScreen()));

输出如下,你可以做任何你想做的事:

cd /tmp; ls *.csv1 ls: *.csv1: No such file or directory [user@host tmp]#

cd /tmp; ls *.txt ls: *.txt: No such file or directory [user@host tmp]#

希望这对外面的人有所帮助。

尝试$ansi->loadString()$ansi->appendString() 追加,顾名思义。