gpt4 book ai didi

shell - 在SSH中将管道和此处文档合并到Shell中

转载 作者:行者123 更新时间:2023-12-02 14:12:49 24 4
gpt4 key购买 nike

好的,所以我最近发现了here文档的神奇之处,该文档可将stdin样式行输入到交互式命令中。但是,我试图将其与SSH一起使用以在远程服务器上执行一堆命令,但是在执行额外的命令之前,我还需要管道输入一些实际的输入,以进一步使事情变得混乱,我还需要获得一些结果背部 ;)

这是我要使用的:

#!/bin/sh
RESULT=$(find -type f "$PATH" | gzip | ssh "$HOST" <<- 'REMOTE_SYNC'
cat > "/tmp/.temp_file"

# Do something with /tmp/.temp_file
REMOTE_SYNC

这真的正确吗?我也遇到的部分问题是,我需要将数据通过管道传递到/ tmp中的该文件,但是我确实应该生成一个随机命名的临时文件,但是我不确定如何做到这一点,请分配变量的名称(以便我可以返回它),仍然将stdin发送到其中。

我也可能提取发现gzip部分是要先在本地运行的单独命令,因为gzipped文件可能足够小,以至于在准备好时发送它会导致SSH连接短得多,然后在生成时将其发送出去,但仍然无法避免以下事实:我需要能够同时向SSH提供stdin和其他命令。

最佳答案

不,你不能这样做。 Heredoc和管道输入都争夺标准输入,只有一个获胜。看这个例子:

echo test | cat << EOF
TEST
EOF

这将打印什么? test和/或 TEST?它输出 TEST,所以heredoc胜出(至少在bash中)。

无论如何,您实际上并不需要。幸运的是, ssh带有 command 参数,该参数将传递给远程主机上的shell,因此您可以在此处将命令用作字符串。所以像这样:
echo TEST | ssh user@host 'cat > tempfile; cat tempfile; rm tempfile'

会起作用(尽管这没有多大意义),左侧命令的输出通过 ssh通过管道传输到远程主机,并在那里以stdin的形式提供。

如果希望通过ssh发送数据时对其进行压缩,则可以使用 -C选项启用压缩。

编辑:

在字符串中使用换行符是完全可以的,因此也可以正常工作:
echo TEST | ssh user@host '
cat > tempfile
cat tempfile
rm tempfile
'

与Heredoc的唯一区别是您必须对引号进行转义。

如果使用 echo TEST | ssh user@host "$(<script.sh)"之类的东西,则可以将所有内容写入文件...

关于shell - 在SSH中将管道和此处文档合并到Shell中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16124361/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com