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

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

是否有可能做到这一点:

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

也就是说,我想一步使用本地文件执行远程命令,而不是先使用scp复制文件。

答案1

您只错过了一个符号 =)

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

答案2

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

  1. 建立反向 SSH 隧道。也可以看看SSH轻松将文件复制到本地系统
  2. 挂载您计算机的目录树,其中包含要在远程计算机上共享的文件SSHFS。 (例子

答案3

# 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)(见下文)的替代方案,您可以仅使用xargscat将指定文件的内容通过管道传输到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)"'

相关内容