使用ssh和EOF将变量传递给bash脚本中的远程主机

时间:2016-05-08 18:57:40

标签: bash ssh remote-access heredoc

我有一个脚本解析服务器列表,寻找一些东西并在情况正确时执行命令。 主服务器通过ssh连接到它们,执行EOF语句中的所有命令:

#!/bin/bash

# parsing servers
# defining one local variable $VAR

ssh -T -p 1234 root@"server-ip" "$variable" << 'EOF'
# doing some stuff...
var_result=$(mysql -hhost -uuser '-ppasswort' -Ddatabase -N -e "SELECT something FROM somewhere WHERE value=$VAR;")
EOF

我知道如果从EOF中删除单引号,变量可以通过,但如果我这样做,则mysql语句不会工作,一切都会中断。

我知道有传输变量的方法,但有“;”的东西选项之间不适用于我(脚本尝试将其作为命令执行)

有什么想法吗?

2 个答案:

答案 0 :(得分:7)

使用eval$1安全格式转义内容;执行此操作后,您可以在远程shell的命令行上传递它们,并通过远程脚本中的$2# put contents of $VAR into $var_str in a format that a shell can interpret printf -v var_str %q "$VAR" # v- pass the value on the shell command line # | v- keep escaping the heredoc securely # | | ssh -T -p 1234 root@"$host" "bash -s $var_str" <<'EOF' # retrieve it off the shell command line var=$1 # ...and use it as you like thereafter. echo "Remotely using $var" EOF 等检索它们:

html

答案 1 :(得分:2)

如果在没有引号的情况下使用EOF并使mysql命令正常工作:

#!/bin/bash

# parsing servers
# defining one local variable $VAR
VAR=something

ssh -T -p 1234 root@"server-ip" <<EOF
# doing some stuff...
var_result=\$(mysql -hhost -uuser '-ppasswort' -Ddatabase -N -e "SELECT something FROM somewhere WHERE value=$VAR;")
EOF

正如Charles Duffy所述,这可能会产生一些安全隐患。

另一种方法是将所有代码包装在单引号中:

#!/bin/bash

# parsing servers
# defining one local variable $VAR

ssh -T -p 1234 root@"server-ip" '
# doing some stuff...
var_result=$(mysql -hhost -uuser "-ppasswort" -Ddatabase -N -e "SELECT something FROM somewhere WHERE value='"$VAR"';")
'

在这种情况下,您必须小心替换变量。如果您应该关注它,请更好地使用Charles Duffys'方法。