下記のような流れで、fwrite()関数でコマンドを送信しようとしても、うまく出来ません。結果は
[24;41Hshow runni[24;41H[?25h[24;51H[24;51Hng-config[24;51H[?25h[24;60H2222
などと、コマンドの結果ではなく、送信したコマンドの文字列が、その間によく分からない文字が挟まれて返ってきます。
原因に見当がつきましたら、よろしくお願いします。
$connection = ssh2_connct();
$stream = ssh2_shell($connection);
fwirte($stream,"show running-config");
$output = fgets($stream);
print($output);
VT-100 の制御コードが混じっています。
□ に文字化けしている部分はエスケープコード(\x1B)です。
厳密には、制御コード毎にパターンが違いますので、
すべてに対応できるようにすべきかと思いますが
なにぶんにも資料が整わず、とりあえずではありますが
エスケープコードから始まってHで終わっている部分を正規表現で抜くという対応ではいかがでしょう?
preg_replace("/\x1B.*?H/", "", $受け取った文字列が入った変数);
もしくは
preg_replace("/^\x1B.*?H/", "", $受け取った文字列が入った変数);
対話型シェルを要求しているので、文字化けしているのではなく、端末のエコーを拾っているのだと思います。
コマンド実行完了まで sleep で待つようにしてみてはいかがでしょう。
fwirte($stream,"show running-config"); sleep(1); $output = fgets($stream);
回答ありがとうございます。
うーん、sleepで待たせても同じ結果になるようです…。
VT-100 の制御コードが混じっています。
□ に文字化けしている部分はエスケープコード(\x1B)です。
厳密には、制御コード毎にパターンが違いますので、
すべてに対応できるようにすべきかと思いますが
なにぶんにも資料が整わず、とりあえずではありますが
エスケープコードから始まってHで終わっている部分を正規表現で抜くという対応ではいかがでしょう?
preg_replace("/\x1B.*?H/", "", $受け取った文字列が入った変数);
もしくは
preg_replace("/^\x1B.*?H/", "", $受け取った文字列が入った変数);
回答ありがとうございます。
なるほど、制御コード…。それを、正規表現で抜く、という方法ですね。
上記のコードで正規表現を書いてみたのですが、うまく抜けなかったみたいです…。
ちょっと制御コードについてあまり理解していないので、分からないのですが、「\x1B」にあたる文字列は表示されたものを見る限りでは見当たらないのですが、これは何か特別なコードなのでしょうか?
また、「□に文字化けしている」という□とは任意の文字、という意味でしょうか?□も見当たらないのですが…。
何度もすみません。よろしくお願いします。
追記:
pret_replaceの一つ目の引数を変えたら抽出できました。ありがとうございました。ただ、また別の問題が出てしまいましたが…。
回答ありがとうございます。
なるほど、制御コード…。それを、正規表現で抜く、という方法ですね。
上記のコードで正規表現を書いてみたのですが、うまく抜けなかったみたいです…。
ちょっと制御コードについてあまり理解していないので、分からないのですが、「\x1B」にあたる文字列は表示されたものを見る限りでは見当たらないのですが、これは何か特別なコードなのでしょうか?
また、「□に文字化けしている」という□とは任意の文字、という意味でしょうか?□も見当たらないのですが…。
何度もすみません。よろしくお願いします。
追記:
pret_replaceの一つ目の引数を変えたら抽出できました。ありがとうございました。ただ、また別の問題が出てしまいましたが…。