SMB客户端命令通过Shell脚本

时间:2015-02-24 14:42:43

标签: shell unix smb

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

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

现在,脚本运行,访问服务器,然后要求手动输入命令。

有人可以告诉我如何让shell脚本运行命令recursepromptmput baclupfilesexit吗?

4 个答案:

答案 0 :(得分:10)

我为此制定了一个解决方案,并分享以供将来参考。

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

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

答案 1 :(得分:6)

\为此目的接受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' 在完成命令后断开连接。

答案 2 :(得分:2)

我会采用与smb一起使用autofs的不同方法。然后你可以消除smbclient / ftp之类的方法并重构你的shell脚本以使用其他函数如rsync来移动你的文件。这样,您的凭据也不会存储在脚本本身中。你可以将它们埋在你的fs上的某个地方,并让它只能由root用户读取。

答案 3 :(得分:0)

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和分号找到更优雅的答案。