0

我有一个小脚本,用于将 bash 命令发送到负载均衡器下的多个 Web 服务器。我能够成功发送命令,但我也想在本地执行它。

#!/bin/bash

echo "Type commands to be sent to web servers 1-8.  Use ctrl+c to exit."

function getCommand() {
  read thisCmd
  echo "Sending '$thisCmd'..."
  if [ ! -z "$thisCmd" ]; then
    # Run command locally
    echo "From web1"
    cd ~
    command $thisCmd
    # Send to remotes
    for i in {2..8}
    do
      echo "From web$i..."
      ssh "web$i" "$thisCmd"
    done
  fi
  echo Done
  getCommand
}

getCommand

但这导致

user@web1:~$ ./sshAll.sh 
Type commands to be sent to web servers 1-8.  Use ctrl+c to exit.
cd html; pwd
Sending 'cd html; pwd'...
From web1
./sshAll.sh: line 11: cd: html;: No such file or directory
From web2...
/home/user/html

我如何让这个工作?

4

1 回答 1

1

将变量扩展为如下命令时:

$thisCmd

或这个

command $thisCmd

Bash 只会将其解析为单个命令,因此;并且喜欢将被视为一个论点或其中的一部分,例如html;

所以一个基本的解决方案是使用 eval:

eval "$thisCmd"

但这有点危险。它仍然与您发送到远程服务器的那些相同。你仍然像 eval 那样执行它们。

于 2013-08-28T17:53:09.080 回答