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)