如何执行远程命令并传入本地文件作为输入?


22

是否有可能做到这一点:

ssh user@socket command /path/to/file/on/local/machine

也就是说,我要一步一步地使用本地文件执行远程命令,而无需先使用scp该文件进行复制。


如果远程计算机通过网络安装了本地计算机文件的父目录,或者将文件重定向到ssh命令,则可能
h3rrmiller 2012年

Answers:


23

您只错过了一个符号=)

ssh user@socket command < /path/to/file/on/local/machine

当然!我想知道为什么我不考虑通过ssh进行输入重定向吗?
jsj 2012年

如果远程命令只能接受文件参数而不能从stdin读取怎么办?
iruvar 2012年

在这种情况下,@ ChandraRavoori您需要先复制它scp

4
@ChandraRavoori您可以尝试给它提供文件参数/dev/stdin-。可能会或可能不会工作(/dev/stdin是一个文件,但寻找它会失败)
derobert 2012年

1
@derobert和rush玩了一点,发现了一种在bash下使用进程替换来完成此操作的怪异方法。这仍然受到寻求限制,并且可能会因需要所有其他报价而变得笨拙。示例如下。猫test.file | ssh user @
machine'bash

4

无论命令如何,一种有效的方法是通过远程文件系统使文件在远程计算机上可用。由于您具有SSH连接:

  1. 建立反向SSH隧道。另请参见SSH轻松将文件复制到本地系统
  2. 在包含SSHFS的远程计算机上共享文件的计算机的目录树上挂载。(示例

无论如何,在执行命令之前,都需要进行其他移动。

@吉尔斯:我认为原标题是误导性的,您根据误解性的标题理解了他的问题。据我所知道的,还以为,他其实并没有想采取行动本地文件,但只是通过它作为输入。(但是,如果我理解正确的话,您的回答是惊人的!也许我应该问您回答的问题,只是为了给您提供一个放置答案的位置,以便您可以适当地称赞它。)我已经编辑了问题标题使它与身体和所选答案保持一致。
iconoclast 2014年

@iconoclast我不记得我写这篇文章时的心态,但是我回答了这个问题。它需要进行一些设置,但具有将当前需求推广到其他情况的优势,这些情况还不足以复制输入。如果有人没有重定向,我也会提到重定向。已经以略有不同的形式多次询问了更一般的问题。
吉尔(Gilles)'所以

好吧,我一定误会了你的答案。我没有尝试过,但是推断,由于您正在建立反向隧道(从远程主机到本地主机?),因此您允许本地文件由远程计算机修改。不是吗?
iconoclast 2014年

@iconoclast是的,这允许远程计算机修改本地文件(除了允许它读取之外,这是问题所在)。
吉尔斯(Gilles)'“ SO-不要邪恶”

1
# What if remote command can only take a file argument and not read from stdin? (1_CR)
ssh user@socket command < /path/to/file/on/local/machine
...
cat test.file | ssh user@machine 'bash -c "wc -l <(cat -)"'  # 1_CR

作为bash进程替换<(cat -)< <(xargs -0 -n 1000 cat)(请参见下文)的替代方法,您可以仅使用xargs并将cat指定文件的内容通过管道传输到wc -l(更便于移植)。

# Assuming that test.file contains file paths each delimited by an ASCII NUL character \0
# and that we are to count all those lines in all those files (provided by test.file).

#find . -type f -print0 > test.file
# test with repeated line count of ~/.bash_history file
for n in {1..1000}; do printf '%s\000' "${HOME}/.bash_history"; done > test.file

# xargs & cat
ssh localhost 'export LC_ALL=C; xargs -0 -n 1000 cat | wc -l' <test.file

# Bash process substitution
cat test.file | ssh localhost 'bash -c "export LC_ALL=C; wc -l < <(xargs -0 -n 1000 cat)"'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.