この記事は Python Advent Calendar 2015 の8日目の記事になります。
この11月ぐらいから、Pythonで言語処理100本ノックを始めた初心者です。正規表現で盛大に詰まったので、勉強がてらLinuxコマンドを作ってみました。
1. sambaclientコマンド
sambaとは、Unix系OSからWindowsのファイル共有にアクセスするためのプロトコルです。使い方はいくつかありますが、たとえばFTP/SFTPのように対話型で使いたいなら
sambaclient //ホスト名/ディレクトリ -U ユーザ名
とします。ところが、ホスト名が異様に長いような環境だと、毎回打つのが面倒です。
2. smbコマンドを自作
そこで、SSHの.ssh/configのように設定ファイルを書き、その内容に応じて自動でsamba接続してくれるコマンドをPythonで書いてみました。
見ての通りなのですが、まず.smb/configとしてこんな設定ファイルを書きます。
Host clara
HostName 192.168.1.2
User example
Host ARIS
HostName 192.168.1.3
流れとしては以下のような感じになります。
「smb ホスト名 ディレクトリ」
という、2つのコマンドライン引数を受け取る。- 設定ファイルを開き、行単位でリストに格納
- 一行ずつ送りながら、「Host」で始まって「ホスト名(通称) + 改行」で終わる行を探す。
- 該当の行が見つかったら、リストの一つ先を参照して、完全なホスト名を取得する。
- リストの2つ先に「User」の項があれば、ログインに使うユーザ名を取得する。
- ホスト名とディレクトリ名、あればユーザ名を指定してsmbclientコマンドを実行
3. 詰まったところ
だいたい一通り詰まりました。
設定ファイルの読み込みでは、Cの癖でついrange(len())としてしまうのですが、readlineで読み込みながら探すのがきれいかもしれません。
また、改行が読み込まれるので取り除かなければならないことに気づかず、かなり手間取りました。
ホスト名(通称)を探すところでは、「Host」と「ホスト名(通称)」が両方含まれているという条件にしていたのですが、これだと、ホスト名(通称)が完全なホスト名の一部だった場合に「HostName」の行もヒットしてしまいました。
今のところ、2で示した実装になっているのですが、正規表現と変数が混在していても、正規表現をコンパイルしてやれば使えるはずなので、もう少しきれいに書ける気がします。
lstripの中身を正規表現で書けば、ユーザ名の行からユーザ名だけ抽出するのも簡単だろうと思ったのですが、どうもうまくいかないようです。仕方がないので正規表現にマッチしたところを””に置き換えるという回りくどいことをしています。どなたかやり方教えてください…。
これは正規表現は関係ないのですが、Python3のコードを実行ファイルにコンパイルする方法がよくわかりません。ご存じの方是非教えてください。
終わりに
いい感じに勉強になった気がしますが、もっときれいに書けるような気がします。現状、動かしてみてうまく動かなければ、といった感じで作っているので、テストの漏れがあるかもしれません。
作ってみたら地味に便利です。