stdout
한 CentOS 서버 stdin
에서 다른 CentOS 서버 로 파이프해야 합니다. 이게 가능해?
최신 정보
ScottPack, MikeyB 및 jofel 모두 유효한 답변이 있습니다. 내 질문에 보안을 요구 사항으로 지정하지 않더라도 항상 안전하기 때문에 Scott에게 답변을 수여했습니다. 그러나 다른 두 동료의 제안도 효과가 있습니다.
stdout
한 CentOS 서버 stdin
에서 다른 CentOS 서버 로 파이프해야 합니다. 이게 가능해?
ScottPack, MikeyB 및 jofel 모두 유효한 답변이 있습니다. 내 질문에 보안을 요구 사항으로 지정하지 않더라도 항상 안전하기 때문에 Scott에게 답변을 수여했습니다. 그러나 다른 두 동료의 제안도 효과가 있습니다.
답변:
이것은 당연한 일입니다.
ssh
원격 서버에서 명령을 실행하는 데 사용하면 일종의 멋진 내부 입력 / 출력 리디렉션을 수행합니다. 사실, 나는 이것이 OpenSSH의 미묘한 더 좋은 기능 중 하나라는 것을 알았습니다. 특히 ssh
원격 시스템에서 임의의 명령을 실행하는 데 사용 하는 경우 ssh는 실행중인 명령의 명령 STDIN
과 매핑됩니다 STDOUT
.
예를 들어, 백업 타르볼을 생성하려고하지만 로컬로 저장하거나 저장하지는 않는다고 가정합니다. 이 구문을 간략히 살펴 보겠습니다.
$ tar -cf - /path/to/backup/dir | ssh remotehost "cat - > backupfile.tar"
우리는 타르볼을 만들어 STDOUT
일반적인 것들에 쓰고 있습니다 . 우리가 원격 명령을 실행하기 위해 SSH를 사용하고 있기 때문에, STDIN은 매핑됩니다 STDIN
의 cat
. 그런 다음 파일로 리디렉션합니다.
netcat
양쪽 끝에서 아주 간단하고 쉬운 통신 채널을 만들 수 있습니다. tar cf - /path/to/dir | nc 1.2.3.4 5000
하나 개의 서버에 nc -l -p 5000 > backupfile.tar
다른합니다.
와이어를 통한 보안에 대해 걱정할 필요가 없을 때 호스트간에 데이터를 연결하는 편리한 방법은 netcat
연결의 양쪽 끝을 사용하는 것입니다.
또한 비동기 적으로 설정할 수도 있습니다.
"수신자"(실제로 양방향 통신이 가능하지만 다음과 같이 생각하기가 쉽습니다)에서 다음을 실행하십시오.
nc -l -p 5000 > /path/to/backupfile.tar
"보낸 사람"에서 다음을 실행하십시오.
tar cf - /path/to/dir | nc 1.2.3.4 5000
단방향 및 양방향 연결을 생성하기위한 매우 강력한 도구는 socat
입니다. 가능성을 간략히 살펴 보려면 맨 페이지 의 예제를 참조하십시오 .
그것은 대체 netcat
도구와 유사한 도구를 완전히 대체 하며 SSL 암호화 연결을 지원합니다. 초보자에게는 간단하지는 않지만 적어도 존재한다는 것을 아는 것이 좋습니다.
요새 서버 를 사용해야 할 때 상황이 약간 더 복잡해집니다 .
다음 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"
의사 터미널주의
여기서 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.
나는 당신이 명령을 실행하는 사용자에 대해 서버간에 암호 핸드 쉐이킹을 설정하지 않은 후 이것이 가장 쉬운 것으로 나타났습니다.
비 압축
tar cf - . | ssh servername "cd /path-to-dir && tar xf -"
즉석에서 압축
tar czf - . | ssh servername "cd /path-to-dir && tar xzf -"
ssh
것은 이미 압축하도록 구성된 경우 매우 나쁜 생각 입니다.
Compression
구성 파일 중 하나에서 설정할 수 있습니다. 빠른 확인은 ssh -v localhost exit 2>&1 | fgrep -i compress
출력을 제공 하는지 확인하는 것입니다 (ssh가 읽은대로 구성을 덤프 할 수있는 옵션이 없습니다).
tar
및 명령 -C path
에 모두 작동 하는 플래그가 있습니다 . 거기에 별도의 명령 을 넣을 필요는 없습니다 . (하지만 하나 이상의 명령을 실행할 수 있습니다.)c
x
cd
-C
는 GNU 확장입니다 (현재는 bsdtar 및 schily tar에서도 지원됨)