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


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!