SSH - 无法在heredoc或命令

时间:2017-04-18 22:50:30

标签: linux bash ssh

是否可以在SSH heredoc中使用本地和远程变量 还是命令?

下面是使用heredoc的ssh脚本示例(实际脚本更复杂):

FILE_NAME设置在要在远程服务器上使用的本地服务器上。

在远程服务器上运行时设置REMOTE_PID以在本地服务器上使用。

FILE_NAME在脚本中被识别。未设置REMOTE_PID。

如果EOF更改为'EOF',则设置REMOTE_PID,而FILE_NAME不设置。 (我不 明白这是为什么?)

有没有办法可以识别REMOTE_PID和FILE_NAME?

正在使用的bash版本2。默认的远程登录是cshell,本地脚本是bash。

FILE_NAME=/example/pdi.dat
ssh user@host bash << EOF
# run script with output...
REMOTE_PID=$(cat $FILE_NAME)
echo $REMOTE_PID
EOF
echo $REMOTE_PID

2 个答案:

答案 0 :(得分:4)

如果您不希望扩展变量,则需要转义$符号:

$ x=abc
$ bash <<EOF
> x=def
> echo $x   # This expands x before sending it to bash. Bash will see only "echo abc"
> echo \$x  # This lets bash perform the expansion. Bash will see "echo $x"
> EOF
abc
def

所以在你的情况下:

ssh user@host bash << EOF
# run script with output...
REMOTE_PID=$(cat $FILE_NAME)
echo \$REMOTE_PID
EOF

或者您也可以使用带单引号的herestring:

$ x=abc
$ bash <<< '
> x=def
> echo $x  # This will not expand, because we are inside single quotes
> '
def

答案 1 :(得分:1)

remote_user_name=user
instance_ip=127.0.0.1
external=$(ls /home/)

ssh -T -i ${private_key}  -l ${remote_user_name} ${instance_ip} << END
  internal=\$(ls /home/)
  echo "\${internal}"
  echo "${external}"
END