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);

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/06/12 17:24:36
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:kn1967 No.2

回答回数2915ベストアンサー獲得回数301

ポイント35pt

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

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

ANSI/VT100 Terminal Control


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

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

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

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

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

もしくは

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

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

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

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

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

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

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

追記:

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

2009/06/12 17:24:14

その他の回答1件)

id:pahoo No.1

回答回数5960ベストアンサー獲得回数633

ポイント35pt

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

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

fwirte($stream,"show running-config");
sleep(1);
$output = fgets($stream);
id:rapuntuleru

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

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

2009/06/12 15:48:59
id:kn1967 No.2

回答回数2915ベストアンサー獲得回数301ここでベストアンサー

ポイント35pt

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

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

ANSI/VT100 Terminal Control


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

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

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

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

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

もしくは

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

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

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

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

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

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

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

追記:

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

2009/06/12 17:24:14
  • id:rapuntuleru
    お二方、回答ありがとうございます。頂いたアドバイスから少し試させていただいてから、「回答」を書こうと思います。

    >fgetsループさせて順に取得するようになってませんけど、質問文だけですよね?

    いえ、すみません、実はループさせています。あえて省略してしまったのですが、下記のように書いています(カウントによるbreakは、うまくループを抜けられないための強攻策なので、あまり気にしないでいただくほうがよいかと)。


    fwrite($stream,"show running-config");
    sleep(1);
    $count = 0;
    while(!feof($stream)){

    $output = fgets($stream);
    print($output);
    if($output == ""){
    $count = $count + 1;
    }
    if($count == 20){
    break;
    }
    }

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません