원격 명령을 실행하고 로컬 파일을 입력으로 전달하는 방법은 무엇입니까?


22

이것을 할 수 있습니까?

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

즉, 먼저 scp파일을 복사 하지 않고 로컬 파일을 사용하여 원격 명령을 한 단계로 실행하고 싶습니다 .


원격 컴퓨터에 로컬 시스템 파일의 상위 디렉토리에 대한 네트워크 마운트가 있거나 파일을 ssh 명령으로
경로 재지 정하는

답변:


23

당신은 하나의 기호를 놓쳤다 =)

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

당연하지! 왜 ssh를 통한 입력 리디렉션을 고려하지 않았는지 궁금합니다!
jsj

원격 명령이 파일 인수 만 취할 수 있고 stdin에서 읽을 수 없으면 어떻게됩니까?
iruvar

이 경우 @ChandraRavoori를 사용하여 scp이전 에 복사해야합니다 .
러시

4
@ChandraRavoori 파일 인수를 /dev/stdin주거나 시도 할 수 있습니다 -. 작동하지 않을 수도 있고 작동하지 않을 수도 있습니다 ( /dev/stdin파일이지만 파일을 찾는 데 실패합니다)
derobert

1
@derobert와 rush는 약간 가지고 놀았으며 bash에서 프로세스 대체를 사용하여 해킹하는 방법을 발견했습니다. 이것은 여전히 ​​추구하는 제한의 대상이며 필요한 모든 추가 인용문으로 다루기가 어려울 수 있습니다. 예는 다음과 같습니다. 고양이 test.file | ssh user @ machine 'bash -c "wc -l <(cat-)"'
iruvar

4

명령에 관계없이 작동하는 한 가지 방법은 원격 파일 시스템을 통해 원격 시스템에서 파일을 사용할 수있게하는 것입니다. SSH 연결이 있으므로

  1. 역방향 SSH 터널을 설정하십시오 . 참조 쉽게 SSH를 로컬 시스템에 파일을 복사
  2. SSHFS 와 원격 시스템에서 공유 할 파일이 포함 된 시스템의 디렉토리 트리를 마운트하십시오 . ( )

어쨌든이 방법은 명령 실행 전에 추가 이동이 필요합니다.
돌진

@Gilles : 원래 제목이 오해의 소지가 있다고 생각하고 오해의 소지가있는 제목을 바탕으로 그의 질문을 이해했습니다. 내가 알 수있는 한, 그는 실제로 로컬 파일 대해 작업 하고 싶지 않고 입력으로 전달합니다. (그러나 내가 올바르게 이해하면 답이 놀랍습니다! 어쩌면 대답 한 질문을해야합니다. 답을 얻을 수있는 적절한 장소에 답을 줄 수있는 장소를 제공하기 위해.) 질문 제목을 편집했습니다. 몸과 선택한 답변과 일치하도록하십시오.
iconoclast

@iconoclast 나는 이것을 쓸 때 내 마음의 상태를 기억하지 못하지만이 대답으로 간다. 일부 설정이 필요하지만 입력을 복사하기에 충분하지 않은 다른 경우로 즉각적인 요구 사항을 넘어 일반화 할 수 있다는 장점이 있습니다. 다른 사람이 그것을하지 않은 경우 리디렉션도 언급했을 것입니다. 보다 일반적인 질문은 약간 다른 형태로 여러 번 요청되었습니다.
Gilles 'SO- 악 그만

네 대답을 오해 했어야했는데 나는 그것을 시도하지는 않았지만 (원격에서 로컬 호스트로) 역방향 터널을 설정했기 때문에 원격 컴퓨터가 로컬 파일을 수정할 수 있다고 추측했습니다. 그렇지 않습니까?
iconoclast

@iconoclast 예, 이것은 원격 컴퓨터가 로컬 파일을 수정할 수있게합니다 (질문이 요구하는 파일을 읽을 수있게 함).
질 '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)"'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.