リモートコマンドを実行し、ローカルファイルを入力に渡すには?

リモートコマンドを実行し、ローカルファイルを入力に渡すには?

これは可能ですか?

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

つまり、コピーしたファイルを最初に使用するのではなく、ローカルファイルを使用して一度にリモートコマンドを実行したいと思いますscp

答え1

1シンボルだけが見逃した=)

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

答え2

コマンドに関係なく効果的な方法の1つは、リモートファイルシステムを介してリモートコンピュータでファイルを使用できるようにすることです。 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)の代替として指定されたファイルの内容を使用してxargsパイプすることができます(より移植性に優れています)。catwc -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)"'

関連情報