한 줄에 서버간에 보호 된 파일을 복사 하시겠습니까?


13

squid.conf한 서버에서 다른 서버로 복사하고 싶습니다 .

  • 서버가 서로 대화하지 않습니다. 워크 스테이션을 살펴보고 싶습니다.
  • 두 서버 모두 파일이 있으므로 대상에서 덮어 씁니다.
  • 파일에 600권한이 있으며 루트가 소유합니다.
  • ssh를 통한 루트 로그인이 비활성화되었습니다 ( PermitRootLogin no).
  • 설치 안내서의 일부이므로 가능하면 한 줄로하고 싶습니다.

할 줄 알아

ssh source 'tar czpf - -C /etc/squid/ squid.conf' | \
    ssh target 'tar xzpf - -C /etc/squid/'

서버간에 파일을 복사하고 권한을 보존합니다. 그러나이 경우 "Permission denied"가 표시됩니다.

또한 내가 할 수 있다는 것을 알고 있습니다.

ssh -t source 'sudo cat /etc/squid/squid.conf'

이렇게 -t하면 sudo가 파일의 내용을 출력하기 전에 관리자 암호를 요구할 수 있습니다.

문제는 이러한 기술을 각 서버에서 sudo 암호를 요구하는 파일로 결합하여 파일을 대상으로 전송하는 방법을 모른다는 것입니다. 이게 가능해?

업데이트 : 내가 생각해 낼 수있는 최선의 방법은 다음과 같습니다.

ssh -t source 'sudo tar czf /tmp/squid.tgz -C /etc/squid squid.conf' && \
ssh source 'cat /tmp/squid.tgz' | \
    ssh target 'cat >/tmp/squid.tgz' && \
ssh -t source 'sudo rm /tmp/squid.tgz' && \
ssh -t target \
    'sudo tar xzf /tmp/squid.tgz -C /etc/squid && sudo rm /tmp/squid.tgz'

이것을 하나의 라이너라고 부르는 것은 스트레칭과 같습니다. 설치 안내서의 단계를 구분하기 위해 세분화하겠습니다.


답변:


11

ssh를 sudo와 연결하는 것보다 ssh와 ssh를 연결하는 것이 더 쉽습니다. 따라서 ssh 서버 구성을 변경해도 괜찮습니다. 각 서버의 루트에 대해 ssh를 여는 것이 좋지만 localhost에서만 열 것을 제안합니다. 다음의 Match절을 사용 하여이 작업을 수행 할 수 있습니다 sshd_config.

PermitRootLogin no
Match Host localhost
    PermitRootLogin yes

그런 다음 원격 사용자에서 로컬 사용자로, 로컬 사용자에서 루트로 키 기반 인증 체인을 설정할 수 있습니다. 로그에 누가 루트로 로그인했는지 알려주는 인증 추적이 여전히 있으며 인증 단계는 sudo가 관련된 것과 동일합니다.

서버에 루트로 연결하려면 다음 ~/.ssh/config과 같이 별명을 정의 하십시오.

Host server-root
HostName server.example.com
User root
ProxyCommand "ssh server.example.com nc %h %p"

을 사용한다고 주장 하면 터미널에서 읽을 것을 주장하기 sudo때문에 별도의 명령이 필요하다고 생각합니다 sudo(계정에 티켓이 있더라도) ¹ 및 일반적인 파일 복사 방법 (scp, sftp, rsync) 원격 터미널과의 상호 작용을 지원합니다.

ssh 및 sudo를 사용하여 제안 된 명령을 단순화 할 수 있습니다. 양쪽에서 암호를 다시 묻지 않도록 sudo를 설정 한 경우 암호 요구 사항을 극복하고 파일을 복사하는 다른 시간을 극복하기 위해 한 번만 실행할 수 있습니다. 암호 프롬프트가 표시되지 않아 파일을 직접 쉽게 복사 할 수 없습니다.

ssh -t source 'sudo true'
ssh -t target 'sudo true'
ssh -t source 'sudo cat squid.conf' |
ssh -t target 'sudo tee /etc/squid/squid.conf'

¹이 없으면을 NOPASSWD요청하지 않습니다.


첫 번째 솔루션은 나를 위해 잘 작동했지만 두 번째 줄은이어야합니다 Match host localhost.
cduck

4

sudo다음 방법으로 비밀번호를 묻지 않도록 설정할 수 있습니다 .

소스에서 :

user    ALL=NOPASSWD:/bin/cat

대상 :

user    ALL=NOPASSWD:/usr/bin/tee

그리고 yur 기계를 사용하십시오 :

ssh source 'sudo cat /test' | ssh target 'sudo tee /test'

그러나 꼭두각시 같은 것을 사용하는 것이 좋습니다 . 구성 파일 배포와 관련된 문제를 훨씬 더 쉽고 쉽게 해결합니다.

추신. 그런데 sudo사용자에게 비밀번호를 묻도록 설정하면 [sudo] password for user대상 파일에 문자열이 나타 납니다.


꼭두각시 제안에 +1하지만 솔루션이 안전하지 않은 것 같습니다. 루트로 로그인하는 것도 허용 할 수 있습니다.
itsadok

2

ssh를 사용하는 대신 scp를 사용하여 서버간에 파일을 전송할 수 있습니다.

대상 서버에 로그인하십시오.

파일을 복사 할 대상 디렉토리로 변경하십시오.

#scp -r -p -P 22 root@source-ipaddress:/source-path-file-to-copy .

r-재귀 p-원본 파일의 수정 시간, 액세스 시간 및 모드를 유지합니다


이것은 내가 로그인 할 수없는 루트로 로그인 할 수 있다고 가정합니다. 질문을 업데이트합니다.
itsadok

2

ssh 구성을 변경하지 않고 server2에 대한 ssh 연결을 통해 두 개의 ssh 터널 host-> server1 및 server2-> host를 작성할 수 있습니다. 호스트 시스템에서이 두 개의 터널을 연결하십시오 (같은 포트). 그리고 server2에서 sudo를 실행하여 server1의 연결된 터널에서 데이터를 검색하여 server2에 저장하십시오.

ssh -L60000:${source}:22 -R60000:localhost:60000 -t ${target} 'sudo bash -c "ssh -p 60000 '$(whoami)'@localhost \"cd /path/to/dir; tar -czf - files\"|tar -C/path/to/target -xzf -"'

아이디어는 다음과 같습니다. 1- 포트 60000에서 시스템에서 소스 시스템으로 로컬 터널을 작성합니다.

ssh -L60000:${source}:22

1b- 원격 터널을 생성하여 기계로 다시 도달

-R60000:localhost:60000

2- 대상 기계에 연결

-t ${target}

3- 쓰기 위해 대상 머신에서 루트로 모두 실행

'sudo bash -c "..."'

4- 터널을 통해 소스 머신에 연결하십시오. whoami 및 localhost는 $ {target} 시스템의 localhost를 의미합니다.

ssh -p 60000 '$(whoami)'@localhost

5- 원격 파일을 패키징하고 stdout에 압축 파일을 보냅니다.

cd /path/to/dir; tar -czf - file

6- stdout을 통해 패키지를 받고 / path / to / target 디렉토리에 따라 파일을 추출하십시오.

|tar -C/path/to/target -xzf -

참고 : 최대 3 개의 sshkey 확인 및 3 개의 비밀번호 요청을받을 수 있습니다. 그러나 파일은 복사됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.