smbgetのパスワード指定

sambaの速度を測るのにsambaをwgetのように使える smbget を使おうとしたのですが以前使えていた気がする -p オプションが無くなっています.

$ bash -c "read -sp \"passwd: \" passwd; smbget smb://smbhost/share/data -U user -p $passwd -O > /dev/null"
passwd: -p: unknown option

usageを見ると確かにありません.

$ smbget --usage
Usage: smbget [-?aneruRODqv] [-?|--help] [--usage] [-w|--workgroup=STRING] [-U|--user=STRING] [-a|--guest] [-n|--nonprompt] [-d|--debuglevel=INT] [-e|--encrypt]
        [-r|--resume] [-u|--update] [-R|--recursive] [-b|--blocksize=INT] [-o|--outputfile=STRING] [-O|--stdout] [-D|--dots] [-q|--quiet] [-v|--verbose]
        [-f|--rcfile=STRING]

-pを無くせばプロンプトが出てきますが毎回入力するのは面倒なのでどうにか出来ないかなとmanを見てみます.

man smbget
       -U, --user=username[%password]
           Username (and password) to use

-U オプションに一緒に書けるようです.デミリタは要らないよう.

$ bash -c "read -sp \"passwd: \" passwd; smbget smb://smbhost/share/data -U user$passwd -O > /dev/null"

デミリタに : を指定しても動きました.

$ bash -c "read -sp \"passwd: \" passwd; smbget smb://smbhost/share/data -U user:$passwd -O > /dev/null"

他にもSMB URLにも書けるようです.

man smbget
SMB URLS
       SMB URL's should be specified in the following format:

           smb://[[[domain;]user[:password@]]server[/share[/path[/file]]]]

ただし,この書き方だとSMB URLが環境変数が展開されてSTDOUTに表示されるのでパスワードを隠したい場合は使えません.

$ bash -c "read -sp \"passwd: \" passwd; smbget smb://user:$passwd@smbhost/share/data -O > /dev/null"
smb://user:password@smbhost/share/data(100.00%) at 130.69MB/s ETA: 00:00:0008
Downloaded 2.17GB in 17 seconds

それを言うと -U の場合もプロセスにパスワードが表示されてしまうのであまりよろしくないですね.てことでとりあえずこんな感じならいいかな?

$ bash -c "read -sp \"passwd: \" passwd; echo $passwd | smbget smb://smbhost/share/data -U user -O > /dev/null"

このときのプロセス

$ ps -ef|grep smbget
mk       12626 14620  0 22:38 pts/6    00:00:00 bash -c read -sp "passwd: " passwd; echo $passwd | smbget smb://smbhost/share/data -U user -O > /dev/null
mk       13263 12626 49 22:39 pts/6    00:00:00 smbget smb://smbhost/share/data -U user -O

あれ?結局最初に戻って…….

余録(キャッシュクリア)

速度を測りたいけど2回目以降はキャッシュされてしまうのでキャッシュをクリアして測る.
以下はlocalhostで試してるので差が出ているが,ネットワーク経由だとネットワークがボトルネックになり差が出なかった.でも一応やっておく.

1回目
smb://smbhost/share/data(100.00%) at 28.12MB/s ETA: 00:00:00434
Downloaded 2.17GB in 79 seconds
2回目
smb://smbhost/share/data(100.00%) at 130.69MB/s ETA: 00:00:0008
Downloaded 2.17GB in 17 seconds
キャッシュをクリア
$ sudo sh -c "sync; echo 3 > /proc/sys/vm/drop_caches"
もう一回
smb://smbhost/share/data(100.00%) at 27.43MB/s ETA: 00:00:0044
Downloaded 2.17GB in 81 seconds

/proc/sys/vm/drop_caches についてはKernel Documentsの admin-guide/sysctl/vm.rst.gz あたりを参照のこと.

$ zgrep ^drop_caches -A42 /usr/share/doc/linux-doc-5.3/Documentation/admin-guide/sysctl/vm.rst.gz

環境

環境1
$ dpkg-query -W samba smbclient bash
bash    4.4.18-2ubuntu1.2
samba   2:4.7.6+dfsg~ubuntu-0ubuntu2.14
smbclient       2:4.7.6+dfsg~ubuntu-0ubuntu2.14
$ lsb_release -dr
Description:    Ubuntu 18.04.3 LTS
Release:        18.04
$ uname -rvm
4.15.0-72-generic #81-Ubuntu SMP Tue Nov 26 12:20:02 UTC 2019 x86_64
環境2
$ dpkg-query -W samba smbclient bash
bash    5.0-5
samba   2:4.11.1+dfsg-3
smbclient       2:4.11.1+dfsg-3
$ lsb_release -dr
Description:    Debian GNU/Linux bullseye/sid
Release:        unstable
$ uname -rvm
5.3.0-3-amd64 #1 SMP Debian 5.3.15-1 (2019-12-07) x86_64

書き込み専用ぽいsamba共有を作る

書き込み専用の共有

sambaでデータの提出専用みたいな共有が作れないかと試してみました.

sambaサーバ の /etc/samba/smb.conf を編集して write-only という共有を作成.

[write-only]
  # 共有ファイルの保存先
  path = /export/data/write-only
  # 共有が見えるように
  browseable = yes
  # ゲストアクセス許可
  guest ok = yes
  guest only = yes
  # 書き込み可能
  writable = Yes
  # ゲストで書き込むと nobody アカウントで保存される
  guest account = nobody
  # umaskを 0333 に
  create mask = 0333
  directory mask = 0333
  # 読み込み権のないファイルを見えなくする
  hide unreadable = Yes

samba の設定を反映する

$ sudo service samba reload

クライアントPCから共有に接続して動作確認する

gvfs-mount で mount して,マウントポイントを確認.

$ gvfs-mount smb://192.168.1.102/write-only
$ mount|grep gvfs
gvfsd-fuse on /run/user/1000/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)
client$ $ ls -la /run/user/1000/gvfs/smb-share\:server\=192.168.1.102\,share\=write-only/
合計 0
drwx------ 1 mk mk 0  5月 25 19:13 .
dr-x------ 3 mk mk 0  5月 21 05:54 ..

書き込んでみる

$ echo hoge > /run/user/1000/gvfs/smb-share\:server\=192.168.1.102\,share\=write-only/hoge

書き込んだファイルは見えない

$ ls -la /run/user/1000/gvfs/smb-share\:server\=192.168.1.102\,share\=write-only/
合計 0
drwx------ 1 mk mk 0  5月 25 19:24 .
dr-x------ 3 mk mk 0  5月 21 05:54 ..
$ cat /run/user/1000/gvfs/smb-share\:server\=192.168.1.102\,share\=write-only/hoge
$ cat: '/run/user/1000/gvfs/smb-share:server=192.168.1.102,share=write-only/hoge': 許可がありません

serverではこんな感じで見える

$ ls -lA /export/data/write-only
合計 4
--wx-w---- 1 nobody nogroup 5  5月 25 19:24 hoge
$ sudo cat /export/data/write-only/hoge
hoge

クライアントから同名のファイル名で上書きするとエラーもなく書き込める

$ echo fuga > /run/user/1000/gvfs/smb-share\:server\=192.168.1.102\,share\=write-only/hoge

サーバで書き換わっているのを確認

$ sudo cat /export/data/write-only/hoge
fuga