동일한 데이터를 변수의 한 줄에 넣으시겠습니까?

동일한 데이터를 변수의 한 줄에 넣으시겠습니까?

Asterisk 전화 시스템을 갖춘 FreePBX와 함께 사용할 스크립트가 있습니다. 확장 프로그램/엔드포인트 중 오프라인/사용할 수 없는 것이 있는지 알고 싶습니다. 해당 정보를 이메일로 보내드리고 싶습니다.

#!/bin/bash

email="[email protected]"

offlineExtensions=$(asterisk -rx 'pjsip show contacts' | grep -i "unavail")

if [ "$offlineExtensions" ]
then
echo $offlineExtensions | mail -s "Extensions Offline" $email
fi

내 이메일은 다음과 같습니다.

Contact: 7101/sip:7101@IP_ADDRESS:5060 d20a378e88 Unavail 55.829 Contact: 7770/sip:7770@IP_ADDRESS:5060 174a796f10 Unavail 12.275

연락처 정보가 서로 연결되지 않고 별도의 행에 표시되기를 원합니다. 스크립트에서 다음 줄 기호(\n)를 사용했는데 작동하지 않는 것 같습니다.

어떤 아이디어가 있나요?

답변1

$offlineExtensions에서 참조 되지 않았기 때문에 연락처가 연결되었습니다 echo $offlineExtensions | .... 변수의 개행 문자는 그대로 유지되지만 쉘은 변수를 단어로 분할한 다음 공백으로 구분된 단어를 연결합니다. 이를 방지하려면 $offlineExtensions큰따옴표로 묶어야 합니다 . 마찬가지로, 인용하는 것도 위생에 좋습니다 $email(비록 이 특별한 경우에는 인용하지 않는 것이 무해하기는 하지만).

스크립트에 숨어 있는 관련 없는 문제는 echo인쇄 내용을 알 수 없는 변수를 사용하고 있다는 것입니다. $offlineExtensions대시로 시작하는 경우 대시 -echo옵션으로 만드세요. 의 일부 구현에서는 단지 using 대신 을 사용하여 문제를 피할 수 있지만 echo다른 구현에서는 그렇지 않습니다. 이를 처리하는 휴대용 방법은 대신 사용하는 것입니다.echo --echoprintfecho

요약하면 echo ...이 줄을 다음으로 바꾸세요.

printf '%s\n' "$offlineExtensions" | mail -s 'Extensions Offline' "$email"

답변2

당신은 사용해보십시오

pjsip show contact concise

그러나 이것은 어쨌든 최선의 선택은 아닙니다.

가장 좋은 방법은 /var/log/asterisk/messages 또는 전체 파일을 구문 분석하는 것입니다(누군가 액세스할 수 없거나 연결할 수 없는 경우 로그하도록 설정할 수 있음).

가장 좋은 방법은 직접 작성하는 것보다 nagios 또는 기타 모니터링 소프트웨어를 사용하는 것입니다.

답변3

내 최종 스크립트가 작동합니다. 감사해요.

#!/bin/bash

email="[email protected]"

offlineExtensions=$(asterisk -rx 'pjsip show contacts' | grep -i "unavail")

if [ "$offlineExtensions" ]
then
printf "$offlineExtensions" | mail -s 'Extensions Offline' "$email"
fi

관련 정보