我有一个小脚本用于将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
我该如何运作?
答案 0 :(得分:1)
将变量扩展为如下命令:
$thisCmd
或者这个
command $thisCmd
Bash只会将其解析为单个命令;并且这些将被视为论据或其中的一部分,例如html;
因此,一个基本的解决方案是使用eval:
eval "$thisCmd"
但这有点危险。它仍然与您发送到远程服务器的那些相同。你仍然像eval一样执行它们。