디스크 공간 정보를 확인해보니 7.5GB 공간밖에 안 되고 디스크의 대부분을 소모하는 경우가 대부분 이 메시지이기 때문에 일부 디스크 공간을 회수하고 싶습니다.
Failed to add the host to the list of known hosts
디스크 공간을 지우는 명령은 다음과 같습니다
cat machines.txt | xargs -I {} ssh {} bash -c "'sudo echo " " > /var/log/messages'"
내 컴퓨터의 IP가 포함된 텍스트가 있습니다. sudo echo " "
명령이 작동하지 않는 이유를 알아내려고 노력 중입니다 . 그것은 나에게 이런 힌트를 주었다.
Failed to add the host to the list of known hosts (/home/agilos/.ssh/known_hosts).
Permission denied (publickey).
xargs: ssh: exited with status 255; aborting
답변1
/var/log/messages
이 명령은 동시에 여러 호스트의 현재 콘텐츠를 삭제 하려고 시도하는 것처럼 보입니다 .이는 악의적인 해커가 자신의 흔적을 감추기 위해 할 수 있는 일처럼 보입니다.
나는 machines.txt
시작이 이어야 한다고 가정합니다 cat machines.txt
. 그렇지 않다면 machines.txt
이는 실제로 실행 파일이고 모호한 방식으로 파일 이름을 지정한다는 의미입니다. 이는 악의적인 해커가 해커의 침입을 방지하기 위해 때때로 자신의 도구를 숨기려고 시도하는 또 다른 작업입니다.
데이터를 에 파이핑하고 있으므로 xargs
파이프된 데이터는 프로세스의 표준 입력 스트림을 대체합니다 xargs
. 기본적으로 하위 프로세스는 파이프 입력을 방해하지 않도록 xargs
표준 입력을 리디렉션합니다 . 명령은 표준 입력이 터미널이 아니라는 것을 감지하고 배치 모드에서 실행되고 있다고 가정합니다. 즉, 사용자와 전혀 상호 작용하지 않고 작업을 수행하려고 시도합니다./dev/null
xargs
ssh
xargs -I {} ...
명령줄의 나머지 부분은 의 각 줄에 대해 한 번씩 실행 됩니다 machines.txt
. 오류 메시지는 ssh
첫 번째 줄에 대해 실행된 명령에 의해 출력되었을 수 있습니다. 또는 machines.txt
명령의 한 인스턴스가 출력에서 오류를 발견하기 전에 많은 줄이 성공적으로 실행되었을 수 있습니다. 어느 줄이 오류인지 ssh
확인하는 것이 완전히 불가능합니다. machines.txt
오류가 발생했을 때 사용 중입니다.
첫 번째 메시지:
Failed to add the host to the list of known hosts (/home/agilos/.ssh/known_hosts).
경고입니다. SSH는 known_hosts
향후 연결에서 확인할 수 있도록 연결하는 각 새 시스템의 공개 호스트 키를 파일에 기록하려고 시도하지만 이번에는 어떤 이유로 실패합니다. 실제 연결 시도는 계속될 수 있습니다.
두 번째 메시지:
Permission denied (publickey).
호스트 중 하나가 SSH 인증 키를 수락하지 않음을 나타냅니다. 명령이 배치 모드에서 실행되고 있기 때문에 ssh
암호 인증을 시도하지도 않는다는 것을 알고 있습니다. 왜냐하면 배치 모드는 일반적으로 명령이 로컬 사용자와의 상호 작용을 허용하지 않는 컨텍스트에서 실행되고 있음을 의미하기 때문입니다. 따라서 인증이 발생할 수 없기 때문에 SSH 연결 시도 중 하나가 실패합니다.
세 번째 메시지:
xargs: ssh: exited with status 255; aborting
xargs
파이프로 연결된 입력 데이터의 내용을 기반으로 실행 명령 중 하나가 오류와 함께 종료되었음을 감지했기 때문에 명령에서 삭제되었습니다 . ssh
연결 오류가 발생할 때마다 SSH는 상태 255로 종료됩니다. 다른 오류 코드는 원격 명령 실행의 결과입니다.
부분을 사용하여 여러 호스트에서 명령을 실행 하려고 시도하고 있으며 sudo echo " " > /var/log/messages
리디렉션 부분)은 로그인한 사용자로 실행되므로 아무 작업도 수행하지 않을 가능성이 높습니다.xargs
sudo
echo " "
> /var/log/messages
인스턴스가 적절하게 설정되어 있고 logrotate
비밀번호 프롬프트 없이 실행할 수 있는 권한이 있는 경우 sudo
다음과 같이 모든 인스턴스에서 추가 로그 순환을 실행할 수 있습니다.
xargs -I {} ssh {} sudo /usr/sbin/logrotate /etc/logrotate.conf < machines.txt
이는 또한 참조 내에서 까다로운 참조가 필요하지 않게 해줍니다.
실제 를 잘라야 하는 경우 /var/log/messages
"sudo를 통해 루트 권한이 있는 파일로 리디렉션" 문제는 일반적으로 tee
와 함께 명령을 사용하여 해결할 수 있습니다 sudo
. 따라서 명령줄은 다음과 같습니다.
xargs -I {} ssh {} bash -c "'echo " " | sudo tee /var/log/messages'" < machines.txt
하지만 먼저 SSH 인증 문제를 해결해야 하며, 그러기 위해서는 어떤 호스트가 SSH 키로 인증하지 않는지 알아야 합니다. 또한 echo " "
첫 번째 로그 줄의 시작 부분에 불필요한 공백 문자를 추가하는 것이 대신 자르기를 사용하는 것이 더 좋습니다 /dev/null
.
xargs -I {} ssh {} bash -c "'sudo tee /var/log/messages </dev/null && hostname'" < machines.txt
그러면 로그를 성공적으로 잘라낸 각 시스템의 호스트 이름이 출력되므로 어느 인스턴스가 machines.txt
SSH 인증에 실패했는지 알 수 있습니다.