상자에 SSH를 연결하고 명령을 실행하고 데이터를 파일로 출력한 후 다음 IP 주소로 이동합니다.

상자에 SSH를 연결하고 명령을 실행하고 데이터를 파일로 출력한 후 다음 IP 주소로 이동합니다.

내 Jump 서버에서 스크립트를 실행하고 서버에 SSH로 연결한 다음 명령(예 rm <file>: top또는 ls -lsa)을 실행하고 해당 출력을 가져와 내 Jump 서버의 파일에 넣은 다음 다음 IP 목록으로 이동하고 싶습니다.

IP 주소 목록을 스크립트에 제공하고 모든 IP 주소에서 스크립트를 실행하도록 하고 싶습니다.

지금까지 나는

ssh <IP> 'find ./<Path> -mtime +15 -exec rm <filename> {} \;' > <filename>

하지만 이 작업은 SSH를 통해 상자에 연결하고 명령을 실행하고 정보를 나열하는 것뿐입니다. 명령을 실행하고 데이터를 점프 서버의 파일로 출력한 후 다음 상자로 이동하려면 이 정보가 필요합니다.

어떤 제안이 있으십니까?

답변1

#! /bin/bash
cd /path/to/ssh_logs || exit 1
for targethost in a b c; do
  log_file="${targethost}/$(date --iso-8601=seconds).log"
  mkdir -p "${targethost}" || { echo "Error: ${targethost}";exit 1; }
  { ssh batchuser@"${targethost}" "$command"; rc=$?;
    echo $'\n'"finished (with exit code ${rc}): $(date --iso-8601=seconds)";
  } >"$log_file" 2>&1
done

편집 1:

설명이 필요합니다(스크립트의 세부정보도 변경했습니다).

  1. 디렉터리( /path/to/ssh_logs이 경우) 내에서 출력 파일이 배치될 각 대상 호스트에 대한 하위 디렉터리를 만듭니다. 또 다른 방법은 모든 파일을 동일한 디렉터리에 넣고 파일 이름의 일부로 호스트를 포함하는 것입니다. 이는 취향의 문제입니다(합리적인 수의 파일에 대해). 따라서 첫 번째 단계는 이 디렉터리로 변경을 시도하는 것입니다(또는 실패할 경우 중단).
  2. for targethost in a b c; do ... ; done호스트의 루프입니다. 이 예에서는 호스트 이름이 스크립트에 하드코딩되어 있습니다. 또는 한 줄에 하나씩 또는 공백으로 구분하여 텍스트 파일에 쓰고 이름을 다음과 같이 스크립트에 넣을 수 있습니다.for targethost in $(<targethosts.txt); do
  3. 출력 파일의 경로는 호스트의 하위 디렉터리, 현재 타임스탬프 및 ".log"입니다.
  4. 하위 디렉토리가 아직 존재하지 않으면 하위 디렉토리가 생성됩니다(실패하면 스크립트가 호스트를 인쇄하고 중단합니다).
  5. 두 명령의 출력은 파일로 리디렉션됩니다. ssh 호출 자체와 원하는 경우 ssh가 완료된 직후의 타임스탬프(ssh의 종료 코드 포함)를 통해 소요 시간을 로그에서 확인할 수 있습니다. 명령의 stdout이 파일로 리디렉션된 후 stderr도 stdout으로 리디렉션되어 거기에 있는 메시지도 파일에 도달합니다.

관련 정보