smbclient -Lは、SMBサーバーが公開している共有の一覧を表示する。マウントする前に、共有名やサーバーの応答を確認したいときに使う。
$ smbclient -L //192.168.1.10 -N
Sharename Type Comment
--------- ---- -------
share Disk
private Disk
IPC$ IPC IPC Service
SMB1 disabled -- no workgroup available
smbclientは、Sambaに含まれるSMBクライアントである。Homebrewではsambaパッケージに含まれる。
$ brew install samba
実行例はSamba 4.25.0、macOS 27.0.1のもの。接続先は192.168.1.10とする。
macOSには、同じ用途のsmbutil viewが標準で入っている。smbclientは、SMBのバージョンを指定して接続を試せる点が異なる。
参考: 【macOS】pingは通るのにSMB共有をマウントできない原因を切り分ける
パスワードを入力せずに共有の一覧を表示する
-Nを付けると、パスワードを入力せずに接続する。ゲストアクセスを許可しているサーバーでは、-Nだけで共有の一覧を取得できる。
$ smbclient -L //192.168.1.10 -N
Typeの列で、共有の種類を判断できる。
Type | 意味 |
|---|---|
Disk | ファイルを共有するディスク |
IPC | プロセス間通信用の共有。IPC$など |
共有の一覧は、アクセス権のない共有も含めて表示される。一覧に表示されても、マウントできるとは限らない。
ユーザー名を指定して共有の一覧を表示する
認証が必要なサーバーには、-Uでユーザー名を指定する。パスワードは対話的に入力する。
$ smbclient -L //192.168.1.10 -U [ユーザー名]
パスワードを誤ると、NT_STATUS_LOGON_FAILUREで失敗する。
$ smbclient -L //192.168.1.10 -U [ユーザー名]
session setup failed: NT_STATUS_LOGON_FAILURE
-U [ユーザー名]%[パスワード]の形式でパスワードも指定できる。ただし、パスワードがコマンドラインに残る。シェルの履歴や、psの出力から読み取られるため、検証用のアカウントなどに限る。
スクリプト向けに出力を整える
-gを付けると、|区切りの出力になる。grepやcutで加工しやすい。
$ smbclient -L //192.168.1.10 -N -g
Disk|share|
Disk|private|
IPC|IPC$|IPC Service
Diskの共有名だけを取り出す例である。
$ smbclient -L //192.168.1.10 -N -g 2>/dev/null | awk -F'|' '$1 == "Disk" {print $2}'
share
private
警告メッセージを消す
Homebrewでインストールしたsmbclientは、設定ファイルがないと、実行のたびに警告を出力する。
$ smbclient -L //192.168.1.10 -N
Can't load /opt/homebrew/etc/smb.conf - run testparm to debug it
...
共有の一覧の取得には影響しない。-s /dev/nullで、空の設定ファイルを指定すると、警告は表示されなくなる。
$ smbclient -L //192.168.1.10 -N -s /dev/null
SMB1にしか対応していないサーバーに接続する
smbclientの既定の設定では、SMB2以降でしか接続しない。SMB1にしか対応していないサーバーには、接続に失敗する。
$ smbclient -L //192.168.1.10 -N -s /dev/null
Protocol negotiation to server 192.168.1.10 (for a protocol between SMB2_02 and SMB3) failed: NT_STATUS_CONNECTION_DISCONNECTED
--option='client min protocol=NT1'を付けると、SMB1(NT1)も許可して接続する。共有の一覧を取得できる。
$ smbclient -L //192.168.1.10 -N -s /dev/null --option='client min protocol=NT1'
do_connect: Connection to 192.168.1.10 failed (Error NT_STATUS_CONNECTION_REFUSED)
Sharename Type Comment
--------- ---- -------
share Disk
private Disk
IPC$ IPC IPC Service
Reconnecting with SMB1 for workgroup listing.
Unable to connect with SMB1 -- no workgroup available
先頭のNT_STATUS_CONNECTION_REFUSEDと、末尾のno workgroup availableが表示されても、共有の一覧は取得できている。
-m NT1だけを指定しても、接続できない。-mは最大のプロトコルを指定するオプションで、最小のプロトコルは既定のSMB2のままだから、条件が矛盾する。
$ smbclient -L //192.168.1.10 -N -s /dev/null -m NT1
lp_load_ex: Max protocol NT1 is less than min protocol SMB2_02.
Protocol negotiation to server 192.168.1.10 (for a protocol between SMB2_02 and NT1) failed: NT_STATUS_INVALID_PARAMETER_MIX
SMB1にしか対応していないかは、nmapで確認できる。
参考: 【nmap】SMBサーバーが対応するプロトコルバージョンを調べる (smb-protocols)
接続できない場合のエラー
接続先のポートに到達できないときは、NT_STATUS_CONNECTION_REFUSEDで失敗する。-pでポート番号を指定できる。
$ smbclient -L //192.168.1.10 -N -p 4455
do_connect: Connection to 192.168.1.10 failed (Error NT_STATUS_CONNECTION_REFUSED)
名前解決できないホスト名を指定したときは、NT_STATUS_UNSUCCESSFULで失敗する。
$ smbclient -L //no-such-host.local -N
do_connect: Connection to no-such-host.local failed (Error NT_STATUS_UNSUCCESSFUL)
