학습목표 : 외부접속허용,서버설정,개발을 위한 로컬환경구축
<1>
주어진 문제에서 MkQgNUIgMkQgMkQg 같은 문자들이 엄청 길게 적혀있는데 이를
BASE64 방식으로 숨겨진 코드를 16진수로 풀고 이걸 아스키 코드로 변환하면
브레인 퍽 코드가 나오는데 이걸 해독하면 FLAG IS MNU{3z_CTF} 라는 정답이 나옴
문제 사이트에 들어간 후 도구 툴을 킨 후에 콘솔을 보니 정보보호 3원칙(기밀성, 무결성, 가용성)
이 영어로 적혀있었고 문제 제목이 broken keyboard 이여서 그것을 사이트 안 입력칸에 한영키를
바꾼 상태로 저 단어들을 입력하니(ex. 가용성 -> rkdydtjd / 다른 단어들을 입력할 경우 오류가 남)
독창성, 새로운 아이디어와 유사한 단어는? 이라는 정답에 대한 힌트가 나옴. 그리하여 비슷한
단어 뜻을 가진 창의성 을 한영키를 바꾼 상태로 입력해보니 flag{Creativity_is_a_pleasant_intellect}
라는 정답이 나옴
#은 설정하지 않거나 설치하지 않습니다.
0.기본설치
sudo apt -y install lrzsz
sudo apt -y install unzip
sudo apt -y install net-tools
#sudo apt -y install vsftpd
#sudo systemctl enable vsftpd
#sudo nano /etc/vsftpd.conf
#write_enable=YES > write_enable=YES
#sudo systemctl start vsftpd
1.flask설치(학생 설치)
사용자가 master일 경우
sudo hostnamectl set-hostname IP003
sudo reboot
hostname
date
sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
date
python
sudo apt update
sudo apt -y install python3-venv
cd ~
mkdir projects
mkdir venvs
cd venvs
python3 -m venv mysite
cd mysite
cd bin
. activate
pip install flask
pip install flask-migrate
pip install flask-wtf
pip install email_validator
pip install flask-markdown
#필요하면 설치해줌
#pip install mysql-connector-python
#pip install requests
#pip install RPi.GPIO
#python -c "import RPi.GPIO as GPIO; print(GPIO.VERSION)"
2.기본 환경 설정
cd /home/master/venvs
nano /home/master/venvs/mysite.sh
#!/bin/bash
cd ~/projects/flask
export FLASK_APP=hospital
export FLASK_DEBUG=true
export APP_CONFIG_FILE=/home/master/projects/flask/config/production.py
. ~/venvs/mysite/bin/activate
nano /home/master/venvs/mysite.env
FLASK_APP=hospital
FLASK_DEBUG=true
APP_CONFIG_FILE=/home/master/projects/flask/config/production.py
cd /home/master
nano .profile
alias mysite='export FLASK_APP=hospital;export FLASK_DEBUG=true;export APP_CONFIG_FILE=/home/master/projects/flask/config/production.py;cd ~/projects/flask;. ~/venvs/mysite/bin/activate'
sudo reboot
3.gunicorn설치(조교 설치)
mysite 실행
(mysite)flask위치
pip install gunicorn
로컬에서 개발완료된 파일을 업로드할 예정
cd ~/projects/flask
unzip flask
조교+학생
gunicorn --bind 0:5000 "hospital:create_app()"
4. 교수설정
cd /etc/systemd/system/
sudo nano mysite.service
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=master
Group=master
WorkingDirectory=/home/master/projects/flask
EnvironmentFile=/home/master/venvs/mysite.env
ExecStart=/home/master/venvs/mysite/bin/gunicorn \
--workers 2 \
--bind unix:/tmp/mysite.sock \
"hospital:create_app()"
[Install]
WantedBy=multi-user.target
sudo apt install nginx
cd /etc/nginx/sites-available/
sudo nano mysite
server {
listen 80;
server_name 192.168.0.3;
location = /favicon.ico { access_log off; log_not_found off; }
location /static {
alias /home/master/projects/flask/hospital/static;
}
location / {
include proxy_params;
proxy_pass http://unix:/tmp/mysite.sock;
}
}
cd /etc/nginx/sites-enabled/
sudo rm default
sudo ln -s /etc/nginx/sites-available/mysite
sudo systemctl restart nginx
sudo systemctl restart mysite
sudo systemctl enable nginx
sudo systemctl enable mysite
교수+조교+학생(나중에 실행)
gunicorn --bind unix:/tmp/mysite.sock "hospital:create_app()"
sudo reboot
5. css적용하기
chmod +x /home/master
chmod +x /home/master/projects
chmod +x /home/master/projects/flask
chmod +x /home/master/projects/flask/hospital
chmod +x /home/master/projects/flask/hospital/static
6.사이트확인
http://ra.zero2right.kr
http://ra.zero2right.kr/monitor/sensor
#추가설정
7. 데이터베이스설치
pip install pymysql gpiozero
sudo apt install default-libmysqlclient-dev build-essential pkg-config -y
pip install mysqlclient
sudo apt -y install mariadb-server
create database master;
CREATE USER 'master'@'localhost' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON master.* TO 'master'@'localhost';
flush privileges;
Mysql에 저장하는 방법
-- MySQL 서버에 접속
mysql -u root -p
-- 데이터베이스 생성
CREATE DATABASE sensor_data;
-- 데이터베이스 사용
USE sensor_data;
-- 테이블 생성
CREATE TABLE sensor (
id INT AUTO_INCREMENT PRIMARY KEY,
part varchar(100) NOT NULL,
data FLOAT NOT NULL,
regdate TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
초음파code
from flask import Flask, render_template
import RPi.GPIO as GPIO
import time
import sqlite3
app = Flask(__name__)
# GPIO 설정
GPIO.setmode(GPIO.BCM)
TRIG = 23 # Trigger 핀
ECHO = 24 # Echo 핀
# 초음파 센서 값을 측정하는 함수
def get_ultrasonic_distance():
GPIO.setup(TRIG, GPIO.OUT)
GPIO.setup(ECHO, GPIO.IN)
GPIO.output(TRIG, False)
time.sleep(2)
# 트리거 핀을 HIGH로 설정하여 초음파 신호를 보냄
GPIO.output(TRIG, True)
time.sleep(0.00001)
GPIO.output(TRIG, False)
while GPIO.input(ECHO) == 0:
pulse_start = time.time()
while GPIO.input(ECHO) == 1:
pulse_end = time.time()
pulse_duration = pulse_end - pulse_start
distance = pulse_duration * 17150 # 초음파의 속도 계산 (cm)
distance = round(distance, 2)
return distance
# 데이터베이스에 거리값을 저장하는 함수
def save_to_database(distance):
conn = sqlite3.connect('sensor_data.db')
cursor = conn.cursor()
cursor.execute('''CREATE TABLE IF NOT EXISTS distances (id INTEGER PRIMARY KEY, distance REAL, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP)''')
cursor.execute('INSERT INTO distances (distance) VALUES (?)', (distance,))
conn.commit()
conn.close()
@app.route('/')
def index():
# 초음파 센서 값 측정
distance = get_ultrasonic_distance()
# 데이터베이스에 값 저장
save_to_database(distance)
# 데이터베이스에서 최신 값을 조회
conn = sqlite3.connect('sensor_data.db')
cursor = conn.cursor()
cursor.execute('SELECT * FROM distances ORDER BY timestamp DESC LIMIT 5') # 최근 5개의 데이터 가져오기
data = cursor.fetchall()
conn.close()
return render_template('index.html', distance=distance, data=data)
if __name__ == '__main__':
app.run(debug=True)
{% for row in data %}
{{ row[0] }}
{{ row[1] }}
{{ row[2] }}
{% endfor %}
from flask import Flask, render_template
import RPi.GPIO as GPIO
import time
import mysql.connector
app = Flask(__name__)
# MySQL 데이터베이스 연결 설정
def get_db_connection():
return mysql.connector.connect(
host="localhost",
user="root", # MySQL 사용자명
password="yourpassword", # MySQL 비밀번호
database="sensor_data"
)