【问题标题】:Issue on bash script (quote issue?) smbclient command not found?bash 脚本问题(引用问题?)找不到 smbclient 命令?
【发布时间】:2020-12-23 10:57:10
【问题描述】:

我正在尝试编写一个脚本来通过 samba 服务器下载文件夹/文件,然后将其移动到所需的目录。我做了这个(附脚本) 但是命令没有正确解释...

#!/bin/bash
# script client side to download files throught samba server

# Packages requirements: smbclient

# assuming locals ip are like: 192.168.1.XX
# assuming samba share folder's name is: "jean"

# @author: Jean 
# @param: last numbers of local ip @, i.e: xxx.xxx.x.01 ; -->01<--

# variable
SRC="192.168.1."    # local ip @ where samba is enable
NAME="jean"         # samba's group name
PASS="jean%jeann"        # samba's username and password

# *** test
CMD1="'tarmode'"
CMD2="'recurse'"
CMD3="'prompt'"
CMD4="'ls'"
CMD5="'tarmode ; ls'"
# ***
CMDS="tarmode ; recurse ; prompt ; ls"

# fct usage de la commande
usage() {
    echo
    echo "Usage:"
    echo "./client-samba.sh <end of IP @> <folder's name> <destination>"
    echo
    echo "        i.e: ./client-samba 12 toDownloadFromSamba ~/Downloads/"
    echo
    exit 1
}

# fct de test si le répertoire de destination existe
destExists() {
    if [[ ! -d ${DEST} ]]; then
        echo "ERROR : le répertoire de destination n'existe pas"
        usage
    fi
}

copyFiles() {
    # ( echo "${CMD1}" ; "${CMD2}" ; "${CMD3}" ; "${CMD4}" ) | smbclient //${SRC}${IP}/${NAME} -U ${PASS} -c
    # ( echo "${CMD1}" & ls ) | smbclient //${SRC}${IP}/${NAME} -U ${PASS} -c
    DL="smbclient //${SRC}${IP}/${NAME} -U ${PASS} -c ${CMD5}"
    #DL="smbclient //${SRC}${IP}/${NAME} -U ${PASS}"
    echo ${DL}
    $(${DL})
    #mget ${SMBFOLDER} 
    exit 1
    # mv ${HOME}/${SMBFOLDER} ${DEST}
}

# on teste le nombre d'arguments
if [[ $# -ne 3 ]];then
    usage
else
    IP=$1
    SMBFOLDER=$2
    DEST=$3
    destExists
    copyFiles
fi

这是我得到的错误:

smbclient //192.168.1.34/jean -U jean%jeann -c 'tarmode ; ls'
./client-samba.sh: ligne 51: 'tarmode: : commande introuvable

我指定当我手动执行命令时,效果很好……

你能帮帮我吗?

ps:我知道我可以通过命令 smbget 做到这一点,但是(我想先解决我的问题)

【问题讨论】:

标签: bash shell samba


【解决方案1】:

我不确定你是否想要,你编程了什么。 $(${DL}) 这行看起来有点奇怪。 这将运行${DL} 中的命令返回的字符串。

此外,我防止引用问题的经验是在 bash 中使用数组。 我希望,这会奏效:

CMD5="tarmode;ls"
DL=( smbclient //${SRC}${IP}/${NAME} -U ${PASS} -c "${CMD5}" )
${DL[@]}

命令周围没有单引号,也没有空格!

【讨论】:

  • 谢谢,我试着照你说的做,但是...DL=( smbclient //${SRC}${IP}/${NAME} -U ${PASS} -c \'${CMD5}\' ) echo ${DL[@]} ${DL[@]} # or trying to put commands directly DLD=( smbclient //${SRC}${IP}/${NAME} -U ${PASS} -c 'tarmode : ls' ) ${DL[@]} 错误是:(对于两个测试)'tarmode: command not found'tarmode: command not found 我不明白为什么它不起作用...
  • 不,你没有。去掉单引号!
  • 对不起,我在有和没有和没有它的情况下只执行第一个命令而不是第二个命令(即 ls)(在我的第一个评论中,我用“:”而不是“;”做了一个神秘的事情但它并没有改变任何东西
  • 去掉ls前面的空格会执行第二条命令
  • 对不起,没有smbclient //192.168.1.34/jean -U jean%jeann -c tarmode ;ls tarmode is now full, system, hidden, noreset, noverbose tarmode is now full, system, hidden, noreset, noverbose 谢谢,!必须删除所有空格
猜你喜欢
  • 1970-01-01
  • 2018-04-01
  • 1970-01-01
  • 2019-12-25
  • 1970-01-01
  • 2020-03-21
  • 2017-09-04
  • 1970-01-01
相关资源
最近更新 更多