bash 스크립트좀 봐주세요.

u235의 이미지

#!/bin/bash
# Raspberry PI IP configuration data
subject="from raspberry pi"
from="pu239@naver.com"
to="u239@nate.com"
 
ethtool eth0
IP=$?
until [ $IP -eq 0 ]
do
        sleep 2
        ethtool eth0
        IP=$?
done
 
content="본 라스베리 파이는 `hostname -I` IP로 연결되어 있습니다."
echo "$content" | mail $to -r $from -s "$subject"  //할당된 ip주소를 메일로 발송

이 스크립트 파일명을 crontab에 넣어 부팅시 ip 주소를 메일로 보네는것입니다.
중간의 until 구문이 없으면 ip를 할당받기 전에 실행돼서 빈 값이 나와서 추가했습니다.

그런데 그게 부팅 단계에서는 오류가 되어 루프를 빠져나가 실행이 안됩니다.
이유가 뭔가요

익명 사용자의 이미지

명령어 사용시 절대경로 다 입력해서 해보세요
/sbin/ethtool

익명 사용자의 이미지

헐 바로 그거같네요.
감사합니다

u235의 이미지

#!/bin/bash
subject="Raspberry PI IP configuration data"
log="/tmp/ip_log"
from="root@kali.linux" //작동하는 도메인이 아니거나 다른 주소로보네면 스팸으로 수신됨..
to="u239@nate.com"
ns="168.126.63.1"
 
until [ ]   //인터넷 연결될때가지 3초 간격으로 무한반목
do
    let retry_cnt=retry_cnt+1
    /bin/nslookup $ns >& $log && break   //모든 명령은 반드시 풀패스를 요함.
    sleep 3
done
 
echo Repeated $retry_cnt times... >> $log
content="`/bin/date` : 본 라스베리 파이는 `/bin/hostname -I` IP로 연결되어 있습니다."
echo "$content" | /bin/mail $to -r $from -s "$subject"
echo $content >> $log

내친김에 nslookup으로 네트워크 연결까지를 확인후 발송하도록 고처서 완벽 작동합니다.
불과 몇줄인데도 수십번의 수정을 거처야 하였으며 호되게 데여보니 >& 와 함께 로그의 중요성도 실감했네요 ㅋㅋ
다만 등록된 메일서버가 아니어서인지 스팸 메일함으로 수신되네요 ㅠㅠ

James Gostling

파이썬3의 이미지

내부에서 외부로 시스템정보를 전자메일로 전달하게끔 하는게
굉장히 난이도 높은 기술인데
박수를 보냅니다^^^

차후 할 수 있다면 Sendmail 대신 ssmtp/msmtp 나 nullmailer 같은걸로도
구현이 되면 팁으로 남겨주시길 부탁드려요^^^

[우분투 18.04 파여폭스 나비에서 작성했습니다]

황병희의 이미지

u235 wrote:
from="root@kali.linux" //작동하는 도메인이 아니거나 다른 주소로보네면 스팸으로 수신됨..
등록된 메일서버가 아니어서인지 스팸 메일함으로 수신되네요 ㅠㅠ

라즈베리파이에서 smtp.naver.com 을 경유시키셔요.

Naver.com SMTP Server 	smtp.naver.com
SMTP port	587
SMTP security	STARTTLS
SMTP username	Your full email address
SMTP password	Your Naver.com password

참고주소: https://getmailspring.com/setup/access-naver-com-via-imap-smtp

상기 댓글 내용 -- 스마트호스트 -- 이 무엇을 말하는지 그리고 왜 필요한지를 이해하셨다면 차후 ssmtp/msmtp/nullmailer 같은것도 쉽게 설정하실 수 있을거에요~

본 댓글의 핵심쟁점은 스마트호스트 입니다.

[우분투 18.04 파여폭스 나비에서 작성했습니다]

--
^고맙습니다 감사합니다_^))//

익명 사용자의 이미지

죄송한 말씀이지만, 부팅 프로세스가 있는데, 중간에 끼어들어서 뭔가를 하기보다는 부팅 완료된 후에 sendmail 같은거 실행하는게 좋아요.
옛날 시스템이라면 rc0 rc1 ... rc5 rc6 이라는 run level 이 있고, /etc/init.d ?? 인가.. /etc/rc.local ?? 디렉토리였던가... 그러게 있거든요. rc6 에 위치시키면 됩니다. 루프 돌리지 말고요.
systemd 작동되는 환경이라면
systemctl start sendmailip 이런식으로 실행시킬 수 있도록 서비스 파일 만들어줘야 합니다.

익명 사용자의 이미지

답변 감사합니다.
일단 모니터가 없는 라스베리파이용입니다.
때문에 부팅시 할당받은 ip를 메일로 쏴줘야 ssh든 뭐든 접속할수 있기 때문입니다.
rc.local은 없는 버전이고 해서 crontab 스크립크가 필요했습니다.
그런데 ethtool 보다는 인터넷 연결된이후 발송해야 실패하지 않는점을 고려하면 nslookup 루프가 적절할것 같네요.

황병희의 이미지

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
 
import subprocess
 
"""
만약 접속 주소가 서브넷 사설대역이면 curl 대신 ifconfig -a 출력값을 
전자메일 본문에다 기록할 수 있도록 방향을 전환하셔야 합니다
본 코드는 외부 인터넷에서 접속한다는 가정하에 작성되었습니다
"""
 
ip_addr = subprocess.Popen(["curl -s ifconfig.co"], stdout=subprocess.PIPE, shell=True)
output_ip_addr = ip_addr.communicate()[0].decode("utf-8").strip()
 
fping_test = subprocess.Popen(["fping 168.126.63.1"], stdout=subprocess.PIPE, shell=True)
output_fping = fping_test.communicate()[0].decode("utf-8")
 
if "alive" in output_fping:
    subprocess.call("mail -s '현재 접속주소는 {0} 입니다.' soyeomul+gcp@gmail.com < /dev/null".format(output_ip_addr), shell=True)
else:
    exit("인터넷 연결 준비중입니다.")
 
# EOF

[우분투 18.04 파여폭스 나비에서 작성했습니다]
[크롬OS 에서 스크린샷 올렸습니다]

댓글 첨부 파일: 
첨부파일 크기
Image icon Screenshot 2020-03-01 at 9.53.28 PM.png435.12 KB

--
^고맙습니다 감사합니다_^))//

황병희의 이미지

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
 
import subprocess
 
"""
본 코드는 인트라넷 사설대역에서 접속한다는 가정하에 작성되었습니다
"""
 
fping_test = subprocess.Popen(["fping 168.126.63.1"], stdout=subprocess.PIPE, shell=True)
output_fping = fping_test.communicate()[0].decode("utf-8")
 
if "alive" in output_fping:
    subprocess.call("ifconfig -a > /tmp/ip_test", shell=True)
    subprocess.call("mail -s '접속주소 정보입니다' soyeomul+gcp@gmail.com < /tmp/ip_test", shell=True)
else:
    exit("인터넷 연결 준비중입니다.")
 
# EOF

[우분투 18.04 파여폭스 나비에서 작성했습니다]

댓글 첨부 파일: 
첨부파일 크기
Image icon Screenshot from 2020-03-03 21-35-23.png411.01 KB

--
^고맙습니다 감사합니다_^))//

u235의 이미지

실은 파이가 이처럼 어떤 현장에 속해있을경우 항상 문제되는 부분인데요.
어떤 이벤트 상황을 외부에 알리는 수단으로 자체 서버를 구성하면 라우터에 접근하지 않는한 외부에서는 직접 접속할 수단이 없는 샘입니다.
때문에 궁여지책으로 단방향이지만 우선은 메일을 통하는 방법을 사용한것이고
차후 생각하는 제대로된 통신방법으로는 공인된 장소의 DB를 매개수단으로 사용하려고 합니다.
즉 현장에서 측정된 데이터는 파이선으로 외부 DB에 주기적으로 기록하며 외부에서는 PHP로 DB를 읽어오는 방법이 어떤가 생각하고 있으며 이를 역으로도 구현하면 현장쪽으로 간단한 지시도 가능하지 않을까 합니다만...

James Gostling

파이썬3의 이미지

참고로 curl이 HTTP 도 지원합니다. 내부 시스템정보들을 외부로 HTTP 방식으로 전송할 수 있다는걸 예전에 우분투 대화방에서 어떤분께 들었어요. 이리되면 번거로운 SMTP(전자메일) 방식을 쓰지않고도 공인된장소의 DB 에 HTTP 방식으로 정보를 직접 기록할 수 있을거라 생각합니다.

[우분투 18.04 파여폭스 나비에서 작성했습니다]

첫댓글쓴사람의 이미지

curl에 한표 추천합니다.

curl http://xxx.xxx.com/update.php?nodename=1&localip=192.168.1.1&hostname=node1

이런식으로 curl로 보내고 받으면 사설 및 공인IP도 쉽게 확인 가능합니다.
또한 많이 단순해지죠

파이썬3의 이미지

확인 감사드립니다^^^

[우분투 18.04 파여폭스 나비에서 작성했습니다]

u235의 이미지

파이선으로 함수를 만들어 인자를 통한 데이터 전달이 수월하지 않을까 합니다
사용할 DBMS는 PostgreSql 입니다.

James Gostling

파이썬3의 이미지

시스템 구축 잘 되시면 차후 여유생기실때에 강좌란에 소개 부탁드릴께요^^^

[우분투 18.04 파여폭스 나비에서 작성했씁니다]

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.