![sudo와 함께 ssh를 사용하고 출력을 로컬 파일로 리디렉션하는 방법은 무엇입니까?](https://linux55.com/image/201069/sudo%EC%99%80%20%ED%95%A8%EA%BB%98%20ssh%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EA%B3%A0%20%EC%B6%9C%EB%A0%A5%EC%9D%84%20%EB%A1%9C%EC%BB%AC%20%ED%8C%8C%EC%9D%BC%EB%A1%9C%20%EB%A6%AC%EB%94%94%EB%A0%89%EC%85%98%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
내가 (bash에서) 하고 싶은 일은 다음과 같습니다.
for i in <host1> <host2> ... <hostN>; do ssh leroy@$i "sudo -i; grep Jan\ 15 /var/log/auth.log" > $i;done
해당 호스트의 auth.log에서 오늘 항목을 가져와 내 로컬 파일 시스템에 집계합니다. auth.log는 루트 액세스만 허용하므로 sudo가 필요합니다. 계정이 비활성화되어 루트 사용자를 사용할 수 없습니다. 시스템이 2FA(키 및 비밀번호)를 구현하므로 키 기반 인증을 사용하는 것은 옵션이 아닙니다.
위의 작업을 수행하면(초기 인증 후) 다음과 같은 결과가 나타납니다.
sudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper
-S 옵션과 -M 옵션을 포함하여 다양한 인수를 시도했지만 아무것도 작동하지 않습니다. 온라인 검색에서는 이 상태와 관련된 내용이 발견되지 않았습니다.
답변1
추가 연구에서는 몇 가지 중요한 주의 사항이 있는 sudo -S 옵션이 밝혀졌습니다. 내가 사용하는 것은 다음과 같습니다.
for host in ...; do
read -p "Password for $host sudo:" pswd;
ssh leroy@$host "echo $pswd | sudo -S grep ^Jan\ 15 /var/log/{auth.log,auth.log.1,syslog,syslog.1}" > $host;
done
지침:
프롬프트는 혼란스러울 수 있으므로 매우 명확한 "읽기" 프롬프트가 필요한 이유입니다. 원격 시스템의 비밀번호 프롬프트에 대한 응답이 필요합니다. 비밀번호를 묻는 sudo 프롬프트가 로컬 시스템에 나타나지만 응답은 에코로 표시됩니다. sudo에 전달된 명령이 잠시 동안 실행되면(syslog를 추가했는데 어떤 경우에는 이로 인해 grep이 몇 초 동안 처리됨) sudo가 응답을 기다리는 것처럼 보이지만 실제로는 명령이 처리되고 있습니다.
둘째, 로컬 시스템에 비밀번호가 뜨는데 별로 안 좋은데 저 같은 경우는 집에 있어서 별 문제가 안 돼요.
셋째, 최종 비밀번호는 환경에 남아 있으므로 unset pswd
나중에 추가해야 합니다.
제안된 개선 사항이나 대안을 높이 평가합니다.
답변2
이 기능 이 있든 ssh ... 'sudo -S ...'
없든 표준 입력에서 암호를 묻는 메시지가 표시되지만 암호 프롬프트의 터미널 에코는 비활성화할 수 없습니다.-t
sudo
ssh
실행 명령을 내리면 기본적으로 원격 장치에 터미널이 설정되지 않습니다. sudo
불만이 들어오는 곳은 바로 여기입니다 . 옵션을 사용하여 이 작업을 수행할 수 있습니다 -t
... 하지만 주석에서 언급한 것처럼 이렇게 하면 출력 리디렉션이 중단되고 암호 프롬프트가 출력 파일로 이동합니다. 나중에 프롬프트를 제거할 수 있지만 프롬프트를 보지 않고 비밀번호를 입력하는 방법을 알아야 하고 비밀번호를 입력하기 전까지는 문제가 발생했는지 알 수 없습니다...
따라서 해결 방법은 sudo -S
세션 중에 로컬로 에코를 비활성화하는 것일 수 있습니다. 비밀번호 외에 다른 입력이 필요하지 않다면 괜찮습니다.
또는 sudo -i; grep ...
작동하지 않습니다. 대화형 sudo'ed 쉘을 실행한 다음 실행합니다.grep
뒤쪽에쉘이 종료됩니다. 그래서 나는 대신 달렸다 sudo grep
.
아마도 다음과 같을 것입니다.
for host in ...; do
stty -echo
ssh leroy@"$host" 'sudo -S grep "Jan 15" /var/log/auth.log' > "$host"
stty echo
done