1

好的,所以我最近发现了将标准输入样式行输入交互式命令的此处文档的魔力。但是,我正在尝试将它与 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 中的那个文件,但我真的应该生成一个随机命名的临时文件,但我不确定我该怎么做,分配变量的名称(所以我可以回到它)并仍然将标准输入发送到它。

我也可以提取 find | gzip 部分到一个单独的命令首先在本地运行,因为 gzip 压缩的文件可能足够小,以至于在准备好时发送它会导致更短的 SSH 连接,然后在它生成时发送它,但它仍然无法解决这个事实我需要能够向 SSH 提供标准输入和我的额外命令。

4

1 回答 1

4

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

echo test | cat << EOF
TEST
EOF

这会打印什么?testTEST或两者兼而有之?它打印TEST,因此heredoc 获胜(至少在bash 中)。

反正你真的不需要这个。幸运的是,它ssh接受了一个command参数,该参数将传递给远程主机上的 shell,因此您可以在此处将命令用作字符串。所以是这样的:

echo TEST | ssh user@host 'cat > tempfile; cat tempfile; rm tempfile'

会起作用(尽管它没有多大意义),左侧命令的输出通过管道传输ssh到远程主机并在那里作为标准输入提供。

如果您希望在通过 ssh 发送数据时压缩数据,您可以使用该-C选项启用压缩。


编辑:

在字符串中使用换行符非常好,所以这也很好:

echo TEST | ssh user@host '
    cat > tempfile
    cat tempfile
    rm tempfile
'

与heredoc 的唯一区别是您必须转义引号。

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

于 2013-04-20T20:23:18.967 回答