가끔 로그 파일에서 특정 로그 콘텐츠(예: API 호출)를 찾아야 할 때가 있는데, 해당 로그 파일은 여러 Linux 서버에 존재합니다.
SSH를 사용하여 모든 서버에 로그인하고 grep을 사용하여 로그를 검색해야 합니다. 지금 당장은 이 작업을 자동으로 완료하는 셸을 작성할 계획입니다. 하지만 쉘에 "ssh"를 넣으려고 할 때 실행하면 항상 비밀번호 입력이 필요하고 화면에 메시지가 표시됩니다.
비밀번호 입력에 대한 경고 메시지가 없는지 확인하는 방법이 있나요? 아니면 여러 서버에서 "grep" 사용을 지원하는 방법이 있나요?
프로덕션 서버에서 이 변경을 수행할 수 있으므로 SSH 키 인증을 사용할 수 없습니다.
왜냐하면 웹 페이지(예: JSP, PHP.)에 결과를 제공하고 백엔드에서 Java로 해당 셸을 실행할 계획이기 때문입니다.
답변1
공개 키 인증이나 Kerberos 인증의 대안은 마스터 연결을 사용하는 것입니다. 이는 일반적으로 ~/.ssh/config
클라이언트의 파일에 다음을 추가하여 수행됩니다.
Host *
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p
그 이후에는 이미 서버에 연결되어 있는 경우 다른 세션을 열면 비밀번호를 묻지 않고 첫 번째 연결을 다시 사용하게 됩니다. 따라서 모든 서버에 대한 연결을 계속 열어두면 스크립트에 비밀번호 입력이 필요하지 않습니다.
의 ControlMaster
, ControlPath
, ControlPersist
옵션을 참조하거나 의 , 옵션을 참조 ssh_config(5)
하십시오 .-O
-S
ssh(1)
답변2
이 질문에 대답하기에는 정말 늦었지만 다음을 사용할 수 있습니다.구조. 다음과 같이 fabfile.py를 작성할 수 있습니다.
from fabric.api import *
env.roledefs = {
'dev': ['dev_a', 'dev_b'],
'pro': ['pro_a', 'pro_b', 'pro_c', 'pro_d']
}
env.user = 'foobar'
env.shell = 'rbash -l -c'
env.disable_known_hosts = True
logfile = '/path/to/logfile.txt'
def g(pattern):
with settings(warn_only=True):
run('grep -H --color "{0}" {1}'.format(pattern, logfile))
위의 스크립트는 다음과 같은 새로운 명령을 정의합니다.g패턴을 입력으로 받아들이면 다음을 사용하여 스크립트를 실행할 수 있습니다.
fab -R dev -p my_pwd g:"some pattern"
역할별로 정의된 호스트에서 "일부 패턴"을 grep하려면개발자.
답변3
공개 키 인증을 사용할 수 없으므로 로그인 프로세스를 반복하지 않으려면 첫 번째 답변에 설명된 방법을 사용하는 것이 더 나을 것입니다. 하지만 여러 서버에 연결하기 위한 스크립트를 만드는 것은 비교적 간단합니다.
#!/usr/bin/env bash
hosts=(ipaddr1 ipaddr2 ipaddr3) # or host names
user=username # your user on host
log=/tmp/mylog # result of grepping
for host in ${hosts[@]}; do
echo "== $host ==" >> $log
ssh -l $user $host "grep some_pattern /path/to/logfile 2>&1" >> $log
done
less $log # view result
나는 이것을 테스트하지 않았지만 작동할 것입니다. 이것이 필요한 것이 아닌지 알려주십시오.
답변4
그냥 grep4j를 사용하세요(https://code.google.com/p/grep4j/)를 백엔드에 추가하고 jsp/php에 결과를 표시합니다.