【问题标题】:Passing variable into sshpass command inside a script for loop将变量传递给循环脚本中的 sshpass 命令
【发布时间】:2014-07-21 21:56:49
【问题描述】:

我正在尝试创建一个脚本 (test.sh),它可以登录到另一台服务器并检查一些不同文件夹的磁盘使用情况:

test.sh:

DIRS="dir_A dir_B dir_C"

for DIR in $DIRS
do
  sshpass -p user_password ssh -o StrictHostKeyChecking=no user_name@host 'cd /opt/app/$DIR;SIZE=$(du -s);echo "YVALUE="$SIZE > ../size_$DIR.txt'
done

但是,变量 DIR 永远不会传递给脚本。当我运行脚本时它是空的。我尝试在 $DIR 周围使用 {} 但仍然没有成功。我错过了什么?感谢您的帮助!

【问题讨论】:

    标签: linux bash ssh


    【解决方案1】:

    基本上,使用双引号而不是单引号。如有必要,您仍然可以使用单引号连接:

    sshpass -p user_password ssh -o StrictHostKeyChecking=no user_name@host 'cd /opt/app/'"$DIR"';SIZE=$(du -s);echo "YVALUE="$SIZE > ../size_'"$DIR".txt
    

    我刚刚注意到一些事情:du -s 产生两列的输出,因此可能尚未以正确的方式使用它。也许仍然需要像SIZE=${SIZE%$'\t'*} 这样的东西。

    另一种方法是通过输入发送目录,让另一端读取:

    sshpass -p user_password ssh -o StrictHostKeyChecking=no user_name@host 'read -r DIR; cd "/opt/app/$DIR"; SIZE=$(du -s); echo "YVALUE=$SIZE" > "../size_$DIR.txt"' <<< "$DIR"
    

    如果目录包含可能导致语法错误的空格或字符,这将很有帮助。也推荐使用数组:

    DIRS=('DIR 1' 'DIR 2' 'DIR 3')
    for DIR in "${DIRS[@]}"; do
        sshpass ...
    done
    

    【讨论】:

    • 感谢您的快速回复!这非常有效!
    【解决方案2】:

    用单引号 (') 将字符串括起来将停止发生任何 bash 扩展,您需要使用双引号来评估 $DIR,转义要通过 SSH 发送的字符串中的任何双引号:

      sshpass -p user_password ssh -o StrictHostKeyChecking=no user_name@host "cd /opt/app/$DIR;SIZE=\$(du -s);echo \"YVALUE\"=$SIZE > ../size_$DIR.txt"
    

    【讨论】:

    • 我假设$(du -s) 中的美元也应该被转义,否则他将获得本地路径大小。无论如何,我认为 Konsolebox 的答案更好,因为它不太容易出错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 2019-01-31
    • 2011-02-03
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多