我正在使用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()
附加。