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()
追加,顾名思义。
我正在使用 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()
追加,顾名思义。