远程服务器上shell脚本中的循环无法工作

3
代码尝试从我的本地服务器ssh到远程服务器并运行一些命令。
ssh root@$remoteip 'bash -s' <<END3               
gcdadirs=`strings binary | egrep '.gcda$'`       
for dir in ${gcdadirs[@]}; do
directory=$(dirname ${dir})
echo $dir >> dirstr.txt
mkdir -p $directory
chown $root:$root $directory
chmod 777 $directory
done
END3

以上命令在远程服务器上创建了一个目录结构,目前工作正常。

我想要将相同的目录结构打包成tar文件。所以我正在使用与上述相同的逻辑。

ssh root@$remoteip 'bash -s' <<END3   
touch emptyfile
tar -cf gcda.tar emptyfile
gcdadirs=`strings binary | egrep '.gcda$'`
for dir in ${gcdadirs[@]}; do
tar -rf gcda.tar $dir
done
END3

上面的代码应该创建一个tar文件,其中包含由for循环返回的所有目录。我通过将代码复制到远程服务器并在那里运行来尝试代码逻辑,并且它有效。但是,如果我从本地服务器ssh连接到远程服务器并尝试运行它,则不会进入for循环。它不会将任何内容附加到在第二行创建的空文件中的tar文件。


尝试为您想要远程执行的内容编写一个bash脚本,然后将其管道传输到ssh。ssh root@$remoteip 'bash -s' < scriptname。我认为这可能与here文档的处理方式有关。 - jwde
4
或者尝试使用<<'END3'(注意引号周围的END3)。祝好运。 - shellter
2
我很惊讶第一个例子能够工作,因为在这里文档中没有引用定界符,所有的替换都应该在本地发生。如果 OP 在本地测试了他的代码并且仍然设置了环境变量,那么它可能会起作用。 - ex-bart
@WalterA 我想把所有东西都放在一个脚本里...如果什么都不起作用,我可能会这样做。谢谢。 - Shashank
3
它们可以防止here-document内的shell替换。您希望$符号被传输到ssh连接的另一侧,而不是在本地解释。反引号也是如此。 - ex-bart
显示剩余3条评论
1个回答

1

尝试使用<<'END3'语法。

注意引号防止here-document中的shell替换。您希望$符号被传输到ssh连接的另一侧,而不是在本地解释。反引号同理。


从评论中提取,作为被接受的答案。发布为社区维基。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接