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を選択して、「ネットワークでこのプリンタを共有」にチェックを入れる。

  • AirPrintでプリンタにCUPS-PDFを選択すれば、PDFで出力される。


  • AirPrintで出力されたPDFは、デフォルトでは以下のパスどちらかに保存される。
    • /ユーザ/共有/CUPS-PDF/guest
    • /ユーザ/共有/CUPS-PDF/ANONYMOUS
  • /ユーザ/共有/CUPS-PDF/ はエイリアスであり、その実体は /var/spool/cups-pdf/ である。

guestとANONYMOUS

  • 「ゲストにこのコンピュータへのログインを許可」にチェックを入れたことがあるかどうかによって、以下のように反映される。
    • 過去に一度でもゲストアカウントを有効にしたことがあると、AirPrintで出力されるPDFは guest フォルダに出力される。
    • 今まで全くゲストアカウントを有効にしたことがなければ、AirPrintで出力されるPDFは ANONYMOUS フォルダに出力される。
  • guest フォルダと ANONYMOUS フォルダには、以下の違いがある。
    • guest フォルダは、guestアカウントでしか読み書きできない。他のユーザではアクセスできないので不便。
    • ANONYMOUS フォルダは、誰もが読み書きできる権限。誰もが簡単にアクセスできるのでとっても便利。
悩み
  • 自宅のようなプライベートな環境で利用するAirPrintなら、ANONYMOUS フォルダに出力されると大変扱い易いのだが、
  • ストアカウントをたまに利用する自分のMacBookでは、無情にも guest フォルダに出力されてしまっていた...。
  • ならばと、システム環境設定 >> アカウント で、ゲストアカウントを無効にしてみたが、相変わらず guest フォルダに出力される。(なぜだ!)
実験
  • 別の環境に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と同期するよ

ln -s /var/spool/cups-pdf ~/Dropbox/Public/
  • AirPrint後、Dropboxで同期されると即、iPhoneiPadDropboxアプリからも、アクセス可能になる。
  • 同期されたPDFを選択して、リンクアイコンにタッチ、Email Linkを選択すれば、PDFにアクセス可能なURLを書き込んでメールを起動してくれる。

  • 共有したい人宛にそのメールを送信すれば、印刷したPDFを確認できる。(URLだけなので、メールはとっても軽いのだ)
  • ちなみに、Publicフォルダ内か、外かによって、以下のような違いがある。
    • ~/Dropbox/Public/cups-pdf/ の場合、URLを知っている人なら誰もが自由に閲覧可能なPDFとなる。
    • ~/Dropbox/cups-pdf/ の場合、PDFにアクセスする前に自分のDropboxへのログインを求められる。(つまり、自分だけのプライベートなPDFとなる。他人のログインでは、そのPDFにアクセスできない。)

プリントジョブを管理するよ

iPhoneiPadから
  • ホームボタンをダブル押し、タスクリストを表示して、プリント アプリを選択する。
  • 「プリントをキャンセル」ボタンを押すことで、簡単にキャンセルできる。
プリンタ共有しているMacBookから
  • http://localhost:631/ にアクセスして、CUPSの管理ページから操作する。
  • プリントジョブのキャンセル、プリント履歴の確認、プリンタの追加・削除などができる。

所感

  • なぜAppleは、ヒューレッド・パッカード限定のAirPrintととしてリリースしたのだろう?
  • たった1行の設定ファイルを追加するだけで、AirPrint対応のプリンタ共有が可能になり、現状のプリンタがそのまま使える、というのに。
  • それに、OSXはPDFベースの描画エンジンなのだから、その系譜のiOS自体もPDFを出力するのは簡単なはず。
  • その証拠にOSXの印刷では、遥かに昔からシステム標準でPDF出力に対応している。
  • なのにAirPrintでは、紙に印刷する手段しか提供してくれないのはなぜなのだろう?
  • なぜだ...なぜだ、Apple...。

PS

  • おかげで、AirPrintの日記が書けた(書くことになった?)けど...ね。

AirPrintをサポートするAppleScript

  • 以上のAirPrintに関する様々な便利技は、iPhoneiPadを利用するなら是非知っておきたいこと。
  • しかし、このように日記に書いても、数ヵ月後にはたぶん完全に忘れてる。
  • そうなった時に、無知な自分をサポートしてくれる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

一括ダウンロード

  • ユーザ・スクリプト・フォルダに入れておくと便利そう。


重要:一括ダウンロードに含まれるスクリプトを修正しました。

  • CUPS-PDF_permissions_default.scpt を実行すると/etc/cups/cups-pdf.confの内容が消えてしまう不具合を直しました。(すいません!
  • もし、/etc/cups/cups-pdf.confの内容が消えてしまった場合は、CUPS-PDFを再インストールすることでデフォルト設定が戻ります。
  • 2010/12/6 18:00以前にダウンロードした方は、最新版をダウンロードしてください。(お手数おかけして、申し訳ないです!


*1:最初にログインユーザであるzariで認証してしまったiOS端末は、zariユーザを削除して、printerユーザだけ登録した状態でも、zariユーザとして認証された。ログインユーザは登録が有る無しに関わらず、常にアクセス可能なようだ。

*2:Finderのエイリアスではダメ。