SMB客户端命令通过Shell脚本

Dus*_*ook 5 unix shell smb

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

#!/bin/bash
cd /home/username
smbclient //link/to/server$ password -W domain -U username
recurse
prompt
mput baclupfiles
exit
Run Code Online (Sandbox Code Playgroud)

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

可有人告诉我怎么去的命令recurse,prompt,mput baclupfilesexit通过shell脚本运行的命令吗?

Dus*_*ook 10

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

#!/bin/bash
cd /home/username
smbclient //link/to/server$ password -W domain -U username << SMBCLIENTCOMMANDS
recurse
prompt
mput backupfiles
exit
SMBCLIENTCOMMANDS
Run Code Online (Sandbox Code Playgroud)

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


Cal*_*has 8

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 -'.
Run Code Online (Sandbox Code Playgroud)

例如,你可能会跑

$ smbclient -N \\\\Remote\\archive -c 'put /results/test-20170504.xz test-20170504.xz'
Run Code Online (Sandbox Code Playgroud)

smbclient 完成执行命令后断开连接.


小智 7

smbclient //link/to/server$ password -W domain -U username -c "recurse;prompt;mput backupfiles"
Run Code Online (Sandbox Code Playgroud)

我会对卡尔查斯的答案发表评论,这是正确的方法,但没有直接回答OP的问题,但我是新人,没有评论的声誉。

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

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

smbclient //link/to/server$ password -A ~/.smbcred -c "recurse;prompt;mput backupfiles"
Run Code Online (Sandbox Code Playgroud)

其中文件格式为:

username = <username>
password = <password>
domain = <domain>
workgroup = <workgroup>
Run Code Online (Sandbox Code Playgroud)

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

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