人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

streamにうまくfwrite()できない。

下記のような流れで、fwrite()関数でコマンドを送信しようとしても、うまく出来ません。結果は

show runni[?25hng-config[?25h2222

などと、コマンドの結果ではなく、送信したコマンドの文字列が、その間によく分からない文字が挟まれて返ってきます。

原因に見当がつきましたら、よろしくお願いします。

$connection = ssh2_connct();
$stream = ssh2_shell($connection);
fwirte($stream,"show running-config");
$output = fgets($stream);
print($output);

●質問者: rapuntuleru
●カテゴリ:コンピュータ インターネット
✍キーワード:24 G-con print Stream [?
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● pahoo
●35ポイント

対話型シェルを要求しているので、文字化けしているのではなく、端末のエコーを拾っているのだと思います。

コマンド実行完了まで sleep で待つようにしてみてはいかがでしょう。

fwirte($stream,"show running-config");
sleep(1);
$output = fgets($stream);
◎質問者からの返答

回答ありがとうございます。

うーん、sleepで待たせても同じ結果になるようです…。


2 ● kn1967
●35ポイント ベストアンサー

VT-100 の制御コードが混じっています。

□ に文字化けしている部分はエスケープコード(\x1B)です。

ANSI/VT100 Terminal Control


厳密には、制御コード毎にパターンが違いますので、

すべてに対応できるようにすべきかと思いますが

なにぶんにも資料が整わず、とりあえずではありますが

エスケープコードから始まってHで終わっている部分を正規表現で抜くという対応ではいかがでしょう?

preg_replace("/\x1B.*?H/", "", $受け取った文字列が入った変数);

もしくは

preg_replace("/^\x1B.*?H/", "", $受け取った文字列が入った変数);
◎質問者からの返答

回答ありがとうございます。

なるほど、制御コード…。それを、正規表現で抜く、という方法ですね。

上記のコードで正規表現を書いてみたのですが、うまく抜けなかったみたいです…。

ちょっと制御コードについてあまり理解していないので、分からないのですが、「\x1B」にあたる文字列は表示されたものを見る限りでは見当たらないのですが、これは何か特別なコードなのでしょうか?

また、「□に文字化けしている」という□とは任意の文字、という意味でしょうか?□も見当たらないのですが…。

何度もすみません。よろしくお願いします。

追記:

pret_replaceの一つ目の引数を変えたら抽出できました。ありがとうございました。ただ、また別の問題が出てしまいましたが…。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ