단일 명령으로 여러 SSH 세션

단일 명령으로 여러 SSH 세션

한 서버에서 다른 서버로 데이터베이스를 복사하려고 합니다. 다음 명령을 사용해 보았지만 SSH 비밀번호 입력과 관련이 있습니다. 한 서버의 비밀번호를 입력하면 다른 서버에 대해 불만이 표시되고 그 반대의 경우도 마찬가지입니다.

ssh root@server1 mysqldump --databases db | ssh root@server2 mysql

덤프를 내 컴퓨터에 임시로 저장하여 전송을 완료했는데, 이를 작동시킬 수 있는 방법이 있는지 궁금했습니다.

답변1

비밀번호 프롬프트는 번거롭습니다. SSH를 더욱 유용하게 만드는 방법은 인증에 키를 사용하고 ssh-agent세션당 한 번(선택적 제한 시간 포함) 키를 등록할 수 있는 키 에이전트( )를 실행하는 것입니다. 그런 다음 직접 실행할 수 있습니다.

ssh root@server1 mysqldump --databases db | ssh root@server2 mysql

server1에서 server2에 로그인할 수 있으면 두 서버 간에 데이터가 직접 전송되어야 합니다.

ssh root@server1 'mysqldump --databases db | ssh root@server2 mysql'

(또는 server2에서 server1에 로그인할 수 있는 경우 그 반대). 마찬가지로 인증을 위한 SSH 키가 있습니다. 로컬 컴퓨터에서 server1에 대한 액세스를 제공하는 SSH 개인 키와 server2에 대한 액세스를 제공하는 SSH 개인 키를 등록하십시오. 프록시 전달이 활성화되어 있는지 확인하십시오( AgentForwarding yes) ~/.ssh/config.

꼭 비밀번호를 입력해야 한다면 가장 좋은 방법은 먼저 연결을 설정한 다음 데이터를 전송하는 것입니다. 새로운 OpenSSH 버전을 사용하면 마스터 연결을 열고 이를 통해 슬레이브 연결을 라우팅할 수 있습니다. 슬레이브 연결에는 추가 인증이 필요하지 않습니다. 당신의 ~/.ssh/config:

ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r

두 서버에 대한 기본 연결을 시작합니다.

ssh -N -M root@server1 &
ssh -N -M root@server2 &

그런 다음 다음을 복사하세요.

ssh root@server1 mysqldump --databases db | ssh root@server2 mysql

그 후 더 이상 필요하지 않은 경우 기본 연결을 종료할 수 있습니다.

ssh -O exit root@server1
ssh -O exit root@server2

답변2

가장 효율적인 방법은 mysqldump서버에서 파이프하는 것입니다. 이 명령 목록과 비슷합니다 ...

ssh root@server1 'mysqldump --databases db | ssh root@server2 mysql'

일부 구성 관련 이유로 인해 원격 시스템에서 파이프할 수 없는 경우 다음 명령 목록을 실행할 수 있습니다.

ssh root@server1 'mysqldump db' | ssh root@server2 'mysql db'

내가 만약강요된후자를 수행하려면 pair 를 고려하겠습니다 mysqldump. 비록 이것이 첫 번째 선택이 되어서는 안 되지만 이것이 전송 시간을 절약해 준다고 믿습니다.

ssh root@server1 'mysqldump db | gzip -f' | ssh root@server2 'gzip -d | mysql db'

마지막 예는 100% 정확하지 않을 수도 있습니다. 단지 작동할 것이라고 가정했을 뿐입니다.

답변3

부득이하게 할 경우도착하다두번째프록시와 유사한 시스템에는 마법의 총알이 없습니다. 컴퓨터나 중개 서버로 프록시를 사용해야 합니다.

이는 짜증스러울 수 있지만 ssh는 매우 유연하고 투명하게 만들 수 있습니다. nc에이전트에 프로그램을 설치했다면, 에이전트에 추가할 수 있습니다 ~/.ssh/config.:

Host B
  ProxyCommand ssh -q my_proxy nc -q0 B 22

그 후에는 다음을 수행할 수 있습니다., 클래식 ssh/scp 명령 활성화두번째소속사가 전혀 없는 것 같습니다.

따라서 이 구성을 사용하면 다음을 사용할 수 있습니다.sshfs.

sshfs B: /mnt/B_fs

sshfs를 사용하면 덤프 명령이 다음과 같이 나타날 수 있습니다.

 mysqldump --databases db ... > /mnt/B_fs/db.dump

불행하게도 프록시의 대역폭 속도는 향상되지 않습니다. ssh로 할 수 있는 가장 좋은 일은 활성화 Compression하고 throw하는 것 입니다 CompressionLevel.

바라보다이 게시물SSH 멀티홉에 대한 자세한 지침.

답변4

핵심 솔루션이 최선의 선택이라고 말했습니다. 그러나 어떤 이유로든 이 작업을 수행할 수 없는 경우 명령줄을 다음과 같이 수정할 수 있습니다.

ssh root@server1 mysqldump --databases db | {sleep 5; ssh root@server2 mysql; }

두 번째 명령을 기다리게 합니다. 5첫 번째 비밀번호를 입력하는 속도에 따라 조정하세요.

이는 단지 대체 솔루션일 뿐이며 핵심 솔루션이 훨씬 더 좋습니다.

관련 정보