Windows 10 22H2のCygwinでfetchmail+procmailを動かす

Cygwinのインストール

  • 基本は先人の教えの通りで問題なし。
  • パッケージを選択する際にfetchmailprocmailを忘れずに。
  • インストール後に環境変数は設定しない。
  • 今回はVMWare上でインストールして、cygwin64フォルダをホスト側にコピーしてみた。それでも動いたのは驚いたけど、OSを再インストールしても問題ないだろうことは確認できたので良かった。
  • 初期設定のままだとターミナルが小さいので、ショートカットを編集しておく。
E:\...\cygwin64\bin\mintty.exe --position=10,50 --size=120,128 -i /Cygwin-Terminal.ico -

fetchmailの設定

$ ls -la .fetch*
-rwx------+ 1 ####### ####### 306694 Jun 18 15:37 .fetchids
-rwx------+ 1 ####### ####### 173 Jun 18 15:05 .fetchmailrc

$ cat .fetchmailrc
poll <mailserver>
protocol pop3
uidl

user <pop3 username>
pass <password>
keep
fetchsizelimit 0
no rewrite
no fetchall
no mimedecode
mda "/usr/bin/procmail"
ssl

fetchmail実行後に.fetchidsのパーミッションが変わってしまう問題

  • /etc/fstabでマウントオプションを設定すればよいらしいが、うまく行かないのでfetchmail実行前に毎回chmod 700を実行してごまかします。cygwinの利用目的はこれだけなので大丈夫でしょう。
$ ls -la .fetch*
-rwx------+ 1 ###### ###### 306694 Jun 18 15:37 .fetchids
-rwx------+ 1 ###### ######    173 Jun 18 15:05 .fetchmailrc

$ fetchmail --fetchmailrc ~/.fetchmailrc
3446 messages (3446 seen) for #####@##.#####.##.## at ####.#####.##.## (157072847 octets).

$ ls -la .fetch*
----rw----+ 1 ###### ###### 306694 Jun 18 16:03 .fetchids
-rwx------+ 1 ###### ######    173 Jun 18 15:05 .fetchmailrc

procmailの設定

$ ls -la /home/
total 8
drwxrwx---+ 1 ####### ####### 0 Jun 18 13:30 .
drwxrwx---+ 1 ####### ####### 0 Jun 18 13:08 ..
drwxr-xr-x+ 1 ####### ####### 0 Jun 18 16:03 #######
$ mkdir ~/Mail
$ mkdir ~/Mail/inbox
$ mkdir ~/Mail/log
$ ls -la .procmailrc
-rw-r-----+ 1 ###### ###### 207 Aug  7  2005 .procmailrc

$ cat .procmailrc
MAILDIR=$HOME/Mail
DEFAULT=$MAILDIR/

LOGFILE=$MAILDIR/log/`date +%Y%m%d.log`
LOCKFILE=$MAILDIR/.lockmail

FOLDER=`date +%Y%m`

:0 ic
* ? test ! -d inbox/$FOLDER
| mkdir inbox/$FOLDER

:0:
inbox/${FOLDER}/.

Procmail: Suspicious rcfile messageエラー

$ chmod 0640 ~/.procmailrc
# chown user:user ~/.procmailrc
# chown user:user /home/user
procmail: Suspicious rcfile "/home/hmiyazaki/.procmailrc"
procmail: Couldn't read "/home/hmiyazaki/.procmailrc"

ひたすらこのエラーがでる
/home/hmiyazaki/.procmailrc は問題ない
原因は、/home/hmiyazaki が 777 になっていた
cygwin 環境だとアリガチかも。

Cygwin起動時にメール受信する設定

$ cat .bash_profile
/home/######/mail.sh

$ cat mail.sh
#!/bin/sh
/usr/bin/chmod 700 /home/######/.fetchmailrc
/usr/bin/chmod 700 /home/######/.fetchids
/usr/bin/fetchmail --fetchmailrc /home/######/.fetchmailrc

実行結果

$ ~/mail.sh
3447 messages (3446 seen) for #####@##.#####.##.## at ####.#####.##.## (157105774 octets).
reading message #####@##.#####.##.##@###-##-####.#######.##:1 of 3447 (9648 octets) not flushed
reading message #####@##.#####.##.##@###-##-####.#######.##:2 of 3447 (11618 octets) not flushed
reading message #####@##.#####.##.##@###-##-####.#######.##:3 of 3447 (34263 octets) not flushed
reading message #####@##.#####.##.##@###-##-####.#######.##:4 of 3447 (53065 octets) not flushed
reading message #####@##.#####.##.##@###-##-####.#######.##:5 of 3447 (51073 octets) not flushed
中略
reading message #####@##.#####.##.##@###-##-####.#######.##:3447 of 3447 (32927 octets) not flushed

追加でnkfをインストール

ja.osdn.net

  • Cygwinインストーラーを起動して、gcc-coreとmakeを追加インストールする。
  • nkf-2.1.5.tar.gzをダウンロードしてmake -> make installする。

新規作成したファイルのパーミッションが0050(----r-x---)になる件

  • Cygwinのアクセス制限周りがおかしいくて新規作成したファイルのパーミッションが0050になってしまう。
  • tarで解凍したりmakeで生成されたバイナリも例外ではないのでpermission deniedが発生してmakeが止まってしまう。
  • nkf位のプログラムなら都度chmod -R 755して頑張れるけど、ある程度以上だとどうしようもありません。

ASLRが有効だとCygwinが動かない件

      0 [main] bash 841 child_info_fork::abort: \??\E:\...\cygwin64\bin
\cygiconv-2.dll: Loaded to different address: parent(0xE30000) != child(0xDD0000)
                                       -bash: fork: retry: Resource temporarily 
unavailable
      1 [main] bash 842 child_info_fork::abort: \??\E:\...\cygwin64\bin
\cygiconv-2.dll: Loaded to different address: parent(0xE30000) != child(0xE80000)
                                       -bash: fork: retry: Resource temporarily 
unavailable
      0 [main] bash 843 child_info_fork::abort: \??\E:\...\cygwin64\bin
\cygiconv-2.dll: Loaded to different address: parent(0xE30000) != child(0xDD0000)
                                       -bash: fork: retry: Resource temporarily 
unavailable
      0 [main] bash 844 child_info_fork::abort: \??\E:\...\cygwin64\bin
\cygiconv-2.dll: Loaded to different address: parent(0xE30000) != child(0xE50000)
                                       -bash: fork: retry: Resource temporarily 
unavailable
      0 [main] bash 845 child_info_fork::abort: \??\E:\...\cygwin64\bin
\cygiconv-2.dll: Loaded to different address: parent(0xE30000) != child(0xDF0000)
                                       -bash: fork: Resource temporarily 
unavailable
  • インストールに使ったVMはASLRを有効にし忘れていて、デスクトップPCはGit Bashを利用するため一時的にASLRを無効にしていたので、ASLRを有効にしたノートPCで動かしたところで問題を認識しました。回避方法はASLRを無効にするしかなさそうなのでこの方法は諦めます。orz
  • 最新版のCygwinはASLR対応しているはずだけど、全面的にOKと言うわけではないのかもしれません。Cygwin自体が古い技術でオワコンになりかけているようなので潔く諦めましょう。

forest.watch.impress.co.jp

そのほかにも、ASLR(アドレス空間配置のランダム化)が完全に有効化され、初期設定で「Cygwin DLL」に適用されるようになった。
万が一バッファーオーバーフローなどの脆弱性が発見されても、悪用が困難となり、セキュリティ向上が期待できる。