StrictHostKeyChecking을 끄는 방법을 알 수 없습니다.

StrictHostKeyChecking을 끄는 방법을 알 수 없습니다.

다른 데이터베이스에서 이 ssh 명령을 실행했습니다.

ssh -i $8 -l $9 $1 "set -o pipefail set -o StrictHostKeyChecking=no; mysqldump --single-transaction --skip-lock-tables -u $2 -p$3 -P $4 -h $5 $6" | gzip -c > $7;

이러한 변수는 명령에 대한 인수입니다.

백엔드의 IP 주소가 변경되지 않는 한 작동하지만 set -o StrictHostkeyChecking=no다음 메시지가 표시됩니다.

Offending ECDSA key in /home/admin/.ssh/known_hosts:130
  remove with:
  ssh-keygen -f "/home/admin/.ssh/known_hosts" -R "172.30.0.63"
ECDSA host key for 172.30.0.63 has changed and you have requested strict checking.
Host key verification failed.

명령에 문제가 있는 것 같은데 어디에 있는지 잘 모르겠습니다. 나는 성공하지 못한 채 몇 가지 다른 변형을 시도했습니다.

답변1

StrictHostKeyChecking=no매개변수는 원격 쉘 명령이 아닌 ssh 명령에 옵션으로 전달되어야 합니다. 예를 들어:

ssh -i "$8" -o StrictHostKeyChecking=no -l "$9" "$1"  "
  set -o pipefail; mysqldump --single-transaction --skip-lock-tables -u $2 -p$3 -P $4 -h $5 $6
" | gzip -c > "$7"

(어떤 로컬 쉘을 사용하고 있는지 언급하지 않았지만 많은 쉘이 단어 분리 및 파일 이름 생성을 위해 인용되지 않은 확장을 수행하기 때문에 여기서 인수 확장 주위에 큰따옴표를 붙였습니다.)

이 옵션은 가능한 MiM 공격에 대한 경고를 억제하지 않습니다.

답변2

명령줄 옵션을 사용하여 런타임에 비활성화해도 작동하지 않으면 파일에서 비활성화하십시오 ~/.ssh/config. 파일이 존재하지 않으면 생성할 수 있습니다. rw-r-r또는 를 사용하여 파일에 권한을 부여한 후 다음을 추가하세요.chmod 644 ~/.ssh/configrw-chmod 600 ~/.ssh/config

 Host *
    StrictHostKeyChecking no

또한 이 게시물을 확인하세요: SSH에서 엄격한 호스트 키 확인을 비활성화하는 방법은 무엇입니까?

답변3

저는 보통 다른 사람들에게 서버 관리 방법을 알려주지 않지만...

한 줄짜리 쉘 스크립트에 8개의 변수를 전달한다면 정말 나쁜 일을 하고 있는 것입니다.무섭게잘못된.

간단하게 시작해 보겠습니다.

첫째, SSH 비트:

나는 여러분에게 의심의 이점을 제공하고 각 변수가 다음과 같이 가정할 것입니다.실제로는 가변적이며 여러 호스트가 있습니다.다른 ID 파일을 가진 다른 사용자로 액세스가 필요한 경우,전혀올바른 호스트 키가 있다고 믿을 수 있으며 위 항목을 변경할 권한이 없습니다.

(일관성과 적절한 보안에 대해 5페이지 분량의 비난으로 가득 찬 호언장담을 쓰지 않을 것입니다. 꼭 읽어주세요)

~/.ssh/config이 목적으로 사용하려는 관리자 계정 에 다음을 추가하십시오 .

Host foo
   StrictHostKeyChecking No
   HostName 172.30.0.63
   User foouser
   IdentityFile ~/.ssh/id_foo.ed25519

Host bar
  StrictHostKeyChecking No
  HostName bar.internal.elsewhere
  User baruser
  IdentityFile ~/.ssh/id_bar.ecdsa

Host qux
  StrictHostKeyChecking No
  HostName qux.eternal.universe
  User quxuser
  IdentityFile ~/.ssh/id_qux.rsa

등. 이 시점에서 Steeldriver가 지적 했듯이 명령줄에서 및 를 생략할 수 있습니다. 이는 $8시작 하기에 정확히 잘못된 위치에 있습니다.$9-o StrictHostKeyChecking No

둘째, mysqldump 부분입니다.

이것이 바로 자동화 소프트웨어의 목적입니다안시푸르빛으로 반짝이는.

먼저 다음과 같이 Ansible 인벤토리를 생성합니다.

all:
  dbservers:
    hosts:
      foo:
      bar:
      qux:

여기서는 파일과 동일한 명명 규칙을 사용합니다 ~/.ssh/config. ansible -m ping dbservers올바른지 확인하고 필요한 경우 오류를 수정하는 데 사용합니다 .

그런 다음 다음을 추가하십시오 host_vars/baz/vars.yaml.

mysql_db_user: 'bazdbuser'
mysql_db_password: 'bazdbpassword'
mysql_db_port: 12345
mysql_db_host: 'baz-db.remote
mysql_db_dbs:
  - 'bazdb1'
  - 'bazdb2'
  - 'bazdb3'
mysql_dump_local_destination: '/backups/baz/'

그런 다음 어디에서나 다음 플레이북을 만들고 이름을 지정해 보겠습니다 make_backup_dumps.yaml.

---
- hosts: dbservers
  become: false
  tasks:
    - name: Dump requested databases.
      community.mysql.mysql_db:
        login_host: '{{ mysql_db_host }}'
        login_user: '{{ mysql_db_user }}'
        login_port: '{{ mysql_db_port }}'
        skip_lock_tables: true
        state: dump
        target: '/tmp/db_{{ ansible_host }}_{{ item }}.sql.gz'
      loop: {{ mysql_db_dbs }}

    - name: Retrieve remote dumps.
      ansible.builtin.fetch:
        src: '/tmp/db_{{ ansible_host }}_{{ item }}.sql.gz'
        dest: '{{ mysql_dump_local_destination }}'
      loop: {{ mysql_db_dbs }}

ansible-playbook --limit foo make_backup_dumps.yaml를 사용하여 한 호스트에서 스크립트를 테스트합니다. 출력이 원하는 경우 를 사용하여 모든 호스트에서 스크립트를 테스트합니다 ansible-playbook make_backup_dumps.yaml.

이는 한 줄의 코드보다 조금 더 투박할 수 있지만 더 읽기 쉽고 유지 관리가 더 쉽고 호스트당 여러 데이터베이스 테이블 덤프를 지원하며 각 호스트에서 병렬로 실행됩니다.문제를 해결할 수 있도록 선택적인 세부 정보 수준과 함께 각 호스트의 각 단계의 성공/실패에 대한 개요를 제공합니다..

사용하고 안하고는 각자의 몫이지만 어쨌든GNU를 사랑한다면 최소한 호스트 키를 정리하세요. 실제로 발생하는 오류는 로컬에서 발생하기 때문입니다..

관련 정보