Como executar um comando remoto e passar no arquivo local como entrada?

22

É possível fazer isso:

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

Isso quer dizer que eu quero executar um comando remoto usando um arquivo local em uma única etapa, sem antes usar scp para copiar o arquivo.

    
por jsj 26.10.2012 / 15:02

3 respostas

23

Você perdeu apenas um símbolo =)

ssh user@socket command < /path/to/file/on/local/machine
    
por 26.10.2012 / 15:07
4

Uma maneira que funciona independentemente do comando é disponibilizar o arquivo na máquina remota por meio de um sistema de arquivos remoto. Como você tem uma conexão SSH:

  1. Estabeleça um túnel SSH reverso . Consulte também SSH copie facilmente o arquivo para o sistema local
  2. Monte uma árvore de diretórios da sua máquina contendo o arquivo a ser compartilhado na máquina remota com SSHFS . ( Exemplo )
por 27.10.2012 / 01:03
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

Como uma alternativa a bash processo de substituição <(cat -) ou < <(xargs -0 -n 1000 cat) (veja abaixo) você pode usar apenas xargs e cat para enviar o conteúdo dos arquivos especificados para wc -l (que é mais portátil).

# Assuming that test.file contains file paths each delimited by an ASCII NUL character 
# 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
# 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
# Assuming that test.file contains file paths each delimited by an ASCII NUL character %pre%
# 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%pre%0' "${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)"'
0' "${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)"'
    
por 09.12.2013 / 20:39

Tags