将变量传递到脚本for循环中的sshpass命令

时间:2014-07-21 13:33:44

标签: linux bash ssh

我正在尝试创建一个登录到另一台服务器的脚本(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周围使用{}但仍然没有成功。我错过了什么?谢谢你的帮助!

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

用单引号(')包装字符串将停止发生任何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"
相关问题