我有一个脚本解析服务器列表,寻找一些东西并在情况正确时执行命令。 主服务器通过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语句不会工作,一切都会中断。
我知道有传输变量的方法,但有“;”的东西选项之间不适用于我(脚本尝试将其作为命令执行)
有什么想法吗?
答案 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'方法。