Bash脚本:如何使用$ myVar作为参数之一运行命令?

时间:2018-06-29 15:05:21

标签: bash

我有一个bash脚本,它可以SSH进入2台计算机并运行相同的命令。

我想将其存储在var中,但是我不确定在运行命令时如何引用var的内容

ssh -o StrictHostKeyChecking=no ubuntu@123.123.123 -i ./travis/id_rsa <<-END
  sudo su;
  ...
  echo "Done!";
END


ssh -o StrictHostKeyChecking=no ubuntu@456.456.456 -i ./travis/id_rsa <<-END
  sudo su;
  ...
  echo "Done!";
END

我尝试了类似的方法,但是没有用:

script=$(cat <<-END
  sudo su;
  ...
  echo "Done!";
END
)

ssh -o StrictHostKeyChecking=no ubuntu@123.123.123 -i ./travis/id_rsa $script
ssh -o StrictHostKeyChecking=no ubuntu@456.456.456 -i ./travis/id_rsa $script

2 个答案:

答案 0 :(得分:2)

如果我完全能够理解您的要求,那么您真的 不想将命令放在变量中。

for host in 123.123.123 456.456.456; do
    ssh -o StrictHostKeyChecking=no ubuntu@"$host" -i ./travis/id_rsa<<-\____here
        sudo -s <<-_________there
            : your script goes here
________there
        echo "Done."
____here
done

如果您真的想分配多行变量(但是请相信我,您不愿意),其语法很简单

script='sudo -s <<\____there
    : your commands
____there
echo "Done."'

但是实际上并不需要这样做,并且实际上会使事情复杂化。您会看到,将正确引用的字符串作为参数传递给ssh是非常棘手的-您具有本地外壳程序和远程外壳程序,并且都需要附加的引号或转义符才能正确地通过外壳程序元字符;并且通常带有eval的警告,只有通过传递可执行代码作为远程外壳程序的字符串,才能有效地运行隐藏的eval

答案 1 :(得分:0)

我相信您想做这样的事情:

cmds="sudo bash -c 'command1; command2; command3;'"
ssh ... "$cmds"