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()附加。