2013-04-20 67 views
1

好吧,所以我最近发现了这里的文档提供标准输入样式行到交互式命令的神奇。然而,我试图用SSH来在远程服务器上执行一堆命令,但是我还需要在执行额外的命令之前输入一些实际的输入,以进一步混淆事项,我还需要获得一些结果回;)结合管道和这里的文件在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。

+1

它看起来像你试图重塑'rsync';您可能想使用它。 – msw 2013-04-20 20:30:25

回答

4

不,你不能这样做。 heredoc和管道输入都是为stdin而竞争的,只有一个获胜。看看这个例子:

echo test | cat << EOF 
TEST 
EOF 

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

反正你不需要这个。幸运的是,ssh需要一个command参数,该参数将被传递到远程主机上的shell,因此您可以在此使用您的命令作为字符串。因此,像这样:

echo TEST | ssh [email protected] 'cat > tempfile; cat tempfile; rm tempfile' 

将工作(althoug它并没有太大的意义),左侧命令的输出通过管道输送ssh到远程主机,并作为标准输入提供有。

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


编辑:

使用字符串中的换行符是完全正常的,所以这个工作太细:

echo TEST | ssh [email protected] ' 
    cat > tempfile 
    cat tempfile 
    rm tempfile 
' 

到定界符唯一的区别是,你有逃跑的报价。

如果你使用类似echo TEST | ssh [email protected] "$(<script.sh)"你可以写的一切到一个文件...

+0

嗯,我希望仍然使用这里的文档,而不是试图凝聚我的命令到字符串参数;我可能不得不尝试通过stdin将数据和命令作为单个流发送,因此我只需添加用于拆分它们并运行shell脚本的命令。虽然谢谢! – Haravikk 2013-04-21 19:06:21

+0

增加了一些例子。我不认为在相同的输入流上发送命令和输入不是一个好主意...... – mata 2013-04-21 19:21:44