SSH に Google Authenticator の認証を追加する
Posted by yoosee on Debian at 2013-02-04 13:33 JST1 SSH + Google Authenticator
最近アカウント乗っ取り系の話がよく出ていてつい先日も Twitter のパスワードリセットを食らったところなのだが、そう言えば ssh は 2 Factors auth に対応しているのかなと思って (秘密鍵とパスフレーズが既に2 Factorsに近い気もするが、そこへの追加認証手段という意味で) ちょっと調べてみると PAM に Gooogle Authenticator による認証を追加する方法が普通にあるのだった。やり方はほぼ Two Factor SSH with Google Authenticator のまま。 Debian だと libpam-google-authenticator は deb があったのですごく簡単。# aptitude install libpam-google-authenticatorインストールしたら PAM の ssh 認証に google authenticator を追加する。設定ファイルの最初の方に下記の行を追加。
# vi /etc/pam.d/sshd ... auth required pam_google_authenticator.so ...sshd 側で Challenge Response の Auth を有効化する。
# vi /etc/ssh/sshd_config ... ChallengeResponseAuthentication yes ... # /etc/init.d/sshd restartGoogle Authenticator のキーを新規生成。コマンドが用意されているので ssh でログインするユーザ権限で実行する。secret key や scratch codes などは ~/.google_authenticator に保存されるようなので特にここでメモる必要はないが、このサーバに入るための緊急用認証情報である scratch codes はどこか別のところに記録しておいたほうがいいだろう。いくつか設定を聞かれるので答えておく。これも後から設定ファイルで変更できる。
$ google-authenticator [ここにURLかQRコードが表示される] Your new secret key is: XXXXXXXXXXXXXXXXXXXXXXXXXXX Your verification code is 492939 Your emergency scratch codes are: 67136983 19738098 69970608 69623422 35724953 Do you want me to update your "~/.google_authenticator" file (y/n) y (設定ファイルを上書きするか) Do you want to disallow multiple uses of the same authentication token? This restricts you to one login about every 30s, but it increases your chances to notice or even prevent man-in-the-middle attacks (y/n) y (同じトークンを複数箇所から使えないようにするか) By default, tokens are good for 30 seconds and in order to compensate for possible time-skew between the client and the server, we allow an extra token before and after the current time. If you experience problems with poor time synchronization, you can increase the window from its default size of 1:30min to about 4min. Do you want to do so (y/n) n (時計が同期してない環境のために、同期のズレの許容幅を標準の1:30から4:00にするか) If the computer that you are logging into isn't hardened against brute-force login attempts, you can enable rate-limiting for the authentication module. By default, this limits attackers to no more than 3 login attempts every 30s. Do you want to enable rate-limiting (y/n) y (総当たり攻撃を防ぐため30秒位内の試行回数を3回までに制限するか)元記事だと Google の URL が表示されていたが、手元の環境では terminal 内に QR コードが表示されたので、Android の Google Authenticator アプリから Menu → Setup Account → Scan a barcode で簡単にアカウント追加できる。もしくは同時に表示されている Secret Key を入力してもいい。
なお既に Google アカウントで 2 Factor auth を使っている場合でも、単にアプリ内に verification code が並んで表示されるので特に問題はない。表示識別名は `whoami`@hostname` 相当になるようだが当然アプリ側で変更できる。
$ ssh yoosee@example.com Verification code: ...Verification code に Google Authenticator に表示される対応の数字6桁を入れると認証される。当然この他に公開鍵 (ないしパスワード) による認証が行われる。
ちなみに当然ながらこれ、scp などの認証でも毎回聞かれる上に ssh-agent なども効かないので頻繁に接続を繰り返すようなケースには向かなさそうだ。
3TB SATA HDD を HP ML115 / Debian GNU/Linux に導入した備忘録
Posted by yoosee on Debian at 2012-06-30 14:13 JST1 3TB SATA HDD の Debian GNU/Linux での初期設定
HDDがなかなか安くならないなとしばらく様子を伺っていたが、自宅サーバの容量が一杯になりつつあるので流石に諦めてSeagate Barracuda 7200シリーズ 3.5inch SATA 6Gb/s 3TB 7200rpm 64MB 4Kセクター ST3000DM001 を $149.99 で購入。値段は1ドル80円換算で日本とほとんど変わらない。下記は Debian GNU/Linux wheezy/sid での設定とディスク内容のマイグレーションを備忘録として書いたものだが、正確性は担保しないので当然ながら自己責任で参考にしてください。まずは自宅のHP ML115に追加接続して Linux で起動。ちなみに元々の disk が sda で新しく導入した disk が sdb 。
[ 1.848040] ata1: SATA link up 3.0 Gbps (SStatus 123 SControl 300) [ 1.856296] ata1.00: ATA-8: ST3000DM001-9YN166, CC4B, max UDMA/133 [ 1.856301] ata1.00: 5860533168 sectors, multi 16: LBA48 NCQ (depth 31/32) [ 1.872281] ata1.00: configured for UDMA/133 ... [ 2.676866] sd 0:0:0:0: [sdb] 5860533168 512-byte logical blocks: (3.00 TB/2.72 TiB) [ 2.676872] sd 0:0:0:0: [sdb] 4096-byte physical blocks [ 2.676935] sd 0:0:0:0: [sdb] Write Protect is off [ 2.676939] sd 0:0:0:0: [sdb] Mode Sense: 00 3a 00 00 [ 2.676967] sd 0:0:0:0: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA起動時に認識はしている。BIOSなどによっては認識しないこともあるらしいのでそこは一安心。今回は2TBより大きなディスクなので fdisk/cfdisk では正しく扱えない (確か700GB程度しか認識しない状態になるはず) ため parted にて GPT を使う。まあ今時 parted だよねーという話ではある。ちなみに partition を切る必要が無ければ
# mkfs -t ext4 /dev/sdbとかして丸ごと使う分には 3TB でも問題なく行けるはず。さておき。下記ではまず最初に label を gpt に設定した後、1 を / partition (ext3, rootfs, bootable) 10GiB 、2 が swap で 4Gib、3 で残り全てをLVMに割り当てている。コンサバ気味に rootfs は lvm 上ではなく素の primary 上に ext3 で作っている。1 の start を 2048s にしているのは 0 だと alignment がどうのと怒られたから。なお parted は interactive なやりとり中に disk を実際にいじっているので操作間違いにはくれぐれも注意。X で使ってるなら gparted の方がいいかも。
# parted /dev/sdb (parted) mklabel gpt ... (parted) mkpart primary 2048s 10GiB ... (parted) set 1 boot on ... (parted) mkpartfs primary linux-swap 10Gib 14GiB ... (parted) mkpart primary 14Gib -1s ... (parted) set 3 lvm on ... (parted) print Model: ATA ST3000DM001-9YN1 (scsi) Disk /dev/sdb: 3001GB Sector size (logical/physical): 512B/4096B Partition Table: gpt Number Start End Size File system Name Flags 1 1049kB 4295MB 4294MB ext3 primary 2 4295MB 8590MB 4295MB primary 3 8590MB 3001GB 2992GB primary lvm (parted) quitそうしておいて LVM 部分を更に /usr /var /home に切り分け。この辺は趣味の世界だけど、昔からの習性で自分で Linux を入れるときはなんとなくこの構成にしていることが多い。今時だと /var はもっと大きくてもいいが、Virtual Machine なんかも /home の下に作れば済むのでこれくらいにしてる。LVM の基本的な使い方は 基本的なLVMの使い方 や A Beginner's Guide To LVM 等を参照のこと。
# pvcreate /dev/sdb3 # pvscan PV /dev/sda3 VG userspace lvm2 [2.72 TiB / 0 free] Total: 1 [2.72 TiB] / in use: 1 [2.72 TiB] / in no VG: 0 [0 ] # vgcreate uservolume00 /dev/sdb3 # vgscan Reading all physical volumes. This may take a while... Found volume group "uservolume00" using metadata type lvm2 # lvcreate -L 10G -n usr # lvcreate -L 20G -n var # lvcreate -l 100%FREE -n home # lvscan ACTIVE '/dev/uservolume00/var' [20.00 GiB] inherit ACTIVE '/dev/uservolume00/usr' [10.00 GiB] inherit ACTIVE '/dev/uservolume00/home' [2.69 TiB] inheritあとは普通にファイルシステムを作る。
# mkfs -t ext4 /dev/uservolume00/home # mount -t ext4 /dev/uservolume00/home /mnt ...
2 rootfs その他を新しい disk に切り替え
元のファイルシステムは LVM とかじゃない素の partition なので、あまり素敵技術は使えない。もっと賢い方法があったら知りたいけど、とりあえず単純に rsync する。真面目にやる人は当然 single user mode でやりましょう。# mkdir /target # mount /dev/sdb1 /target # mkdir /target/usr /target/var # mount /dev/usrvolume00/usr /target/usr # mount /dev/usrvolume00/var /target/var # mount /dev/usrvolume00/home /target/home # rsync -avD /etc /bin /sbin /boot /lib /lib32 /lib64 /usr /var /target # rsync -avD /home /target # rsync -avD /vmlinuz /initrd.img /targetmount で見て殆どの tmpfs, procfs, sysfs, udev, devpts, cgroup とかは勝手に面倒見てくれるはずなので directory だけ作っておく。
# mkdir /target/proc /target/sys /target/run /target/dev /target/root /target/mnt /target/tmp新しいシステムでの /etc/fstab (/target/etc/fstab)を書き換え。 LVM じゃないやつは最初に UUID を取っておく。parted から label つけて使ってもいいけどそこはお好みで。
# blkid /dev/sdb1 /dev/sda1: UUID="......-.....-....." TYPE="ext3"swap も確保してるので作っておく。今時の mkswap なら UUID も勝手に割り当ててくれるはず。
# mkswap /dev/sda2/target/etc/fstab を編集。
UUID="......-.....-....." / ext3 defaults 0 1 /dev/uservolume00/usr /usr defaults 0 2 /dev/uservolume00/var /var defaults 0 2 /dev/uservolume00/home /home defaults 0 2 UUID="......-.....-....." none swap sw 0 0あとは grub を入れれば終わり。そのまま入れても initrd 等がおかしくなるので新しい / に chroot して linux-image を reconfigure する作戦。あと grub-install は GPT だと文句を言ってくるので --force で無理やり入れてしまう。
# chroot /target # dpkg-reconfigure linux-image-3.2.0-2-amd64 # grub-install /dev/sdb --forceとりあえず /boot/grub/grub.cfg の当該部分はこんな感じに。
menuentry 'Debian GNU/Linux, with Linux 3.2.0-2-amd64' --class debian --class gnu-linux --class gnu --class os { insmod gzio insmod part_gpt insmod ext2 set root='(hd1,gpt1)' search --no-floppy --fs-uuid --set=root a61b7b93-5992-49d3-aa12-ea65ec3d3325 echo 'Loading Linux 3.2.0-2-amd64 ...' linux /boot/vmlinuz-3.2.0-2-amd64 root=UUID=a61b7b93-5992-49d3-aa12-ea65ec3d3325 ro quiet echo 'Loading initial ramdisk ...' initrd /boot/initrd.img-3.2.0-2-amd64 }物理的に sda と sdb のケーブルを繋ぎかえて再起動すれば完了、のはず。UUIDやLVMで管理しているので繋ぎ変える必要はないのだけど、これも趣味の問題である。
Ubuntu 12.04 と NVIDIA Quadro NVS420でマルチディスプレイ接続
Posted by yoosee on Debian at 2012-05-01 10:24 JST1 Ubuntu 11.10 から 12.04 にあげたら X が起動しなくなった問題への対処
繋がってしまえば大した事はない話なのだが結構ハマったのでメモとして。最近のインストーラや自動設定ツールはよく出来てるからこういう問題でハマることって少なくなった分、たまに出ると手間取る。まずは Ubuntu 11.10 でSingle Monitorで動いていたものが12.04へ上げたらそもそもXが起動しなくなったところから。エラーでは /usr/sbin/lightdm が異常終了しているとなっており、/var/log/Xorg.0.log や /var/log/Xorg.failsafe.log などを眺めるに nvidia driver が無いとか騒いでいる。とりあえず後から入れた proprietary のドライバを削除。
sudo apt-get purge nvidia\* sudo dpkg-reconfigure -phigh xserver-xorgこれで低解像度だが起動だけはするようになった。/etc/apt/sources.list.d/ からnvidia 関係のものを削除し、Ubunsu の nvidia driver を入れてみる。
sudo apt-get update sudo apt-get install nvidia-current sudo cp /etc/X11/xorg.conf /etc/X11/xorg.conf.backup sudo nvidia-xconfigこの後に再起動 (ないし X を restart) して、とりあえず無事に X が上がるところまでは回復。
2 Ubuntu 12.04 と NVIDIA Quadro NVS420でマルチディスプレイ接続
さてここからが本番。Windows7 では問題なく利用できている NVIDIA Quadro NVS420 と Dell Monitor 2台を繋いだ環境を、Ubuntu 12.04 でも使えるように設定。普通であれば通常の設定画面である gnome-configuration-center の Display セクションに2台目のディスプレイが表示されて設定できるはずだが、この環境では表示されない。ので nvidia-settings から設定する。% dpkg -l nvidia\* | grep \^ii ii nvidia-current 295.40-0ubuntu1 NVIDIA binary Xorg driver, kernel module and VDPAU library ii nvidia-settings 295.33-0ubuntu1 Tool of configuring the NVIDIA graphics driverと言う感じで nvidia-current を入れると依存して nvidia-settings パッケージが入っているはずなので、コマンドラインから nvidia-settings を実行、ないしメニューからnvidiaで検索して実行。
この時点で X Server Display Configuration に 2台のディスプレイが表示されているはずなので、2台目の方を TwinView で activate する。nvidia-setting からは直接設定を反映させられないので、Save to X Configuration File から /etc/X11/xorg.conf に保存して X を再起動する必要あり。これで次回ログイン時には dual monitor でセッションが開始されるはず。gnome-configuration-center からは1枚の大きなディスプレイとして認識されるようだ。
これ、最初に選択しようとしたときは Separate X Screen しか選択できず、しかもそちらで起動すると 2台目のディスプレイが真っ白に表示されるというバグを踏み、かつそれを解決しても X の process が別なのでモニター間でウィンドウの受け渡しができない、と言う状態になった。これはなんの事はない NVIDIA Quadro NVS 420 は 4つの出力が 2+2 で異なるGPUに割り当てられていて、X は別GPUでは別プロセスになるらしい。2台でTwinViewするだけなら同じ側のスロットに2台とも繋げば大丈夫。
Python 1行で http://$HOSTNAME:8000/ を公開
Posted by yoosee on Debian at 2009-04-04 09:08 JST1 $ python -m SimpleHTTPServer
Command-line Fu の Popular で見つけた。$ python -m SimpleHTTPServerと実行するだけで、実行したディレクトリを root とした http サーバが 8000 番で立ち上がる。
http://$HOSTNAME:8000/
でディレクトリのファイル一覧にアクセス可能。アクセスするとアクセスログも STDERR に出力される。ちょっとしたファイルの受け渡しなどに便利かもしれない。2 ruby WEBrick でワンライナー
ついでにrubyで同じ事をする one liner 。webrick を使ってこんな感じか。$ ruby -r webrick -e 'WEBrick::HTTPServer.new({:DocumentRoot => "./", :Port=>8000}).start'デフォルト値があるかどうかだけの違いではある。
APC Backup-UPS ES BE550R
Posted by yoosee on Debian at 2009-01-20 13:49 JST1 APC Backup-UPS ES BE550R 550VA
この辺りは日本ほど電力供給が安定していないし夏になると雷も多いので、手軽なUPSが欲しくなり、しばらく前に APC Backup-UPS ES BE550R 550VA を買った。Costco で $45 くらいと安かったのは、新商品のBE550G が出ているからだろうか。まあUPSとしての機能には大差あるまい。こういうのがCostcoで売っているのがアメリカらしいという気もする。日本だと APC ES500 BACK-UPS ブラック BE500JP が相当品か?USBケーブルでステータスをサーバに送れるので、Debian で apcupsd を入れて利用しているが、apcupsd.conf で設定変更したのはこれくらい。
UPSCABLE usb UPSTYPE usb DEVICE実際に使い始めてみると思ったよりも Power Failue が発生しているのが見える。
Wed Dec 10 06:41:13 EST 2008 Power failure. Wed Dec 10 06:41:15 EST 2008 Power is back. UPS running on mains. Tue Dec 23 05:22:46 EST 2008 UPS Self Test switch to battery. Tue Dec 23 05:22:54 EST 2008 UPS Self Test completed: Not supported Wed Jan 07 07:53:55 EST 2009 Power failure. Wed Jan 07 07:53:57 EST 2009 Power is back. UPS running on mains. Tue Jan 13 09:25:21 EST 2009 Power failure. Tue Jan 13 09:25:23 EST 2009 Power is back. UPS running on mains.と言う具合で、月に1,2度は2秒程度の瞬断がある感じ。以前に時々サーバが落ちていたのはおそらくこれが原因だったんだろう。
self-test に失敗しているのは元々その機能が無いからか。新しいモデルの BE550G には
Automatic self-test | Periodic battery self-test ensures early detection of a battery that needs to be replaced.と言う具合に機能があるようなので、ちょっと残念。
Shell のコマンド実行回数を数える
Posted by yoosee on Debian at 2008-04-19 22:00 JST1 Shell History | Weboo! Returns.
このネタは定期的に出てくるけど、自分では書いたことが無かった気がするので試しに。awk の切り出しは extended history で保存している都合で、切り出しカラムを $2 から $4 に変えている。直近1000回。
% history-all|tail -1000|awk '{a[$4]++ } END{for(i in a){print a[i] " " i}}' |sort -rn|head 95 lv 59 ls 51 edic 50 ruby 48 cd 43 rm 40 mv 38 sudo 33 jdic 32 w3medic, jdic はそれぞれ dic コマンドを 英和・和英 で起動するための alias。
普段使っているzshでは 横着プログラミング 第3回: 履歴マニア にあるように過去の履歴をひたすら蓄積しているので、その約2万回分でカウント。
% history-all|awk '{a[$4]++ } END{for(i in a){print a[i] " " i}}' |sort -rn|head 1431 lv 1212 google 1062 sudo 960 ls 860 edic 694 w3m 688 cd 657 rm 614 mv 569 grepなんだかやけに sudo が多いような…。
ちなみに google と言うのはコマンドラインから w3m に google 検索パラメータを投げるだけのプログラム。
#!/usr/bin/perl my $arg = join("+", @ARGV); my $q=`echo $arg | nkf -w`; system("w3m \"http://www.google.com/search?lr=lang_ja&q=$q\"");コンソール上で生活していると、これが意外と便利。
X Window System 上の操作を録画して PowerPoint で動画再生する
Posted by yoosee on Debian at 2008-03-24 12:00 JST1 RecordMyDesktop で X 上の操作を録画
X 上で動作するアプリケーションのデモを PowerPoint に張り付けてやりたいと思い、ちょっと探したら RecordMyDesktop と言うツールが見つかった。録画形式は Ogg Theora 。PyGTK が入っていればGUIで録画設定できるが、手元では都合でコマンドラインで実行した。と言っても例えば単一ウィンドウの動作を録画するには xwininfo から Window id を抜きだし (例えば 0x2e0005 として)、コマンドラインで指定するだけ。% recordmydesktop -windowid 0x2e0005 -fps 30 -v_bitrate 50000 -o out.oggコマンド実行で録画を開始し、Control-C で中断するとエンコードする。Ogg Theora 形式では素の Windows 上で再生出来ないので ffmpeg で変換。
% ffmpeg -an -vcodec mpeg1video -i out.ogg out.mpg今回は音声はoffにした。
あとは Windows に持っていってパワーポイントのメニューから挿入 » ビデオとサウンド » ファイルからサウンドを選び、ファイルを指定すればいい。
ただこのやり方だと .ppt ファイルに埋め込まれるのは絶対パスのリンクだけらしく、動画ファイルを削除したりパスを変更すると再生出来なくなるので注意が必要。せめて相対パスで登録できればいいんだが、今のところやり方を見つけられてない。
ともあれデモなんかは現地で操作するより録画しておいた方が色々と安心だし、動作にあわせた解説も練習や録音が出来て楽。ちなみに Windows 上で似たようなことをするならばWink, CamStudio, Jing など色々あるらしい。
最近のspam送信者が進化している件について
Posted by yoosee on Debian at 2008-02-27 12:00 JST1 SMTPレベルでのspam送信機能改善
数年前から MTA レベルの spam フィルタ技術として tarpitting + greylist 等を適用しているが、最近どうも効きが悪い感じがしたので、すり抜けてくる spam について少し調査をしてみた。結論としては spam 送信ソフトの実装レベルがかなり上がってきた事が伺える。SMTP的な挙動が正常なMTAと区別が付かないspammerの増加
Greylist (わざと再送要求する) や Tarpit (応答コード送信を遅延させる) といった手法に普通の MTA と同じようにきちんと対応してくる spammer が増えてきている。元々 spam 送信者のソフトウェアが真面目に実装されていない事を利用した手法なので、真面目に実装した方が spam 送信率が高くなると認識された時点で対応されるのはある意味当然ではあるのだが、思ったより早く対応が進んでいる。その他でも、HELO/EHLO できちんと FQDN を送信してきたり、セカンダリMXを参照して再送をかけてきたりと、全般的にSMTP的な振る舞いは正しいMTAと区別できないレベルのものが確実に増えてきている。特に英語spamに顕著。
ISPの真っ当なメールサーバを中継してくるspammerの増加
正当なISPのメールサーバから正当なFromで送りつけてくる spammer が最近は多少目立つようになってきた。ほぼ同じ内容のspamが複数の送信者・ISP経由から来ているのを見るに、恐らくはウィルス感染PCのbotnetから広く浅く送ってきているのだろう。これをやられるともうSMTPレベルではフィルタのしようがなく、本文の文章解析に頼るしかない。2 From / To / Subject / Body の工夫
SMTPレベル以外でも、From / To や Subject, 本文自体にも色々と工夫が見られる。From が自分自身 (To と同一) であったりランダムであったりする
SpamAssassin では blacklist_from と言う From 固定フィルタがあるが、これが使えなくなる。From が自分自身と言うケースに付いては SPF のような送信サーバ認証を使う手はあり、SpamAssassin 等でも whitelist_from_spf と言った SPF 認証された From のみを Whitelist として扱う設定がある。個人的な問題は私の主メールアドレスのドメインを登録している NSI が未だに TXT レコードの編集に対応していないという所だが、SPF 対応サーバ自体は去年のドコモの PSF フィルタ開始から増加している。
Subject や本文にスペルミスを入れてくる
英語spamでの話になるが、固定文字列フィルタをすり抜けるためにわざとキーワードをスペルミスしてくる。よくあるのは Viagra を Viagara や Viarga と言ったようなもの。今のところはまだこうしたインテリジェントなspammerは大多数ではないため、既存の手法もそれなりの割合では効いているが、出来のいいツールが出回るようになると現行の手法では対処が難しくなるだろう。まめにメンテナンスされた DNSRBLs 、ドメイン認証、フロー制御、あとはコンテンツレベルでのより賢いフィルタリング等の重要性が増していくだろうが、より CPU リソースを消費する方向に進んでいると言うのはかなり憂鬱な話ではある。
どちらにせよ大量のサンプルと申告者を持っているサービスは有利になるので、個人レベルならば例えば「Gmailへフォワード→POP3で取得」などという方法を使うのも手かもしれない。
Linux上で日本語ファイル名をローマ字に変換する
Posted by yoosee on Debian at 2008-02-12 20:00 JST1 日本語ファイル名をローマ字に変換する ruby + kakasi script
Palm TX で使っている pTunes が例によってSDカード上の日本語ファイルを扱ってくれない(id3tagは大丈夫だがファイルリストに表示されない)ので、ディレクトリ名・ファイル名をローマ字に変換するスクリプトを書いた。引数にディレクトリを指定すると recursive に日本語ファイル名をローマ字に変換する。処理には libkakasi を使用して、前段では -w での分かち処理もしている。また空白はアンダーラインに変換。割と破壊的なので利用には注意を。#!/usr/bin/ruby require 'kakasi' require 'find' require 'nkf' def romanize_dir dir Find.find(dir) do |fpath| next if NKF.guess(fpath) == 5 && !/\s+/ =~ fpath # ascii or whitespace begin filename = Kakasi.kakasi('-w', NKF.nkf('-e',fpath)).gsub(/\s*\/\s*/, '/') filename_roman = Kakasi.kakasi('-Ha -Ka -Ja -Ea -ka', filename) filename_roman.gsub!(/\s+/, '_').gsub!(/\^/,'-') rescue puts "failed to convert string #{fpath} - #{$!}:#{$@}" next end begin File.rename(fpath, filename_roman) puts fpath + " to " + filename_roman rescue puts "failed to convert filename #{fpath} - #{$!}:#{$@}" end if(File.directory? filename_roman) puts " + into directory #{filename_roman}" romanize_dir filename_roman end end end dir = ARGV.shift romanize_dir dirWindows だと同様の用途には Flexible Renamer や Ganmigi と言ったものがあるみたい。試してはいない。
procmail で Maildir 振り分け時に imap の状態を既読にする設定
Posted by yoosee on Debian at 2008-01-11 12:00 JST1 Re: IMAP filtering, how to mark my own messages read
メールを procmail で imap 用 Maildir フォルダに振り分ける際、一部メールに関しては最初から既読に出来ないものかと調べてみたら、Re: IMAP filtering, how to mark my own messages read と言う方法が見つかった。Maildir ではファイル名で未読・既読状態等を管理しており、基本的には cur/ ディレクトリに :2,S と言う名前で終わっていれば既読とみなされる。そこで
:0 * conditions { foldername=whatever :0c .$foldername/ # stores in .$foldername/new/ :0 * LASTFOLDER ?? /\/[^/]+$ { tail=$MATCH } TRAP="mv $LASTFOLDER .$foldername/cur/$tail:2,S" HOST }のようなルールで、特定 conditions の場合に mv コマンドでファイル名を強制的に書き換えてしまう TRAP (procmail 実行終了時に実行される処理) を仕込む。直接 new/ から cur/ に mv をかけるあたりも Maildir の思想を完全に否定しているし、結構乱暴な方法ではあるけど、普通に使う分にはこれで問題になることはあまり無さそうなので、まぁ用には足るんじゃなかろうか。
procmail 以外の振り分けソフトならもっとスマートな方法があるだろうか?
fml → mailman 移行メモ
Posted by yoosee on Debian at 2008-01-10 21:00 JST1 fml → mailman 移行メモ
メモ書き。mailman で予め listname でメーリングリストを作成し、必要な設定をしておく。メンバーの移行は普通に fml の /var/spool/ml/listname/members などから Webインターフェイス経由で登録。アーカイブの移行は fml 付随の packmbox.pl を使い
# cd /var/spool/ml/listname/spool/ # perl /.../packmbox.pl > /tmp/listname.mbox # mv /tmp/listname.box /var/lib/mailman/archives/private/listname.mbox/ # cd /var/lib/mailman/archives/private/listname.mbox/ # /usr/lib/mailman/bin/arch listname listname.mboxだーっと過去メールが流れて html の index が作成される。閲覧権限には要注意。
mailman 1:2.1.9-9 では fml 風の [listname:01234] 的な通番付き Subject を作ることが標準で出来る。fml で使っていた通番をそのまま引き継ぐにはホームサーバー非定期日記(風) を参考に
# /var/lib/mailman/bin/withlist listname listname のリストを読み込中 (ロック解除) 変数 `m' が mlname の MailList インスタンスです >>> m.Lock() >>> m.post_id = (/var/spool/ml/listname/seq より1多い数字) >>> m.Save() >>> m.Unlock() >>> ^D 最終処理中とする。