执行读命令

时间:2013-08-28 17:43:54

标签: bash ssh

我有一个小脚本用于将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

我该如何运作?

1 个答案:

答案 0 :(得分:1)

将变量扩展为如下命令:

$thisCmd

或者这个

command $thisCmd

Bash只会将其解析为单个命令;并且这些将被视为论据或其中的一部分,例如html;

因此,一个基本的解决方案是使用eval:

eval "$thisCmd"

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