한 서버에서 stdout을 다른 서버에서 stdin으로 파이프 할 수 있습니까?


74

stdout한 CentOS 서버 stdin에서 다른 CentOS 서버 로 파이프해야 합니다. 이게 가능해?

최신 정보

ScottPack, MikeyB 및 jofel 모두 유효한 답변이 있습니다. 내 질문에 보안을 요구 사항으로 지정하지 않더라도 항상 안전하기 때문에 Scott에게 답변을 수여했습니다. 그러나 다른 두 동료의 제안도 효과가 있습니다.


1
비 SSH 접근 방식의 유일한 장점은 처리 속도라는 점에 주목할 가치가 있습니다. 빠른 네트워크에 있고 보안이 불필요하다면 두 개의 명령을 두 개의 창에 입력하는 것이 매우 불편할 수 있습니다.
Random832

답변:


94

이것은 당연한 일입니다.

ssh원격 서버에서 명령을 실행하는 데 사용하면 일종의 멋진 내부 입력 / 출력 리디렉션을 수행합니다. 사실, 나는 이것이 OpenSSH의 미묘한 더 좋은 기능 중 하나라는 것을 알았습니다. 특히 ssh원격 시스템에서 임의의 명령을 실행하는 데 사용 하는 경우 ssh는 실행중인 명령의 명령 STDIN과 매핑됩니다 STDOUT.

예를 들어, 백업 타르볼을 생성하려고하지만 로컬로 저장하거나 저장하지는 않는다고 가정합니다. 이 구문을 간략히 살펴 보겠습니다.

$ tar -cf - /path/to/backup/dir | ssh remotehost "cat - > backupfile.tar"

우리는 타르볼을 만들어 STDOUT일반적인 것들에 쓰고 있습니다 . 우리가 원격 명령을 실행하기 위해 SSH를 사용하고 있기 때문에, STDIN은 매핑됩니다 STDINcat. 그런 다음 파일로 리디렉션합니다.


11
그것은 일종의 "멋진 내부 입력 / 출력 리디렉션"이 아니라 평범하고 지루한 규칙적인 것들입니다. ssh는 다른 도구와 마찬가지로 STDIN에서 읽고 원격 프로세스로 전달합니다. :)
Daniel Pittman 2014 년

7
@DanielPittman :하지만 "멋진 내부"쓰레기라고 부르는 것이 훨씬 더 재미 있습니다.
Scott Pack

7
마찬가지로 netcat양쪽 끝에서 아주 간단하고 쉬운 통신 채널을 만들 수 있습니다. tar cf - /path/to/dir | nc 1.2.3.4 5000하나 개의 서버에 nc -l -p 5000 > backupfile.tar다른합니다.
MikeyB

1
@MikeyB : 좋은 지적입니다. Netcat은 일반 텍스트 프로토콜이므로 민감한 데이터에주의하십시오. 로컬 네트워크를 통한 네트워크 드라이브 획득 (ala dd) 및 포트 스캔과 같은보다 구체적인 사항에는 netcat을 사용하는 경향이 있습니다.
Scott Pack

2
@MikeyB : 당신은 당신의 비행과 바지 좌석으로 무엇을 사람들!
Scott Pack

28

와이어를 통한 보안에 대해 걱정할 필요가 없을 때 호스트간에 데이터를 연결하는 편리한 방법은 netcat연결의 양쪽 끝을 사용하는 것입니다.

또한 비동기 적으로 설정할 수도 있습니다.

"수신자"(실제로 양방향 통신이 가능하지만 다음과 같이 생각하기가 쉽습니다)에서 다음을 실행하십시오.

nc -l -p 5000 > /path/to/backupfile.tar

"보낸 사람"에서 다음을 실행하십시오.

tar cf - /path/to/dir | nc 1.2.3.4 5000

알고 아주 좋아요. 물리적 연결이 백업 네트워크처럼 신뢰할 수 있거나 연결이 이미 터널링 된 경우에 좋습니다.
웨슬리

또는 데이터가 어쨌든 공개 된 것이라면.
사무엘 에드윈 워드

1
netcat +1은 특히 ssh 서버가 실행되지 않는 경우 매우 유용한 도구입니다.
kwarrick

21

단방향 및 양방향 연결을 생성하기위한 매우 강력한 도구는 socat입니다. 가능성을 간략히 살펴 보려면 맨 페이지 의 예제를 참조하십시오 .

그것은 대체 netcat도구와 유사한 도구를 완전히 대체 하며 SSL 암호화 연결을 지원합니다. 초보자에게는 간단하지는 않지만 적어도 존재한다는 것을 아는 것이 좋습니다.


1
@WesleyDavid : "업데이트"에 : 완전성을 위해 socat에 SSL 지원 기능이 추가되어 있으므로 암호화도 가능합니다. 그러나 ssh는 대부분의 경우 더 좋고 쉬운 솔루션이므로 ScottPack의 답변도 선택했을 것입니다.
jofel

5

TL; DR

요새 서버 를 사용해야 할 때 상황이 약간 더 복잡해집니다 .

  1. 다음 ssh과 같이 명령으로 전달할 수 있습니다 ssh.

    • cat local_script.sh | ssh -A usera@bastion ssh -A userb@privateserver "cat > remote_copy_of_local_script.sh; bash remote_copy_of_local_script.sh"
  2. 의사 터미널주의


여기서 ssh가장 중요한 점은 대부분의 도구와 마찬가지로 기본적으로 취급 stdout하고 stdin수정 한다는 것 입니다.

그러나 같은 옵션을 볼 시작할 때 Disable pseudo-terminal allocation.Force pseudo-terminal allocation.당신은 시행 착오를 감수해야 할 수도 있습니다. 그러나 일반적tty 으로 터미널 에뮬레이터 (인간이 입력 한 것)에서 깨진 / 이진 정크를 수정하지 않으면 동작 을 변경하고 싶지 않습니다 .

예를 들어, -At워크 스테이션의 ssh-agent가 전달되고 tmux를 원격으로 실행해도 이진이 바프되지 않도록 사용하는 경향이 있습니다 (예 :) ssh -At bastion.internal tmux -L bruno attach. 도커의 경우도 마찬가지 sudo docker exec -it jenkins bash입니다.

그러나이 두 -t플래그는 다음과 같이하려고 할 때 데이터 손상을 추적하기가 어렵습니다.

# copy /etc/init from jenkins to /tmp/init in testjenkins running as a container
ssh -A bastion.internal \
ssh -A jenkins.internal \
sudo tar cf - -C /etc init | \
sudo docker exec -i testjenkins \
bash -c 'tar xvf - -C /tmp'

# note trailing slashes to make this oneliner more readable.

2

하나의 명령으로 ssh 공개 키를 다른 호스트에 넣으십시오.

ssh root@example.com 'cat >> .ssh/authorized_keys' < .ssh/id_rsa.pub

2

나는 당신이 명령을 실행하는 사용자에 대해 서버간에 암호 핸드 쉐이킹을 설정하지 않은 후 이것이 가장 쉬운 것으로 나타났습니다.

비 압축

tar cf - . | ssh servername "cd /path-to-dir && tar xf -"

즉석에서 압축

tar czf - . | ssh servername "cd /path-to-dir && tar xzf -"

tar 파일에 압축을 사용하는 ssh것은 이미 압축하도록 구성된 경우 매우 나쁜 생각 입니다.
Anthon

@Anthon 왜 그렇게 나쁘고 ssh 압축이 이미 활성화되어 있는지 어떻게 확인합니까?
Tom Hale

1
@TomHale 시스템 속도에 따라 두 번째 압축에는 시간이 걸리지 만 추가 바이트를 줄일 수 없으므로 전체 작업 속도가 느려질 수 있습니다. Compression구성 파일 중 하나에서 설정할 수 있습니다. 빠른 확인은 ssh -v localhost exit 2>&1 | fgrep -i compress출력을 제공 하는지 확인하는 것입니다 (ssh가 읽은대로 구성을 덤프 할 수있는 옵션이 없습니다).
Anthon

tar및 명령 -C path에 모두 작동 하는 플래그가 있습니다 . 거기에 별도의 명령 을 넣을 필요는 없습니다 . (하지만 하나 이상의 명령을 실행할 수 있습니다.)cxcd
Bruno

@Bruno -C는 GNU 확장입니다 (현재는 bsdtar 및 schily tar에서도 지원됨)
Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.