通过Shell脚本执行SMB客户端命令

8

我有一个shell脚本,用于访问SMB客户端:

#!/bin/bash
cd /home/username
smbclient //link/to/server$ password -W domain -U username
recurse
prompt
mput baclupfiles
exit

目前,该脚本运行并访问服务器,然后要求手动输入命令。

请问有人可以告诉我如何使 recursepromptmput baclupfilesexit 命令能够由 shell 脚本运行吗?

4个回答

13

我已经解决了这个问题,并分享给大家供以后参考。

#!/bin/bash
cd /home/username
smbclient //link/to/server$ password -W domain -U username << SMBCLIENTCOMMANDS
recurse
prompt
mput backupfiles
exit
SMBCLIENTCOMMANDS

这将把两个SMBCLIENTCOMMANDS语句之间的命令输入到smb终端。


可以使用这种heredoc方法,但使用stdin提示输入密码(即不传递密码参数)吗?感觉应该是可以的,但可能有点疯狂。 - c24w

12

smbclient 接受 -c 标志以实现此目的。

 -c|--command command string
       command string is a semicolon-separated list of commands to be executed instead of
       prompting from stdin.
       -N is implied by -c.

       This is particularly useful in scripts and for printing stdin to the server, e.g.
       -c 'print -'.

例如,你可能会运行

$ smbclient -N \\\\Remote\\archive -c 'put /results/test-20170504.xz test-20170504.xz'

smbclient 执行完命令后会断开连接。


7
smbclient //link/to/server$ password -W domain -U username -c "recurse;prompt;mput backupfiles"

我想评论一下Calchas的答案,这是正确的方法,但没有直接回答OP的问题,但我是新手,没有评论的声誉。

请注意,上面列出的-c是分号分隔的命令列表(如其他答案中所述),因此添加递归和提示可以使mput在不提示的情况下复制。

您还可以考虑使用-A标志使用文件(或解密文件以传递给-A的命令)来完全自动化此脚本

smbclient //link/to/server$ password -A ~/.smbcred -c "recurse;prompt;mput backupfiles"

文件格式在哪里:

username = <username>
password = <password>
domain = <domain>
workgroup = <workgroup>

工作组是可选项,域也是可选的,但通常需要使用域\用户名格式的用户名。

我怀疑这篇文章对于此特定需求来说已经太晚了,但可能对其他搜索者有用,因为这个帖子通过 -c 和分号给出了更加优雅的答案。


2

我建议使用autofs与smb共同完成任务。这样,您就可以消除像smbclient/ftp这样的方法,并重构您的shell脚本以使用其他功能(如rsync)来移动文件。这样,您的凭据也不会存储在脚本本身中。您可以将它们放在文件系统的某个地方,并让root以外的任何人都无法读取。


感谢您的建议,但如果可能的话,我更愿意使用我的脚本。 - Dustin Cook
有什么特别的原因吗? - dft99
不是很必要,只是在脚本完成95%时更加方便。感谢您的建议。 - Dustin Cook
1
您的建议听起来很不错,dft99。您能否详细解释一下呢?如果有一些代码行的话会更好。 - Sopalajo de Arrierez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接