Created by
sironekotoro
last modified
| #!/usr/bin/env perl
use strict;
use warnings;
# mac os用
# 1.実行時のクリップボードの中身を指定した文字列に書き換え
# 2.一定時間経過すると、クリップボードの中身を元に戻す
# クリップボードの中身を書き換える時間
my $time = 10;
# パスフレーズ
my $key = 'otsu';
# 入力を促すメッセージ
print "パスフレーズを入力してください > ";
# 標準入力を受け取り
my $input = <STDIN>;
# 改行を削る
chomp $input;
# 一時的にクリップボード上で書き換える文字列
my $string = "SECRET";
# 入力文字列が正しいか、間違っているかを
# if文の文字列比較で判定
if ( $input eq $key ) {
# クリップボードの内容を、スカラー変数に取り込む
# `` バッククォートで囲まれた文字列は、Perl上ではなく、
# OSで実行されるコマンド。
# pbpaste は実行すると、クリップボードの内容を表示する
# macOSのコマンド
# (なのでこのプログラムはMacでのみ動く)
# 実行した後の結果をスカラー変数 $clipbord に代入している
my $clipbord = `pbpaste`;
# Perlのsystem関数を利用して、OSに()内の
# 命令を実行させる
# 上記の`` バッククォートと違うのは、コマンドの実行結果を
# Perlが欲しいかどうか。
# 実行結果が欲しい場合には`` バッククォート
# 実行結果が入らない(実行されれば、それでいい)って場合は
# system関数を利用する
# 文字列をクリップボードに設定する
# pbcopyは、クリップボードに文字列を設定するmacOSの
# コマンド。
# echo '$string' | pbcopy
# はOSに渡される時に$stringの内容が展開されて以下のようになる
# echo 'SECRET' | pbcopy
# pbcopy はパイプ | で渡されたものをクリップボードに設定する
system("echo '$string' | pbcopy");
# カウントダウン表示
# 後何秒で元に戻るか気になったので入れた
# 趣味
for my $t ( 1 .. $time ) {
sleep 1;
print $time - $t, "\n";
}
# 指定の秒数待ち終わったら元の文字列を
# クリップボードに設定する
# system("echo '$clipbord' | pbcopy");
# しかし、もともとクリップボードに貼り付けていた文字列が
# 以下のようなものだった場合には、クリップボードの内容を
# 書き戻す時点でOSコマンドインジェクションが発生する
# ' | touch /tmp/injection | echo 'injection
# $clipbordの中身を展開するとこのようなコマンドがOSに渡される
# echo '' | touch /tmp/injection | echo 'injection' | pbcopy
# echo '' # 空文字列を表示
# touch /tmp/injection # /tmp内にinjectionというファイルが作成される
# echo 'injection' # injectionという文字を表示する
# pbcopy # 直前のコマンドの内容をクリップボードに貼り付ける
# OSコマンドインジェクションを防ぐため、3引数のopenコマンドで
# 2番目の引数に |- を利用する
# http://perldoc.jp/func/open
# 出力先をpbcopyコマンドに指定したファイルハンドル$pipeを作成する
open my $pipe, '|-', 'pbcopy' or die $!;
# $clipbordの中身を、ファイルハンドル$pipeに出力
print $pipe $clipbord;
# ファイルハンドルを閉じる
close $pipe;
}
else {
# 入力した文字列が異なって入ればエラー
print "error\n";
}
|