Perl

Perl で、RADIUS クライアントを作る。

Radius サーバに接続するためには、そのホスト名とシークレットが必要である。シークレットは Radius サーバへのパスワードみたいなもの。以下のコードでは $r に Radius クライアントのオブジェクトが入り、その後で $USENAME と $PASSWORD を使って $HOST にアクセスしている。

使用するモジュール use Authen::Radius; #!/usr/bin/perl use Authen::Radius; our $HOST = '1.1.1.1'; our $USERNAME = 'perltips'; our $PASSWORD = 'password'; our $SECRET = 'testing123'; # First Trial $r = new Authen::Radius(Host => $HOST,
                    Secret => $SECRET,
                    Debug  => 1,
                    TimeOut=> 10);
# 前座。ユーザー名とパスワードのチェックをしてみる。 print "auth result=", $r->check_pwd($USERNAME,
                                $PASSWORD,
                                $HOST), "\n";
# Authen::Radius->load_dictionary(); # 本番。ユーザー名とパスワードのチェックを設定する。 $r->add_attributes (
            { Name => 'UserName',       Value => $USERNAME },
            { Name => 'Password',       Value => $PASSWORD },
# { Name => 'NAS-IP-Address', Value => '1.1.1.2' } # # RFC 2865 https://www.ietf.org/rfc/rfc2865.txt calls this attribute # User-Password. Check your local RADIUS dictionary to find ); # ユーザー名とパスワードの組み合わせ (アトリビュート:属性) を、ACCESS_REQUEST で送る。 # そうすると返事が返って来るので recv_packet で受け取る。 $r->send_packet(ACCESS_REQUEST) and $type = $r->recv_packet(); print "server response type = $type\n"; # サーバから送られてきたアトリビュートを表示してみる。 for $a ($r->get_attributes()) {
    print "attr: name=$a->{'Name'} value=$a->{'Value'}\n";
}
続きを読む

Perl で、角丸画像を作成する。

オンラインで角丸画像を作成することができます。画像をアップロードすると、サーバ側で角丸画像が生成されてブラウザに表示されます。利用できるフォーマットは、JPEG、PNG、BMP です。

角丸み度の半径(ピクセル) :
角丸のアンチエイリアス : する しない
角丸の部分の背景色 :
角丸する画像ファイル :
 
続きを読む

Perl で、.htaccess のパスワードを生成する方法

Apache の場合の基本認証(BASIC 認証)、.htaccess の仕組みで使うパスワードは Perl で生成できる。

以下のコードを実行するとユーザー名「guest」に対するパスワード「password」は、毎回違った暗号文字列が出力されるが、それでも Apache はきちんと処理する。

#!/usr/bin/perl our $id = 'guest'; our $password = 'password'; our $password_file = '.htpasswd'; # Perl の crypt 関数に使える SALT の文字は a~z、A~Z、0~9、「.」と「/」 my @salt = ('a'..'z','A'..'Z','0'..'9','.','/'); #乱数初期化関数は srand srand; # SALT を作る。 my $seed1 = int(rand(64)); my $seed2 = int(rand(64)); my $salt = $salt[$seed1] . $salt[$seed2]; # crypt 関数の仕様は crypt(テキスト, SALT) $crypt_password = crypt($password, $salt); # .htpasswd ファイルに書き出す。 open(OUT, ">$password_file") || die; print OUT "$id:$crypt_password\n"; close(OUT); # 表示してみる。 print "$id:$crypt_password\n";

1つのパスワードに対する暗号化された文字列の種類は 4,096通りある。これは、アルファベット小文字 26 通り+アルファベット大文字 26 通り+数字 10 通り+記号 2 通り=64 通りで、SALT は 2文字で構成されるため、64×64 = 4,096 通り、ということからくる。

続きを読む

Perl で、サーバにモジュールがインストールされているか確認する方法

コマンドラインから、以下の 1行を実行する。
引数 -M と <モジュール名> の間には、スペースはいらない。

# perl -M<モジュール名> -e ''

もしモジュールがインストールされていれば何も起こらない。モジュールがインストールされていなければ Can't locate <モジュール名>.pm 云々というエラーが出る。

続きを読む

Perl で、Base64 のファイルをデコードして元のバイナリファイルに戻す方法

メールに添付されてきた .pdf ファイルが巨大すぎてメールサーバによって分割されて自分のところに配信された結果、Base64 のデータがバラバラに届いたケースを考える。

このような場合は Perl が活躍する。まず、バラバラになった Base64 のファイルは仕方がないのでエディタを使って手作業でくっつけて 1つのファイルにする。そのあと、以下のコマンドを実行すればよい。

使用するモジュール use MIME::Base64; perl -MMIME::Base64 -ne 'print decode_base64($_)' < くっつけたBase64ファイル名.txt > 出力ファイル名.pdf (上は、すべて1行に書く)
続きを読む

サイトのリンク切れの検出チェックをするには?

checkbot を利用するといいだろう。

これは Perl ベースのコマンドラインツールで、実行するとリンク切れをチェックして HTML を出力する。その HTML に書き出された検出結果をブラウザから見るという使い方。

この checkbot、UTF-8 で書かれたサイトを指定してて実行すると、

Parsing of undecoded UTF-8 will give garbage when decoding entities at /usr/lib/perl5/site_perl/5.8.7/LWP/Protocol.pm line XXX, line 1.

などのエラーが出るが、気にしないでよい。実行例としては、

./checkbot --url https://perltips.twinkle.cc/ --internal-only --ignore "\.js|hatena\.ne\.jp|\.ico" ※本当は全部 1行

のような感じで、上の例だと、https://perltips.twinkle.cc/ (このサイト)を対象にして、JavaScript のリンク (.js)、hatena.ne.jp、アイコンファイル (.ico) を無視し、サイト内だけリンク切れをチェックする、という設定である。

続きを読む

Perl で、ファイルを読み込んで処理する方法

Perl で、改行で区切られたファイルを読み込んで、1行ずつ処理するには、while() {...} のように書けばよい。

#!/usr/bin/perl # 読み込むファイル名をここに書く our $INPUT_FILE = 'yourfile.txt'; # ファイルをオープンする open(IN, $INPUT_FILE) || die("Can't open a file: $!"); # 上の open で与えられた IN で、 というように書き、while 文中で処理できる while() {
# 1行ずつ表示する
print $_; # 現在処理中の 1行は $_ で表わす。
} # ファイルをクローズする close(IN);

また、 の内容を 1行ずつ細かく処理するには、@IN = ; とするやり方も使える。以下はイテレータのループを while ではなく foreach で処理する例。

#!/usr/bin/perl # 読み込むファイル名をここに書く our $INPU_FILE = 'yourfile.txt'; # ファイルをオープンする open(IN, $INPUT_FILE) || die("Can't open a file: $!"); # 上の open で与えられた IN で、 というように書き、while 文中で処理する @IN = ; # $INPUT_FILE の内容は @IN に入ったので、ここでファイルをクローズできる close(IN); foreach my $line (@IN) {
# 1行ずつ表示する
print $line; # 現在処理中の 1行は $line で表わす。
}
続きを読む

Perl で、ファイルの最後にある 1; とは?

モジュールやパッケージをファイルに切り出した場合は、これらの実行の準備が済んだことを Perl インタプリタに知らせるために、パッケージの最後で真を返す必要がある。本来なら return 1; と書くべきなのだが、そこは Perl、多くのモジュールの省略して 1; だけ書かれている。ファイル最後の

1;

は

return 1;

なのである。

package pkg1; sub foo {
print "passed\n";
} 1; # ここは return 1; と同じ意味
続きを読む
Perl を購読