好的,所以我最近发现了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)"之类的东西,则可以将所有内容写入文件...




