squid.conf
한 서버에서 다른 서버로 복사하고 싶습니다 .
- 서버는 서로 통신하지 않습니다. 내 워크스테이션을 확인하고 싶습니다.
- 두 서버 모두 이 파일을 가지고 있으므로 대상에서 덮어쓰게 됩니다.
- 이러한 파일에는
600
권한이 있으며 루트가 소유합니다. - SSH를 통한 루트 로그인이 비활성화되었습니다(
PermitRootLogin no
). - 설정 가이드의 일부가 될 것이므로 가능하면 한 줄로 작성하고 싶습니다.
나는 할 줄 안다
ssh source 'tar czpf - -C /etc/squid/ squid.conf' | \
ssh target 'tar xzpf - -C /etc/squid/'
서버 간에 파일을 복사하고 권한을 유지합니다. 그러나 이 경우에는 "권한이 거부되었습니다"라는 메시지가 표시됩니다.
나는 또한 이것을 할 수 있다는 것을 알고 있습니다:
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'
그것을 라인이라고 부르는 것은 스트레칭처럼 보입니다. 저는 설정 가이드에서 이를 별도의 단계로 나누어야겠다고 생각했습니다.
답변1
sudo를 사용하여 ssh에 연결하는 것보다 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"
이것을 사용하겠다고 고집한다면 터미널에서 읽기를 고집하고(귀하의 계정에 대한 티켓이 있더라도) 일반적인 파일 복사 방법(scp, sftp, rsync) 중 어느 것도 사용하지 않기 sudo
때문에 별도의 명령이 필요할 것이라고 생각합니다. sudo
원격 터미널과의 상호 작용을 지원합니다.
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
묻지 않을 것입니다.
답변2
sudo
다음으로 비밀번호를 묻지 않도록 설정할 수 있습니다.
원천:
user ALL=NOPASSWD:/bin/cat
추정치가 정확합니다.
user ALL=NOPASSWD:/usr/bin/tee
컴퓨터에서 다음을 수행하십시오.
ssh source 'sudo cat /test' | ssh target 'sudo tee /test'
하지만 나는 다음과 같은 것을 사용하는 것이 좋습니다인형. 프로필 배포 문제를 더 좋고 쉽게 해결할 수 있습니다.
추신. 그런데 sudo
사용자에게 비밀번호를 묻도록 설정하면 해당 문자열이 [sudo] password for user
대상 파일에 나타납니다.
답변3
SSH를 사용하는 대신 scp를 사용하여 서버 간에 파일을 전송할 수 있습니다.
대상 서버에 로그인합니다:
파일을 복사하려는 대상 디렉터리로 변경합니다.
#scp -r -p -P 22 root@source-ipaddress:/source-path-file-to-copy .
r - 재귀 p - 원본 파일의 수정 시간, 액세스 시간 및 모드를 유지합니다.
답변4
SSH 구성을 변경하지 않고도 server2에 대한 SSH 연결을 통해 두 개의 SSH 터널인 호스트->서버1 및 서버2->호스트를 생성할 수 있습니다. 호스트에서 두 터널(동일 포트)을 모두 연결합니다. 그리고 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 및 on localhost는 ${target} 시스템의 로컬 호스트를 나타냅니다.
ssh -p 60000 '$(whoami)'@localhost
5- 원격 파일을 압축하여 표준 출력으로 압축하여 보냅니다.
cd /path/to/dir; tar -czf - file
6- stdout을 통해 패키지를 받고 이에 따라 /path/to/target 디렉토리에 파일을 추출합니다.
|tar -C/path/to/target -xzf -
참고: 최대 3개의 SSHkey 확인과 3개의 비밀번호 요청을 받을 수 있습니다. 하지만 파일은 복사됩니다.