AirPrint・CUPS-PDF・Dropboxを賢く使う方法(まとめ)
重要:一括ダウンロードに含まれるスクリプトを修正しました。
- CUPS-PDF_permissions_default.scpt を実行すると/etc/cups/cups-pdf.confの内容が消えてしまう不具合を直しました。(すいません!)
- もし、/etc/cups/cups-pdf.confの内容が消えてしまった場合は、CUPS-PDFを再インストールすることでデフォルト設定が戻ります。
- 2010/12/6 18:00以前にダウンロードした方は、最新版をダウンロードしてください。(お手数おかけして、申し訳ないです!)
過去3回、AirPrintに試行錯誤してきて、
さらに分かったことも含めて、AirPrintにまつわる操作とか設定等のまとめ。
AirPrint可能なプリンタ共有にするよ
- /usr/share/cups/mime/airprint.typesを追加する。(以前はダウンロードして、3ファイル追加・修正していたが、実はこれ1行だけでOKだった)
sudo sh -c "echo 'image/urf urf string(0,UNIRAST<00>)' > /usr/share/cups/mime/airprint.types"
- 既存のファイルを修正しないので、ファイルを削除するだけで確実に、OSX標準の状態に戻せるのだ。
- cupsdを再起動する。(以前はOSを再起動していたが、実はcupsdを再起動するだけで有効になった)
sudo killall cupsd
- cupsdはlaunchdによって常時起動プロセスとなっているので、killしてもすぐ再起動するのだ。
- あとは、システム環境設定 >> プリントとファクスで、プリンタを一旦削除、その後追加し直せば、AirPrinterの出来上がり!
PDFに出力するよ
- 以下のリンクより、CUPS-PDFをダウンロードして、インストールする。
- システム環境設定 >> プリントとファクスで、[+]ボタンを押して、プリンタにCUPS-PDFを追加する。
- 追加したCUPS-PDFを選択して、「ネットワークでこのプリンタを共有」にチェックを入れる。
- AirPrintでプリンタにCUPS-PDFを選択すれば、PDFで出力される。
- AirPrintで出力されたPDFは、デフォルトでは以下のパスどちらかに保存される。
- /ユーザ/共有/CUPS-PDF/guest
- /ユーザ/共有/CUPS-PDF/ANONYMOUS
- /ユーザ/共有/CUPS-PDF/ はエイリアスであり、その実体は /var/spool/cups-pdf/ である。
guestとANONYMOUS
- 「ゲストにこのコンピュータへのログインを許可」にチェックを入れたことがあるかどうかによって、以下のように反映される。
- guest フォルダと ANONYMOUS フォルダには、以下の違いがある。
- guest フォルダは、guestアカウントでしか読み書きできない。他のユーザではアクセスできないので不便。
- ANONYMOUS フォルダは、誰もが読み書きできる権限。誰もが簡単にアクセスできるのでとっても便利。
悩み
実験
- 別の環境にOSX 10.6.5を新規インストールして試してみると...
- インストール直後の「ゲストにこのコンピュータへのログインを許可」にチェック無しの状態なら ANONYMOUS フォルダに出力された。
- 一度でも「ゲストにこのコンピュータへのログインを許可」にチェックを入れると、その後は常に guest フォルダに出力されてしまうのだ。
- その条件の違いは何かと思って調べてみると...
- インストール直後、ログインまで完了した状態。
$ sudo ls -lR /var/db/dslocal/nodes/Default/users Password: total 480 -rw------- 1 root wheel 776 7 3 2009 _amavisd.plist -rw------- 1 root wheel 777 7 3 2009 _appowner.plist -rw------- 1 root wheel 846 7 3 2009 _appserver.plist ...(中略)... -rw------- 1 root wheel 728 9 3 2009 root.plist
-
- システム環境設定 >> アカウント >> 「ゲストにこのコンピュータへのログインを許可」にチェックを入れた状態。
$ sudo ls -lR /var/db/dslocal/nodes/Default/users Password: total 480 -rw------- 1 root wheel 14090 12 2 17:22 Guest.plist -rw------- 1 root wheel 776 7 3 2009 _amavisd.plist -rw------- 1 root wheel 777 7 3 2009 _appowner.plist -rw------- 1 root wheel 846 7 3 2009 _appserver.plist ...(中略)... -rw------- 1 root wheel 728 9 3 2009 root.plist
1行目にGuest.plistが追加された!
Guestアカウントの削除
- ならばと、思い切ってコマンドから Guest アカウントを削除してしまうと、その後は ANONYMOUS フォルダに出力されるようになった!
sudo dscl . -delete /users/Guest
- もう一度、ユーザの設定ファイルを見ると、一番上の Guest.plist が消えていた。
- 果たして、このようにGuestを削除してしまって、問題ないのだろうか?ちょっと不安...。(詳しい方、ぜひ助言をお願いします!)
- その後、OSを再起動して、
- 「ゲストにこのコンピュータへのログインを許可」にチェックを入れると、
- Guest.plist は復活して、再びゲストアカウントでもログイン可能になった。
- どうしても ANONYMOUS フォルダを利用したい時には、試してみる価値はある。
- 但し、TimeMachine等でバックアップして、いつでも元の環境に戻せる状況にしてから。
プリンタ共有でユーザ管理するよ
- ANONYMOUS フォルダは使えるようになったが、ゲストアカウントを有効にしてしまうと、とたんに使えなくなってしまう...。
- もっと確実にユーザ管理する方法はないのかと思っていたら、実は昔からちゃんとあった。
- システム環境設定 >> プリントとファクス で、CUPS-PDFの「ネットワークでこのプリンタを共有」をチェックありにすると、
- システム環境設定 >> 共有 >> プリンタ共有 のプリンタ:に CUPS-PDF が追加されて、ユーザ:が「全員 プリント可能」となる。
- この状態だと guest か ANONYMOUS として出力される。
- ユーザ:で[+]ボタンを押すと、ユーザやグループを自由に追加できる。
- 試しに ログインユーザである zari を追加してみると、以下の状態になった。
- 「zari プリント可能」
- 「全員 アクセスなし」
- AirPrintのプリンタ選択ページでは、CUPS-PDFに鍵のマークが付く。
- 選択すると、ユーザ名とパスワードの認証を求められた!
- そして、印刷結果は /var/spool/cups-pdf/zari/ フォルダに出力された。
- zari フォルダ以下のアクセス権は、zari ユーザだけが読み書きできる。
- 自分自身がzariなので、自由に読み書きできるのだ。これなら使い易い!
出力されるPDFの権限をコントロールするよ
- ところで、多くの人がAirPrintを利用する環境で、zariユーザのパスワードをみんなに教えてしまうのは、ちょっと考えものだ。
- そんな場合は、新規メンバー ボタンを押すと、独自のユーザとパスワードを設定できるので、それを利用してもらうのも良さそう。
- 試しに printer ユーザを追加してみると、AirPrintする際にprinterユーザも認証されるようになった。*1
- ちなみに、printerユーザは、システム環境設定 >> アカウント で「共有のみ」ユーザとして登録されることになる。
- もし、printerユーザを削除したい時は、システム環境設定 >> アカウント で[−]ボタンを押して削除すればいいのだ。
- しかし、ログインユーザ以外のprinterやguestでは、アクセス権がないのでPDFを出力したはいいが、それに触るのが困難になってしまう。
- そこで、CUPS-PDFの設定ファイル、/etc/cups/cups-pdf.conf の「UserUMask」を設定する。
- 「UserUMask 0077」は、所有者だけに「読み」「書き」を許可する。(デフォルト)
- 「UserUMask 0022」で、グループと全てのユーザに「読み」を許可する。
- 「UserUMask 0000」で、グループと全てのユーザに「読み」「書き」を許可する。
- UserUMask 0123 とした場合の意味
- 最初の0は、8進数であることを表現するプレフィックス
- 1は、所有者 の権限を制限する。(2進表現で001となり、読み・書き・実行の権限のうち、実行が制限される)
- 2は、グループの権限を制限する。(2進表現で010となり、読み・書き・実行の権限のうち、書きが制限される)
- 3は、全ユーザの権限を制限する。(2進表現で011となり、読み・書き・実行の権限のうち、書きと実行が制限される)
- 自分の場合、UserUMask 0022を設定して、/var/spool/cups-pdf/ 以下のユーザ名フォルダは、一旦全て削除してしまった。
- その後のAirPrintで出力されるPDFやユーザ名のフォルダは、全てのユーザで読み込み可能になった。
- これで、guestだろうが、printerだろうが、自由にアクセスできるようになった!
Dropboxと同期するよ
- インストールは、以下の本家トップページから。
- 使い方の詳細は、以下の解説ページが大変参考になりました。(感謝です!)
- Dropboxは、MacBookやiPhone・iPadなどでファイルを共有する手段として、たいへん使い勝手がいい。
- Dropboxの素晴らしいところは、ファイルの実体をコピーしなくても、シンボリックリンク*2さえ入れておけば、そこにリンクされるファイルが同期されるところ。
- フォルダのシンボリックリンクであれば、そのフォルダ以下のすべてのファイルとフォルダが同期される。
ln -s /var/spool/cups-pdf ~/Dropbox/Public/
- AirPrint後、Dropboxで同期されると即、iPhone・iPadのDropboxアプリからも、アクセス可能になる。
- 同期されたPDFを選択して、リンクアイコンにタッチ、Email Linkを選択すれば、PDFにアクセス可能なURLを書き込んでメールを起動してくれる。
- 共有したい人宛にそのメールを送信すれば、印刷したPDFを確認できる。(URLだけなので、メールはとっても軽いのだ)
- ちなみに、Publicフォルダ内か、外かによって、以下のような違いがある。
- その他にも、DropboxにShareフォルダを作ってを作って、よりシンプルに共有する方法もある。(メールによるURLの通知が不要)
プリントジョブを管理するよ
プリンタ共有しているMacBookから
- http://localhost:631/ にアクセスして、CUPSの管理ページから操作する。
- プリントジョブのキャンセル、プリント履歴の確認、プリンタの追加・削除などができる。
所感
- なぜAppleは、ヒューレッド・パッカード限定のAirPrintととしてリリースしたのだろう?
- たった1行の設定ファイルを追加するだけで、AirPrint対応のプリンタ共有が可能になり、現状のプリンタがそのまま使える、というのに。
- それに、OSXはPDFベースの描画エンジンなのだから、その系譜のiOS自体もPDFを出力するのは簡単なはず。
- その証拠にOSXの印刷では、遥かに昔からシステム標準でPDF出力に対応している。
- なのにAirPrintでは、紙に印刷する手段しか提供してくれないのはなぜなのだろう?
- なぜだ...なぜだ、Apple...。
PS
- おかげで、AirPrintの日記が書けた(書くことになった?)けど...ね。
AirPrintをサポートするAppleScript
- 以上のAirPrintに関する様々な便利技は、iPhone・iPadを利用するなら是非知っておきたいこと。
- しかし、このように日記に書いても、数ヵ月後にはたぶん完全に忘れてる。
- そうなった時に、無知な自分をサポートしてくれるAppleScriptを作ってみた。
airprint_sharing_ON.scpt
- AirPrint可能なプリンタ共有を開始するサポートをするよ。
(* * AirPrintを有効にする
*)
activate
"プリンタ共有でAirPrintを有効にします。"
display dialog result with icon 1
"echo 'image/urf urf string(0,UNIRAST<00>)' > /usr/share/cups/mime/airprint.types"
do shell script result with administrator privileges
"killall cupsd"
do shell script result with administrator privileges
(* * プリンタの削除と追加
*)
tell application "System Preferences"
activate
set current pane to pane "com.apple.preference.printfax"
end tell
delay 1
activate
"AirPrintから利用したいプリンタを、[−]ボタンで一旦削除します。
その後、[+]ボタンを押して再度追加してください。"
display dialog result with icon 1
delay 1
activate
"「ネットワークでこのプリンタを共有」にもチェックを入れます。"
display dialog result with icon 1
(* * 完了
*)
delay 1
activate
"以上で AirPrint 対応のプリンタ共有が開始されました。"
display dialog result with icon 1
CUPS-PDF_anonymous_enable.scpt
- CUPS-PDFで確実に ANONYMOUS を利用するために、ゲストアカウントを完全に削除するよ。
(* * CUPS-PDFの ANONYMOUS を有効にする
*)
"実行する前に必ず、TimeMchine等で
OS全体をバックアップしてください。
ANONYMOUS を有効にするため、
Guest アカウントを削除します。
再び Guest アカウントを利用するには、OSの再起動が必要です。"
display dialog result with icon 1
"dscl . -delete /users/Guest"
do shell script result with administrator privileges
CUPS-PDF_permissions_755.scpt
- CUPS-PDFの出力ファイルの権限を、所有者:読み書き、グループ:読み、全ユーザ:読み、に設定するよ。
(* * CUPS-PDFの出力ファイルの権限を以下の設定にする
* 所有者 :読み・書き
* グループ:読み
* 全ユーザ:読み
*)
activate
"出力するPDFの権限を以下の設定にします。
所有者 :読み・書き
グループ:読み
全ユーザ:読み"
display dialog result with icon 1
"sed -e \"s/.*UserUMask [0-9]\\{4\\}/UserUMask 0022/\" /etc/cups/cups-pdf.conf > /tmp/cups-pdf.conf"
do shell script result with administrator privileges
"cp /tmp/cups-pdf.conf /etc/cups/cups-pdf.conf"
do shell script result with administrator privileges
USERS_ls.scpt
- OSに保持されているユーザリストを確認するよ。
(*
* ユーザ確認コマンド
* 1行目のGuest.plistを確認する
* 存在していると、CUPS-PDFは guest フォルダに出力する
* 存在しなければ、CUPS-PDFは ANONYMOUS フォルダに出力する
*)
tell application "Terminal"
activate
do script with command "sudo ls -lR /var/db/dslocal/nodes/Default/users"
end tell
参考ページ
以下のページが大変参考になりました。感謝です!