通过 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
现在,脚本运行,访问服务器,然后要求手动输入命令。
谁能告诉我如何获取命令recurse
、prompt
、mput baclupfiles
和exit
命令由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 客户端命令的主要内容,如果未能解决你的问题,请参考以下文章