在bash
脚本中,我需要的是ssh到服务器并执行一些命令,到目前为止我得到的是这样的:
outPut="ss"
ssh user@$serverAddress << EOF
cd /opt/logs
outPut="$(ls -l)"
echo 'output is ' $outPut
EOF
echo "${outPut}"
但终端的输出是:
output is ss
ss
output
被分配给命令ls -l
的输出,但它显示的仍然是原始值ss
。这有什么不对?
答案 0 :(得分:4)
这里实际上有两个不同的问题。首先,在here-document内部,在将文档发送到命令之前,shell会对变量引用和命令替换进行评估。因此,$(ls -l)
和$outPut
在被发送(通过ssh
)到远程计算机之前在本地计算机上进行评估。您可以通过转义$
(以及可能的某些其他字符,例如您希望发送到远端的转义)或通过将here-doc分隔符括在引号(ssh user@$serverAddress << "EOF"
)中来避免这种情况这会为文档关闭该功能。
其次,远程计算机上发生的变量分配保留在远程计算机上。本地和远程shell无法共享状态。如果您需要来自远程计算机的信息,则需要将其作为输出从脚本的远程部分发回,并捕获该输出(使用remoteOutput=$(ssh ...)
或ssh ... >"$tempFile"
之类的内容)。如果要发回多个值,则脚本的远程部分必须以本地部分可以解析它的方式格式化其输出。另外,请注意远程部分的任何其他输出(包括错误消息)都会混入,因此您必须仔细解析才能获得所需的值。
答案 1 :(得分:1)
不,抱歉这不起作用。
在here-doc中使用命令替换值(to printf)(EOF之间的行):
ssh user@$serverAddress << EOF
printf 'output is %s\n' "$(ls -l /opt/logs)"
EOF
或者从ssh中捕获命令的执行,然后使用值。
outPut="$(
ssh user@$serverAddress << EOF
cd /opt/logs
ls -l
EOF
)"
echo 'output is ' "$outPut"
echo "${outPut}"
选项1看起来更清晰。