Web技術日記
ホームページ制作の小技を紹介します。

perlとPHPでの環境変数を伴うexecの違い 2008年12月 5日

今日、半日くらい悩んだ出来事です。

とある仕様書を見てPHPでexecを利用して外部コマンドを実行するのですが、仕様書どおりなのになぜかうまくいかない。

環境変数が必要とあったので、$_SERVER['REQUEST_METHOD']や$_SERVER[QUERY_STRING']などにきちんと値が入っているか確認した上で試してみてもうまくいかない。

数時間後、しようがないのでperlに書き直して試した・・・なぜかうまくいく。

どうもperlでは、環境変数が渡されているがPHPだと渡されてないようだ。

そこでやっとこさ辿りついたのが、putenv。

putenv('REQUEST_METHOD='.$_SERVER['REQUEST_METHOD']);
putenv('QUERY_STRING='.$_SERVER['QUERY_STRING']);
した後、execするとやっとこさPHPでもうまくいきました。

ふぅ。

 
 

namazu 2007年6月27日

namazuのindex作成方法
env LANG=ja_JP.EUC PERL_BADLANG=0 mknmz --exclude='/除外フォルダA | 除外フォルダB/' -O 出力先フォルダ 作成対象フォルダ

 
 

perlで証明書つきhttps通信 2007年5月28日

perlで証明書つきhttps通信を行う方法です。
LWPモジュールが必要です。

use LWP::UserAgent;

$ENV{HTTPS_PKCS12_FILE} = '証明書ファイル名.p12';
$ENV{HTTPS_PKCS12_PASSWORD} = '証明書パスワード';

my $ua = new LWP::UserAgent;
my $head = new HTTP::Headers();

my $req = new HTTP::Request('POST', 'https://アドレス',$head,"POSTで送る値&で区切り");
my $res = $ua->request($req);
$sample = $res->content();

 
 

FTPクライアントを作成 2007年4月10日

perlでftpクライアント。ftpのコマンドについては、別途ご確認ください。
※socketモジュールが必要です。

use Socket;
$hostname = 'ホスト名';
$username = 'ユーザー名';
$password = 'パスワード';
$port = getservbyname('ftp', 'tcp');
$iaddr = inet_aton($hostname) or die "$hostnameは存在しないホストです。\n";
$sock_addr = pack_sockaddr_in($port, $iaddr);
socket(COMMAND, PF_INET, SOCK_STREAM, 0) or die "ソケットを生成できません。\n";
connect(COMMAND, $sock_addr) or die "$hostname のポート $port に接続できません。\n";
select(COMMAND); $|=1; select(STDOUT);
print COMMAND "USER $username\r\n";
print COMMAND "PASS $password\r\n";
socket(DATA_WAITING, PF_INET, SOCK_STREAM, 0)|| die "ソケットを生成できません。$!";
setsockopt(DATA_WAITING, SOL_SOCKET, SO_REUSEADDR, 1)|| die "setsockoptでエラーが発生しました。$!";
bind(DATA_WAITING, pack_sockaddr_in(0, INADDR_ANY))|| die "bind に失敗しました。$!";
listen(DATA_WAITING, SOMAXCONN)|| die "listen できません。$!";
$local_sock_addr = getsockname(COMMAND);
($tmp, $local_addr) = unpack_sockaddr_in($local_sock_addr);
$local_ip = inet_ntoa($local_addr);
$local_ip =~ s/\./,/g;
$local_sock_addr = getsockname(DATA_WAITING);
($data_port, $tmp) = unpack_sockaddr_in($local_sock_addr);
#コマンド送信
printf COMMAND "PORT $local_ip,%d,%d\r\n",$data_port/256,$data_port%256;
print COMMAND "LIST\r\n";
print COMMAND "RETR ファイル名\r\n";
accept(DATA, DATA_WAITING);
#結果受信
while (){
print $_;
}
close(DATA);
close(DATA_WAITING);
print COMMAND "QUIT\r\n";
close(COMMAND);

 
 

シリアルポートを遠隔地のブラウザから操作 2007年4月10日

perlを利用して、会社のブラウザなどから自宅のリモコンを操作可能にできます。
ポート番号、ビットレートなどは適宜修正してください。
※Win32::API モジュールと Win32::SerialPort モジュールが必要なので、ネットを検索して拾ってきてください。

#!/usr/local/bin/perl -w
use Win32::SerialPort;
$PortObj = new Win32::SerialPort("COM3") || die "Can't open COM3:
$^E\n";
$PortObj->databits(8);
$PortObj->baudrate(9600);
$PortObj->parity("none");
$PortObj->stopbits(1);
$PortObj->handshake("none");
$PortObj->buffers(4096, 4096);
$PortObj->write_settings;
$PortObj->write("リモコンのコマンド名,\r\n");
sleep 1;
my $result = $PortObj->input;
print "$result\n";
$PortObj->close;
undef $PortObj;

 
 
 
1