我有这个脚本:
ssh -T user@$123.456.789.123 <<EOF
cd www
var=$(tail index.htm)
echo $var
EOF
我认为它应该做的是:
相反,似乎 tail 在更改文件夹之前执行,因此找不到 index.htm 文件。
我尝试过不同的命令,每次看起来命令替换的结果我试图存储到变量中,在打开SSH连接之后,在任何其他脚本之前执行。
我在这里缺少什么?
答案 0 :(得分:3)
在将此文档的内容传递给$(...)
之前,ssh
正在本地展开。要将文字文本发送到远程服务器,请引用此处的文档分隔符。
ssh -T user@$123.456.789.123 <<'EOF'
cd www
var=$(tail index.htm)
echo "$var"
EOF
(另外,引用$var
的扩展以保护shell中的任何嵌入间距。)
答案 1 :(得分:2)
tail
正在本地计算机上的bash脚本中运行,而不是在远程主机上运行。在您执行ssh
命令之前,已经进行了替换。
您的脚本可以简单地替换为:
ssh -T user@$123.456.789.123 tail www/index.htm
答案 2 :(得分:2)
如果要将这些命令发送到远程服务器,可以编写
ssh -T user@$123.456.789.123 'cd www && var=$(tail index.htm) && echo $var'
请注意,在前一个结果上调整下一个命令允许SSH返回有意义的返回码。在您的heredoc中,无论发生什么(例如tail
失败),SSH将返回$?= 0,因为echo
不会失败。
另一个选择是在那里创建一个脚本并使用ssh启动它。