[楽しようぜ!] pythonでsambaへアクセス!

IT

こんにちは。
梶松です。
今回はpysmbについて書きます。

最近思ってしまったわけです。
sambaにいちいちアクセスして、データを持ってくるのがめんどくさいと。
そして、僕はlinuxとwindowsが動くマシンを持っているではないか!
pythonだと、(ほぼ)同じコードでどちらの環境でも動くじゃないか!

というわけで、pythonからpysmbを使ってsambaにアクセスして
データのアレコレをした事を書いていきます。

今回やった事

  1. pythonでsambaへアクセスする
  2. 探しモノを見つける
  3. 欲しいデータを持ってくる

おまけ

  1. データをDLする時にかっこ良くみせるためにプログレスバーを用いようとした

以上の事をまとめていきます。

今回やること

pysmbを使って、smbディレクトリにサクッとアクセスして
簡単にDLできるようにしようと思います!

やろうと思ったキッカケは、
いつもsmbにアクセスする時は、windowsから
フォルダ?を開いて、そこから予めブックマークしておいた
smbディレクトリを選択してアクセスしておりましたが、
なんとなくちょっと読み込みが遅い時とかがあったので、(本当に遅いのかはわかりません。。。)
pysmb使えば、最低限の通信でさくっとアクセスできるのでは?!(自分の勝手な妄想
と思い込んでしまったので、作ろうと思いました!

あと、pythonのお勉強ついでに(笑)

とりあえずやりたい事の処理の流れは、以下の3手順です。

smbにアクセス→ディレクトリ3階層くらい潜る→データDLする

pythonの下準備

料理の下準備です。
とは言っても、pipでpysmbはインストールできるので、それさえすればOK

最初はGUIで作ってみたいなぁと思って「tkinter」を使おうとがンばっていたのですが、
どうもウインドウの更新タイミングだったりが、
いろいろ試してみたのですがうまくいかなかったので、
結局CUIで落ち着きました(笑)

pysmbの下準備

pythonなので、まずはimportするところから。

from smb.SMBConnection import SMBConnection
import platform

以下の関数で接続します。

SMBConnection( ‘<user>’, ‘<password>’, platform.uname().node, ‘<remote hostname>’, domain=”, use_ntlm_v2=True)

引数の説明です。

「user」と「password」「remote hostname」はそのまんまですね。

platform.uname().nodeは、linuxでいうところの
「hostname」コマンドで表示される名前が入ってきます。

「domain」はwindowsでいうところの「workgroup」が入ってきます。
ただ、通常は空でOKです。

あとは、「use_ntlm_v2=True」の部分ですね
NTLM(NT LAN Manager)認証v2を
使うかどうかのパラメータです。
(ちなみにsmbサーバをwinXPで建てている場合、
NTLM認証はv1しか使えないそうです!)

さて、上に書いたplatform.uname().nodeなのですが、
他にもどんなのが見れるのかちょっと気になったので、
調べました。
少しだけ話脱線します(笑)

調べる時は、

import platform
dir(platform)

で、platform.hogehoge()のhogehogeにあたる部分が調べれます。

今回調べてみたらたくさんありました。。。
流石に全部書くとキリが無いので、一個も書きません(笑)
そのうち何かで書くかもしれません。

「platform.uname().node」に書いてるnode
部分に何が入るのかも上に書いてるのと同じように

dir(platform.uname())

で調べることができました!
(僕も今回初めて知りましたw)

nodeの部分に入るものだけ少し紹介します。

platform.uname().machine   ->32か64を調べれるみたいですね

platform.uname().processor  ->上に同じ

platform.uname().release   ->kernelのバージョン出てきた(用途がわからん。。。)

platform.uname().system   ->そのまんま。Linuxって表示が出てきた!

platform.uname().version   ->私はubuntu使ってるので、ubuntuのバージョンが表示された。

こんな感じでいろいろありました。

一点注意点ですが、SMBConnetion()での確立した接続は長くは
維持できないため、接続する度に実行しないとだめみたいです。

 

さてさて、話は戻ります。

先ほどSMBConnection()で、接続準備できたので、
次は、サーバからディレクトリを調べる作業です。

サーバへディレクトリ一覧を要求する

さてさて、次はサーバにディレクトリ一覧を要求していきます。

listPath()という関数が用意されていますので、
こちらを使っていきます。
使い方は以下の通りです。

conn = SMBConnection()
conn.connect(‘サーバのアドレス’, ‘サーバのポート番号’)
item = conn.listPath(‘共有フォルダの名前’, ‘一覧を取得したいpath’)

こんな感じですかね!
変数の名前の付け方が変だとは思いますが、
そこはお手柔らかに(笑)

上記の方法でitemの中に一覧を取得したいpath配下の
ディレクトリ一覧がすっぽり入ってくるわけです。

このitemの中にはいろんな情報が入ってます。
どんな情報が見れるのかは以下に記載します。

ちなみに、itemは配列になっているので
for文とかで一個ずつ見ていかないといけなかったです!

item.filename : ファイル名
item.short_name : 短いファイル名?
item.file_attributes : 属性?
item.alloc_size : ファイルを格納する為割り当てられたサイズ
item.file_size : ファイルサイズ(byte)
item.create_time : *からの経過秒数で作成日時を表す
item.last_access_time : *からの経過秒数で最終ファイルアクセス日時を表す
item.last_write_time : *からの経過秒数で最終ファイル更新日時を表す
item.last_attr_change_time : *からの経過秒数で最終ファイル属性変更日時を表す
item.isDirectory : ディレクトリかどうか
item.isReadOnly : 読み取り専用かどうか

などなどいろいろありました。
これもどんなものが使えるのか
上に書いた方法(dir())で、調べれますね!

今回僕は、いろいろディレクトリがあって、
場合によってアクセスするディレクトリが分かれてくるため、
一覧を取得しては、その中から目当ての物を探して
パスにその名前のディレクトリを追記して
更に一覧を取得して、目当ての物を探して
というのを繰り返してました。

そんなこんなで、手間がかかりましたが
お目当てのディレクトリを探す事は完了です。。。
(自分の書いたソースコード、見にくくなってしまいました(笑))
これから見やすくなるように、
「リーダブルコードブック」読んでお勉強します。

 

最後は、いよいよお目当てのデータを見つけたので、
ダウンロードですね!

 

いよいよ、データをDLです!

データをダウンロードするのは一番簡単でした(笑)

with open(local_path, ‘wb’) as f:
connection.retrieveFile(service_name, remote_path, f)

pythonのwithって非常に便利ですね!!!!!!
c++とかだと、open()した後のclose()は必須だったと思うのですが、
withだと、close()が必要いらないだなんて、、、
withいいですねぇ
withって聞くと彼女欲しくなってきますねぇ、、、(笑)

さてさて、上記の説明ですね。

open()はたぶんpythonでよく使われる関数だと思います。

open(filename, mode)
filename : ファイル名
mode
r : 読み込み専用
w : 書き込み専用
a : 追記専用
r+ : 読み込み書き込み
省略した場合は自動的にr指定になる
ファイルのモード指定でaがあると、
個人的にはC++が懐かしくなります。

 

C + +より女の子の方が好きなんですけどね

それはさておき、

上記モードにbを追加すると、バイナリモードになります。
今回はネットワーク通ってくるので、binaryで指定しないと
いけないですね!

connection.retrieveFile(smb_DirName, remote_path, f)

次はこの部分ですね。

smb_DirName : SMBのShareNameです
remote_path : DLするファイルまでのpath
f : Cで言うファイルポインタ pythonで何ていうんでしょう?

おまけ

さて、今回ファイルをDLするにあたって、
かっこよく見せたかったので、プログレスバーを
使ってみたいなぁと考えました。

pythonでプログレスバーを使いたい時は

tqdm

を使うといいみたいなのを見つけたので、
pysmbを使ってDLする時は使おうと思ったんだけども、
うまくいかず断念しました。。。

もしpysmbでプログレスバーを使う事ができた方は
やり方をご教授頂けたらと思います。

 

今回は、pysmbを使ったいろいろを書きました。
最後まで読んで頂きありがとうございます。

IT
全部めんどいけんAnsibleで自動化しよ?❤️

みなさま、こんばんわ。梶松です。 タスクに追われ、更新が不定期ですが、梶松は元気です。 最近は7pa …

IT
【一目惚れ】Prometheus + Grafanaを用いたサーバ監視 part.1

こんにちは 梶松でっす。   皆様、PCのステータスを確認したい時ってありませんか? 例え …