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'
이것을 하나의 라이너라고 부르는 것은 스트레칭과 같습니다. 설치 안내서의 단계를 구분하기 위해 세분화하겠습니다.
답변
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
요청하지 않습니다.
답변
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
대상 파일에 문자열이 나타 납니다.
답변
ssh를 사용하는 대신 scp를 사용하여 서버간에 파일을 전송할 수 있습니다.
대상 서버에 로그인하십시오.
파일을 복사 할 대상 디렉토리로 변경하십시오.
#scp -r -p -P 22 root@source-ipaddress:/source-path-file-to-copy .
r-재귀 p-원본 파일의 수정 시간, 액세스 시간 및 모드를 유지합니다
답변
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 개의 비밀번호 요청을받을 수 있습니다. 그러나 파일은 복사됩니다.