通过 Shell 脚本的 SMB 客户端命令

Posted

技术标签:

【中文标题】通过 Shell 脚本的 SMB 客户端命令【英文标题】:SMB Client Commands Through Shell Script 【发布时间】:2015-04-26 05:55:47 【问题描述】:

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

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

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

谁能告诉我如何获取命令recursepromptmput baclupfilesexit 命令由shell 脚本运行?

【问题讨论】:

【参考方案1】:

我会采取不同的方法来使用带有 smb 的 autofs。然后,您可以消除类似 smbclient/ftp 的方法并重构您的 shell 脚本以使用其他功能(如 rsync)来移动您的文件。这样,您的凭据也不会存储在脚本本身中。您可以将它们埋在您的 fs 上的某个位置,并使其只能由 root 读取,而不能由其他人读取。

【讨论】:

欣赏这一点,但如果可能的话,我更愿意使用我的脚本。 有什么特别的原因吗? 不是真的,更多的只是在编写 95% 的脚本时不方便。感谢您的意见。 你的建议看起来很不错,dft99。你能详细说明一下吗?欢迎使用一些代码行。【参考方案2】:

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

#!/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提示输入密码(即不传递密码参数)?感觉应该是这样,但可能有点精神。【参考方案3】:

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 在执行完命令后断开连接。

【讨论】:

【参考方案4】:
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>

workgroup 和 domain 一样是可选的,但如果不使用 domain\username 格式的用户名,则通常需要。

我怀疑这篇文章太晚了,无法满足这一特殊需求,但可能对其他搜索者有用,因为这个帖子通过 -c 和分号引导我找到更优雅的答案。

【讨论】:

以上是关于通过 Shell 脚本的 SMB 客户端命令的主要内容,如果未能解决你的问题,请参考以下文章

解决命令行执行shell脚本成功,但crontab执行失败

怎样在linux的shell脚本中连接mongodb插入

怎样在linux的shell脚本中连接mongodb插入

Zabbix3.4通过shell脚本监控redis服务

Linux FTP远程备份shell脚本命令

shell脚本江湖秘籍只传有缘人——流编辑器“三剑客”之awk命令