• ベストアンサー

CGIからsystem("display test.png");を呼び出すとエラーがでるのですが、なぜでしょうか。

CGIについて質問させていただきます。 初めてCGIでWEBアプリを作っているところです。ちなみにPerlも、初めて勉強しはじめました。私が作りたいものは、CGIから、GNUPLOTを使って画像を出力するものです。 error display: unable to open X server `'., referer: http://.... コードは以下のようなものです。 #!/usr/bin/perl -w use HTML::Template; use strict; gnuplot no syhori.... system "gnuplot /DS/tmp/gnuplot.plot"; system "cd/DS/tmp;ps2pdf /DS/tmp/gnuplot.ps"; system "convert /DS/tmp/gnuplot.pdf /DS/tmp/gnuplot.png"; system "display /DS/tmp/gnuplot.png"; コマンド(display /DS/tmp/gnuplot.png)や、Perl(CGIではなくPerlだけで試しにやってみました)を実行すると正常に画像が表示されるのですが、CGIの中に書くとエラーが出てしまいます。 どなたかよろしくお願いします。

  • CGI
  • 回答数3
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

> ただ、なぜか画像へのパスを書いても、とどかないんですよ。。。。よく > わかりません。 Web サーバが任意のディレクトリのファイルを外部に表示できるとセキュリ ティ上問題があるので、それはそうです。とりあえず、画像ファイルを CGI スクリプトと同じ場所にコピーして、表示できるか確認したらどうでしょ う。

kenpanch7
質問者

お礼

どうも、ありがとうございました.助かりました。

kenpanch7
質問者

補足

はい、ためしてみました。CGIの下の階層においてみるとうまく表示できました。 ということは、PERLのコマンドで(system "mv /DS/tmp/gnuplot.png ~/apache/ ")をすれば、とりあえず移動後のポジションで表示できるってことですね!!ありがとうございます。ただ、まだDISPLAYコマンドの方もきになるので、もし何か知っていれば宜しくお願いします。

その他の回答 (2)

回答No.2

質問については、一人目の方の回答で済んでいるかと思います。ところ で、まさかとは思いますが、やりたいことはWeb ブラウザに画像を表示さ せたいということでしょうか? Web ブラウザに画像を表示させるとは 例えば、以下のような HTML を CGI で表示させることなんですが。 (わかっているようでしたら、失礼しました) <html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja"> <head> <title> </title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> </head> <body> <img src="./image.jpg" /> </body> </html>

kenpanch7
質問者

補足

ありがとうございます。表示することができれば本当はなんでもいいんです. ただ、なぜか画像へのパスを書いても、とどかないんですよ。。。。よくわかりません。 ../../DS/tmp/gnuplot.pngのようにして、相対パスを指定したいのですが、ある一定の場所よりうごきません。 File dose not exist error /srv/www/htdocs/DS, なにかの設定の関係でしょうか。ちなみにDSはSRVと同じ階層にあります.もし何かご存じであればよろしくお願いします。

  • zxcv0000
  • ベストアンサー率56% (111/196)
回答No.1

GNUPLOT は使った事が無いのですが、 > display: unable to open X server `'., referer: ​http://.... と出るからには Xクライアントなんですね。 DISPLAY環境変数か --display コマンドスィッチで表示先を設定する必要があると思います。

kenpanch7
質問者

お礼

どうも、ありがとうございました.勉強になりました。

kenpanch7
質問者

補足

ありがとうございます。ためしてみました。 system "display test.png -display kaisyamei.com:12.0"; ロードしているようなのですが、何も表示されませんでした。そしてエラーもでませんでした。(localhost:12.0もだめでした.) 書き方がまちがっているでしょうか? ちなみに12という数字は、envコマンドで調べました DISPLAY=localhost:12.0 ちなみにSSHをつかって、アクセスしプログラムを書いています。(あまり良く分かってないので余計な情報であればすいません。)

関連するQ&A

  • CGI Chart::Gnuplotの使用法

    コマンドラインからだと作成されるpngファイルがブラウザからだと作成されません。 ブラウザにデバッグ用のprint文は、表示されます。 http://localhost/~.../sample.pl を実行しても、 ブラウザに hello-helloが表示されるだけで、 file.pngが作成されません。 file.pngをブラウザから作成するには、どうしたら良いのでしょうか? よろしくお願いいたします。 コマンドラインからだと、gnuplotで作成されたfile.pngが作成されます。 bash-3.2$ perl sample.pl Content-type:text/html hello-hello 使用したプログラムは、以下のとおりです。 < sample.pl > #! /usr/bin/perl print "Content-type:text/html\n\n"; #use strict; #use warnings; use CGI; use Chart::Gnuplot; my $chart = Chart::Gnuplot->new( output => "file.png" ); my $dataSet = Chart::Gnuplot::DataSet->new( datafile => "test.data" ); print "hello-hello\n"; $chart->plot2d($dataSet);

    • ベストアンサー
    • Perl
  • CGI..pmをテストしようとするとエラーがでます。

    こんにちわ。windowsXPを使用していますが、CGI.pmをテストしようとするとエラーが出てきます。内容は「perl.exe.アプリケーションエラー 0x28085b5dの命令が0x00000004のメモリーを参照しました。メモリが\"written\"になることは出来ません。」というものです。どうすれば解決するのでしょうか。教えて下さい。勉強不足で全く解りませんが、自分で原因をわかる範囲で考えるとCGI.pmをplの中で複数回use CGIという最初の箇所から入れたからなのか…でも全く解りません。サブルーチンの中で一回一回use~書かなくても良いのでしょうか?それも解らないので教えて下さい。最初は一回一回subの中で書かずファイル冒頭に書いただけだったのですが、テストするとプロンプトでsubの中で呼ばれているsubを「不明なsubである」と出たので、ブロック中で最初から書いてみました、するとそれが出なくなりました。でもブロックの中で同ページでもuse CGI;$q=new CGIと書かなくてはいけないのだろうかと半信半疑です。CGI.pmは今回初めてテストしてみました。理解していない部分が多いですが、エラーとuseの件よろしくお教え下さい。

  • CGIスクリプトのブラウザから実行エラー

    OS:  RedHatLinux7.2 perl -v :  This is perl, v5.6.2 built for i686-linux HttpErrLog:  display: Unable to connect to X server ().  Premature end of script headers: /XXX/XXX/XXX.cgi GD::Graphを用いたperlスクリプトをブラウザから実行すると、 上記のようなエラーとなってしまいます。 コマンドでの実行では問題無く動作します。 「print」のみの簡易cgiで試行しましたが、問題なく実行されます。 cgiのパーミッションも確認しました。 ソースは以下の通りです。 作業が進まなくて困っています。 どなたかお知恵をお貸しください。 perl.cgi: --------------------------------------------------------- #!/usr/bin/perl -- use strict; use GD::Graph::bars; my @xLabels = qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec ); my @data2002 = qw( 17 19 26 38 56 64 67 53 40 29 21 13 ); my @data2003 = qw( 19 24 27 41 56 69 75 60 44 33 22 15 ); my @data = ( \@xLabels, \@data2002, \@data2003 ); my $graph = GD::Graph::bars->new( 800, 600 ); $graph->set( title => "Rainfall 2002/2003", y_label => "Millimetres" ); my $image = $graph->plot( \@data ) or die( "Cannot create image" ); open( OUT, "| display -") or die( "Cannot display image: $!" ); binmode OUT; print OUT $image->png(); close OUT; ---------------------------------------------------------

  • Perlで作成したCGIについて

    Perlで作成したCGIについて Perlで作成したCGIについて質問させていただきます。 #################### ##(1)system.cgi ## #################### #!c:/Perl/bin/perl.exe use strict; use warnings; use CGI; use CGI::Carp('fatalsToBrowser'); use CGI qw(:standard); print "Content-type:text/html;charset=utf8\n\n"; system('C:\\test.txt'); ##################################################### C直下にあるtest.txtの中身は「abcd」など 簡単なものです。 ##################################################### ################### ##(2)win32.cgi ## ################### #!c:/Perl/bin/perl.exe use strict; use warnings; use CGI; use CGI::Carp('fatalsToBrowser'); use CGI qw(:standard); use Win32::API; print "Content-type:text/html;charset=utf8\n\n"; my $MessageBox = Win::API -> new("user32","MessageBoxA","NPPN","N"); $MessageBox -> Call(0,"HelloWorld","Message",0); ##################################################### ##################################################### 以下にスペックを書きます。 Microsoft Windows XP Professional version2002 Service Pack2 Genuine Intel(R)CPU L2300 @1.50GHz 1.50GHz,1.49GB RAM ・ActivePerl ver5.10.1 built for MSWin32-x86-multi-thread ・Apache Apache 2.2.14(Win32) ##################################################### 上記の(1)、(2)のプログラムをエクスプローラ上(ローカル)で実行させて(1)ではテキストファイルを、 (2)ではメッセージボックスを表示させたいです。 結果は時間がかかるだけでTimeOutの設定である5分で切れてしまい何も起こりません。 しかし、全く同じプログラムで拡張子を.plに変更してコマンドプロンプトで実行すると、 期待通り(1)はテキストファイルが開かれ、(2)ではメッセージボックスが出てきます。 (1)、(2)ともCGIではsystemおよびMessageBoxの部分をコメントアウトして print文などを書けば普通にエクスプローラに表示されます。 (かなりhtmlとしては不備があると思いますが・・・) どうすればCGIで(1)、(2)のプログラムが期待通りの動きをするのか どうぞご教授のほどよろしくお願いいたします。 何か足りない情報や意味の分かりづらい個所がありましたら、仰ってください。 ちなみにこのプログラムは公開するために作成しているのではありません。 下手な説明、長文すみません。

  • perl ハッシュ エラー

    現在perlの勉強中で、ハッシュの項目まできました。しかし、use strictにするとこのコードがエラーになります。 #!/usr/bin/perl use strict; use warnings; print "Content-type:text/html\n\n"; $hoge{"key1"} = "value1"; print $hoge{"key1"}; exit; ヴァージョンは5.8.9です。use strictをコメントアウトすればエラーはでません。どうしてエラーになってしまうのでしょうか?どうすればエラーを出さずに表示することができるのでしょうか?どうかご教授ください。よろしくお願いします。

    • ベストアンサー
    • Perl
  • CGI::Session

    http://perldoc.jp/docs/modules/CGI-Session-3.11/Session.pod 上記サイトを参考に、 use CGI::Session; my $session = new CGI::Session("driver:File", undef, {Directory=>'/tmp'}); my $CGISESSID = $session->id(); を稼動中の掲示板CGIに組み込んでみたところ、$session がnullになるようで、$session->id()のところでエラーになってしまいます。 (use CGI::Session;の行ではエラーにはなりません。) ■driver:Fileをdriver::Fileにしてみました。 ■driver:Fileをundefにしてみました。 ■my $query = new CGI;を追加し、 newの2番目の引数を$queryにしてみました。 ■tmpディレクトリの属性を744、766、777にしてみました。 ■/tmp を ./tmpにしてみました。 上記、いずれも同じ結果になってしまいました。 何がいけないのかわかりません。ファイルの構成は下記のようになっています。 /test.cgi /tmp /CGI/Session.pm /CGI/Session/ErrorHandler.pm アドバイスなどありましたら、よろしくお願いします。

  • 構文エラーのある行番号を知りたい

    いつもお世話になっております。 現在既存のPERLを解析して、初心者ながらもなおしています。 で、私が直すとCGIエラーが起こり、よくよく調べたら”;”がなかったり、use strict;を宣言しているのにmy(hoge)と書いていなかったり、でケアレスなミスがたくさんあり、それをつぶしていけば何とかわかるのですが、何せ、たくさん改造かけてしまったあとではそれだけでも見つけるのが大変です。そういうエラーがある場合、”○○行目に";"がありません”というメッセージがhtml上に表示されると便利なのですが、そういう機能はありませんか? よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • perl use strict エラーにならない?

    perlの使い方を勉強しているのですが use strict;を記述すると 変数宣言が必要になるということですが 以下のように記述してもエラーになりません。 use strict;を記述すると my $a;がないと$a="Hello";で エラーになるのではないのでしょうか。 ---test.pl---- use strict; $a="Hello"; print $a; -------------- >test.pl Hello > (Windows7, ActivePerl)

    • ベストアンサー
    • Perl
  • "use CGI::Session"でエラーが発生してしまいます

    初投稿です。宜しくお願いします。 ActivePerl5.8.0+Apache1.3.14でSessionを使用した Webサイトを作成中なのですが、 ppm経由でインストールしたCGI::Sessionを useしようとしても、エラーになってしまいます。 サンプルコードは以下の通りです。 #!/usr/bin/perl use CGI::Session; &ses(); &print(); sub ses() { # Session作成・ここから my $session = new CGI::Session(undef, undef, {Directory => './tmp'}); my $tmpSID = $session->id(); $session->param('menu', 'MENU1'); $session->expire('+2h'); $session->header(); } sub print() { print "Content-type: text/html;charset=ISO-2022-JP\n\n"; print <<EOF; OK! EOF } use CGI::Session; の部分(と、Session関数を 呼び出している部分)をコメントアウト すると、とりあえずはエラーが出なくなるので、 原因はここだとわかっているのですが、 文法的に間違っているとは思えないですし、 困っています。 情報お願いいたします。

    • ベストアンサー
    • Perl
  • サーバーAでcgiで認証し、サーバーBへ飛ばす

    サーバーAでcgiでユーザーIDとパスワードで認証し、サーバーBの一般からアクセスされたくないURLに飛ばす方法を教えてください。 サーバーB側で、どのような受け口を作ればよいのかで悩んでいます。 cgi(Perl)のスキルと、Apacheのスキル少々です。 ヒントだけでもいただけましたら後は勉強します。 (1),サーバーAで、cgi(Perl)を使用してユーザー認証します。 (2),認証OKの場合、cgiからサーバーBへリダイレクトします。 (3),サーバーBでは、上記の認証OKのアクセスだけを許可します。 サーバーBには、htmlやpdfなどを置いています。 これを、.htaccessのREFERER認証を使用して、サーバーAのREFERERを持ったものだけを 通す設定にしてみました。 この場合、最初に呼んだhtmlは表示されますが、そのhtmlからimgタグで呼んだ画像などは 表示されません。 また、そのhtmlから同じディレクトリ内の他のhtmlへ飛ぶこともできません。 特にREFERER認証に拘りません。何か良い方法はありませんでしょうか。

専門家に質問してみよう