以前、 Twilio で FAX 送信を試した記事を書きました。
ですが、fax 送信の度にさくらのレンサバにファイルをアップロードして、curlをたたいて、というのはさすがに不便なので、一連の処理をスクリプトにして、もうちょっと使いやすくしてみました。
ということで、備忘録代わりのメモ書きです。
作成したスクリプト
さて、上記の記事ではさくらインターネットのレンタルサーバーに、送信したい FAX 原稿(PDFファイル)をアップロードして、そのURLを指定して Twilio で送信するという手順になっていました。
なので、スクリプトは
- fax送信 : faxSend
- アップロード : faxRawUpload
- (アップロードしたファイルを使って)FAXを送信 : faxRawSend
- 送ったfaxのステータス確認 : faxStatus
の4つから構成しました。実際にユーザーが使うのは faxSend と faxstatus の2つだけになります。
とりあえず完成したものをGistに上げておきます。
コマンドラインで Twilio の FAX 送信を行うスクリプトのサンプル · GitHub
気になった点を順に説明しておきます。
faxRawUpload : アップロード用のスクリプト
アップロード用のスクリプトでは scp を利用してPDFファイルをアップロードします。 ただ、普通に scp で接続するとパスワードを聞かれるので、これを回避するために公開鍵認証を使います(パスワード直書きはなるべく避けたい)。
公開鍵認証で接続するため、サーバー側の ~/.ssh/authorized_keys に公開鍵を設定しますが、その際に、
no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty, command="if [[ ${SSH_ORIGINAL_COMMAND} =~ ^scp[[:space:]]-t[[:space:]]target/$ ]]; then ${SSH_ORIGINAL_COMMAND}; else echo Access Denied.; fi", ssh-rsa AA・・・ (改行を入れていますが、実際は1行です)
のように command を指定して実行可能なコマンドを制限しておきます。
なお、$SSH_ORIGINAL_COMMAND にはクライアント側で指定したコマンドが入ります。ただ、 scp の場合はどうもクライアント側で記述したコマンドそのものが入るのではなく、-t や -f といった隠しオプションを使ったサーバー側のコマンドに変換されているようです。
上記の記述の場合、渡されたコマンドが
scp -t targetdir (コピー先がtargetdir)
であれば、scpコマンドを実行して、それ以外ならメッセージを出して終了するというものになっています。
参考
- 自動実行のセキュリティについて ssh scp sftp の正しい自動実行方法
- scp の制限方法 linux - Limit SSH key to SCP only - Server Fault
- 鍵の生成について Linuxコマンド【 ssh-keygen 】認証用の鍵を生成 - Linux入門 - Webkaru
- SSH_ORIGINAL_COMMAND について sshdのauthorized_keysでできること | 俺的備忘録 〜なんかいろいろ〜
- scp の -t -f オプションについて http://ttssh2.osdn.jp/tmp/scp_memo.txt
余談
なお、最初は sftp のバッチモードを使おうとおもったのですが、よくよく考えたら、scpで事足りるのでそれを採用しました。 参考にしたリンク張っておくので、ご興味ある方は試してみてください。
- Linuxコマンド【 sftp 】安全なファイル転送 - Linux入門 - Webkaru
- bash - How do I pass a variable into sftp? - Unix & Linux Stack Exchange
faxRawSend : 送信(のみ)のスクリプト
次にアップロードしたPDFファイルを使って、Twilio のAPIをたたいて送信するスクリプトです。
APIの呼び出しは以前の記事と同じです。
APIの戻り値が json で返ってきますので、 jq を使って必要な情報(ステータスとfaxsid)だけ出力するようにしています。
しかし、bashでjsonを扱うのに jq なんて便利なものがあるんですね。ありがたい、ありがたい。
faxSend : 送信スクリプト
これがユーザーが呼び出す送信スクリプトになります。
引数をチェックして、内部で faxRawUpload, faxRawSend を呼び出すだけです。
faxStatus : ステータス確認
FAX送信APIをたたくと結果はすぐに帰ってきますが、実際にFAXが送られるまでは少しタイムラグがあります。 そこで、送信時に得られる faxsid を使って、ステータスを問い合わせて、いまどういう状態になっているか確認できるようにしておきます。
ステータスには
- queued
- sending
- delivered
などがあります。詳しくは、下記のリンク先の status の説明をご覧ください。
まとめ
突貫で作ってみたのですが、上記のスクリプトを使うと、FAX送信と送信結果の確認が結構簡単にできるようになりました。これなら、FAX送信の頻度が少ないうちは十分使えそうです。
まあ、本当は Web アプリでも仕立てて、送ったFAXのステータスをGUIで確認するようにすればなおいいのでしょうが、フレッツ光の光電話代をいかにお安くできるか?というのが今回の動機なのでとりあえずはこれでいいかなと思っています。
にしても、 Twilio で遊ぶと結構楽しいです。 次のネタないかなー。