1

通过 ssh bash 调用存在问题,尽管我已经阅读了有关它的文章,但我仍然无法解释以下内容:

这是一个脚本,很简单

#!/bin/bash
theUser=$1
theHost=$2
ssh -tt $theUser@$theHost 'bash' << EOF
a=1
echo 'dat '$a
exit
EOF

结果如下:

victor@moria:~$ bash thelast.sh victor 10.0.0.8
victor@10.0.0.8's password:
a=1
echo 'dat '
exit
victor@mordor:~$ a=1
victor@mordor:~$ echo 'dat '
dat
victor@mordor:~$ exit
exit
Connection to 10.0.0.8 closed.

如您所见,环境不存储变量“a”的值,因此无法回显它,但任何其他命令(如 ls 或 date)都会返回结果。

所以问题是我做错了什么以及如何避免这种行为?

ps 我无法替换 ssh -tt,但任何其他命令都可以自由替换。

提前致谢

4

2 回答 2

2

在此处的文档中,$a在将输入提供给 ssh 命令之前,它会在本地展开。您可以通过在运算符之后引用终止<<符来防止这种情况,如

ssh -tt $theUser@$theHost 'bash' << 'EOF'
于 2014-12-11T19:34:26.830 回答
1

$a正在本地外壳中扩展,它是未定义的。为了防止这种情况发生,你应该逃避它:

echo "dat \$a"

转义$导致它被逐字传递到远程 shell,而不是被解释为本地扩展。我还添加了一些双引号,因为在其中包含参数扩展是一种很好的做法。

于 2014-12-11T19:33:11.970 回答