StoryCode

자바스크립트.변수.모니터링워처

JavaScript, ECMAScript
반응형

function print(t) {
  var c = document.getElementById('console');
  c.innerHTML = c.innerHTML + '
' + t;
}

// Demo
var varw = (function (context) {
  return function (varName, varValue) {
    var value = varValue;
  
    Object.defineProperty(context, varName, {
      get: function () { return value; },
      set: function (v) {
        value = v;
        print('Value changed! New value: ' + value);
      }
    });
  };
})(window);

varw('varWatch'); // Declare
print(varWatch);
varWatch = 456;
print(varWatch);

print('---');

varw('otherVarWatch', 123); // Declare with initial value
print(otherVarWatch);
otherVarWatch = 789;
print(otherVarWatch);

 

 

결과)

undefined
Value changed! New value: 456
456
---
123
Value changed! New value: 789
789

 

참조) https://stackoverflow.com/questions/1759987/listening-for-variable-changes-in-javascript

반응형

'JavaScript, ECMAScript' 카테고리의 다른 글

자바스크립트 역사.  (0) 2020.09.21
Count, 카운트  (0) 2020.03.09
실수를 정수로 바꾸는 방법  (0) 2020.03.04
Hoisting.호이스팅  (0) 2020.02.12
한글 받침 구별법  (0) 2019.04.15

DJango (Windows)

Python, 파이썬
반응형

 

  터미널 명령 결과
1 Terminal ( git bash ) $ mkdir proejctname
code proejctname
프로젝트용 폴더 생성
VisualCode 로 proejctname 오픈
2 VSC Terminal ( powershell ) $
단축키 : Ctrl + `
(VSC > View > Terminal )
python -m venv myvenv 가상환경 생성됨.
3 VSC Terminal ( git bash ) $ source myvenv/Scripts/activate (venv) 진입
4 VSC Terminal ( git bash, venv ) $ pip install django
pip install pylint-django
venv 를 생성후, venv내에 프로젝트에 적합한 개발환경인 django 구축.
5 VSC Terminal ( git bash, venv ) $ django-admin startproject myproject myproject 라는 "django 프로젝트" 생성
그 아래 myproject 폴더와 manage.py 생성
6 VSC Terminal ( gitbash, venv ) myproject $ python manage.py startapp myapp 프로젝트내에 앱이 만들어 진다.
여러 앱을 만들수 있으나 단일앱으로 해본다.

앱을 프로젝트 연결 : myproject/myproject/settings.py 의 INSTALLED_APPS 에 myapp.apps.MyappConfig추가 
( 추가 규칙 : '{app이름}.apps.{app이름(맨 앞이 대문자)}Config')
= myapp/apps.py 의 class 명임.

7 VSC Terminal ( gitbash, venv ) my project $ mkdir myapp/templates settings.py > TEMPLATES > DIRS 에 
os.path.join(BASE_DIR, '/templates'), 추가
8 VSC Terminal ( git bash, venv ) my project $ python manage.py runserver http://127.0.0.1:8000 으로 장고 접속 가능
9.1 VSC Terminal ( git bash, venv ) my project $ python manage.py makemigrations settings.py > DATABASES 에 있는 NAME 으로 "빈 DB 파일" 을 생성 (sqlite3)
9.2 VSC Terminal ( git bash, venv ) my project $ python manage.py migrate 9.1의 빈 DB 파일에 실제 Meta Table과 Table 생성
9.3 VSC Terminal ( git bash, venv ) my project $ python manage.py createsuperuser 9.2 DB 파일에 접근할 계정 생성

설치

참조) https://ssungkang.tistory.com/entry/Django-01-%EA%B8%B0%EB%B3%B8%ED%99%98%EA%B2%BD%EC%85%8B%ED%8C%85-%EA%B0%80%EC%83%81%ED%99%98%EA%B2%BD-%EB%A7%8C%EB%93%A4%EA%B8%B0?category=320582

 

1. git-scm.com 에서 git 설치후, 시작메뉴에서 git bash 실행

 

2. 가상 환경용 디렉토리 생성 (0000-000,Project.Dev.Repository\Dev.Django\)

gitbash$ mkdir Django

gitbash$ mkdir Django/venvproject

gitbash$ cd Django

 

3.vscode 사용 편의를 위해 "$ code 프로젝트폴더명" 를 실행할 수 있도록 하면 편한데,

vscode 설치후, 환경변수 PATH에 "Microsoft VS Code" 디렉토리를 추가하면 된다.

 

4.vscode 실행

gitbash$ code venvproject/

 

5.python 설치

Ctrl + Shift + X 를 눌러서 Python 을 검색후 설치한다.

 

6.Shell 추가

Ctrl + Shift + P 를 눌러서, Terminal: Select Default Shell 을 입력후, Git Bash 를 선택한다.

Menu > Terminal > New Terminal 을 클릭하면, bash 를 선택할 수 있게 된다.

( 반드시 새 터미널을 열어야 한다 )

 

7.가상환경생성

vscode menu > Terminal > New Terminal 를 클릭한뒤,

terminal 1:powershell> python3 -m venv myvenv 실행. ( myvenv 는 사용자가 자유로이 명명. VSCode 왼쪽 EXPLORER>VENVPROJECT>myvenv 가 생성되니 눈으로 확인 )

 

8.가상환경 실행

terminal 2:gitbash> source myvenv/Scripts/activate 실행

명령 실행후 프롬프트에 (myvenv) 가 앞에 나와야 한다.

 

source 문장을 실행했는데, "cmdlet, 함수, 스크립트..." 라는 오류가 발생하면, https://itinerant.tistory.com/63 참조

혹은 위 6번 다시 참조.

 

9.django 설치

(myvenv) $ pip install django

 

 

 

 

 

 

 

 

 

 

 

Hello, World

참조) https://ssungkang.tistory.com/entry/Django-02-Django-%EC%8B%9C%EC%9E%91-Hello-World-%EC%B6%9C%EB%A0%A5?category=320582

 

 

1. Project 만들기

django-admin startproject myproject

cd myproject

 

2. 서버 실행

python manage.py runserver

 

3. http 접속해서 확인 가능

http://127.0.0.1:8000/

 

4. 앱생성

python manage.py startapp myapp

- myproject프로젝트에 myapp 폴더가 생성됨

 

- 앱을 프로젝트와 연결해줘야 함

myproject/myproject/settings.py

INSTALLED_APPS = [

    'django.contrib.admin',

    'django.contrib.auth',

    'django.contrib.contenttypes',

    'django.contrib.sessions',

    'django.contrib.messages',

    'django.contrib.staticfiles',

    'myapp.apps.MyappConfig'

]

의 INSTALLED_APPS 에 myapp.apps.MyappConfig추가 ( 추가 규칙 : '{app이름}.apps.{app이름(맨 앞이 대문자)}Config')

 

- 디렉토리 연결 :

myproject/myproject/settings.py

TEMPLATES = [

    {

        'BACKEND''django.template.backends.django.DjangoTemplates',

        'DIRS': [os.path.join(BASE_DIR, '/templates'),],

 

5. 화면에 보여질 html 파일과 views.py 에 home.html 함수 만들기

- myapp에 templates 라는 디텍토리를 만들고 필요한 만큼, templates 디렉토리안에 home.html 을 만든다.

 

myapp/templates/home.html

<h1>Hello World </h1>

 

myapp/views.py

from django.shortcuts import render

def home(request):

    return render(request, 'home.html')

 

6.  url 연결.

- url 로 접근시, views.py 에 있는 함수를 실행시키고, 그 함수가 html 파일을 띄워준다.

 

myprojects/urls.py에 추가할 내용

import myapp.views

urlpatterns = [

   path('', myapp.views.home, name='home'), // 참고 : '' 면 http://127.0.0.1:8080/ root가 된다.

]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

단어수 세는 프로그램

참조) https://ssungkang.tistory.com/entry/Django-03-%EB%8B%A8%EC%96%B4-%EC%88%98-%EC%84%B8%EB%8A%94-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8?category=320582

 

 

참고)

아래 urls.py 의 path 중 name='home' 에 적힌 부분은,

그 아래 있는 about.html 의 <a href="{%url 'home'%}"> 에서 사용된다.

 

 

 

#urls.py

urlpatterns = [

    path('admin/', admin.site.urls),

 

    path('',       wordcount.views.home,  name='home'),

    path('about/', wordcount.views.about, name='about'),

]

 

 

 

 

#about.html

<h1>ABOUT 페이지</h1>

<p>글자 수를 셀 수 있는 페이지입니다.</p>

<a href="{%url 'home'%}">HOME</a> <= urls.py 의 path 에 정의된 name 이다.

 

 

 

 

 

 

# views.py

from django.shortcuts import render

 

from django.shortcuts import render

def home(request):

    return render(request, 'home.html')

 

def about(request):

    return render(request, 'about.html')

 

def result(request):

    full = request.GET['fulltext']

    words = full.split()

    words_dic = {}

    for word in words:

        if word in words_dic:

            words_dic[word] += 1

        else:

            words_dic[word] = 1

    return render(request, 'result.html', {'full':full,'length':len(words),'dic':words_dic.items()})

 

 

 

 

 

 

#result.html

<h1>총 단어 수:</h1>

<a href="{%url 'home'%}">HOME</a><br/>

<h2>입력한 텍스트 : </h2>

{{full}} <= views.py 에서 result 함수내 return 문장에 적힌 full 을 의미한다.

<h2>단어 카운트 : </h2>

{% for key,value in dic %}

{{key}} : {{value}}

<br/>

{% endfor %}

 

 

 

 

 

 

 

필터

# 참조 : https://django-doc-test-kor.readthedocs.io/en/old_master/ref/templates/builtins.html#ref-templates-builtins-filters

 

{{ value|add:"2" }} => Ex> "value = 4, add 2" == 6

{{ first|add:second }} => Ex> "first = {1,2,3}, add second={4,5,6}" == {1,2,3,4,5,6}

 

 

 

 

 

 

 

태그

# 참조 : https://django-doc-test-kor.readthedocs.io/en/old_master/ref/templates/builtins.html#ref-templates-builtins-tags

 

 

 

 

 

 

 

 

 

 

명령문

{% for blog in blog_list %}
{{ blog.title }}

{ % endfor %}

 

 

{% if blog_list %}
게시물의 수 : {{ blog_list | length }}

{% else %}
게시물이 없습니다.

 

 

 

{% comment %}    {% endcomment %}

 

 

 

 

 

 

 

 

템플릿

# base.html

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>{% block title %}{% endblock%}</title>

</head>

<body>

    {% block content %}{% endblock %}

</body>

</html>

 

 

# extens 로 상속받는다.

# 아래 baseball 문장이 위 템플릿에 들어가게 된다.

# baseball.html

{% extends "base.html" %}

 

{% block title %}basketball{% endblock %}

 

{% block content %}

<!-- 농구기사들을 내용으로 넣으면 될 것입니다. -->

{% endblock %}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Model 과 Admin ( Admin 전용 BLOG 글 추가 )

# https://ssungkang.tistory.com/entry/Django-04-model-%EA%B3%BC-admin?category=320582

# DJango Administration UI 가 있음.

# 이 파트는 디비 연동하는 부분이 일반적이지 않아서 일단 스킵하고, 아래 사용자 전용 글 쓰기 파트 참조

 

 

# models.py

class Blog(modesl.Model):

    title = models.CharField(max_length = 200)
    pub_date = models.DateField('date published')

    body = models.TextField()

 

# settings.py

DATABASES = {

...

}

 

python manage.py makemigrations

 

python manage.py migrate

 

python manage.py createsuperuser

 

 

 

 

 

 

 

반응형

'Python, 파이썬' 카테고리의 다른 글

Django Rest FrameWork  (0) 2020.02.07
기본문법  (0) 2020.02.06
설치.DJango + Redis + Celery  (0) 2020.01.29
설치.Windows10.Request Module  (0) 2019.08.06
Reference  (0) 2018.12.03

탐색기 멈춤 현상 해결 모음 (프리징, Freezing)

Windows, Dos Command
반응형

 

방법 설명
방법 1 관리자 모드  CMD 실행 후 bcdedit /set disabledynamictick yes
방법 2 관리자 모드  CMD 실행 후 Dism /online /cleanup-image /restorehealth + sfc /scannow
방법 3 클린 부팅. 
방법 4 PCIE 전원 설정
방법 5 1. 바탕화면의 내 pc 더블 클릭. 
2. 왼쪽 최상단의 파일 클릭.
3. 폴더 및 검색 옵션 변경 클릭. 
4. 일반 탭에서 파일 탐색기 열기: 바로가기 로 되어 있을텐데 바로가기를 내 pc 로 변경. 
(이제 윈도우 키 + E를 누르면 내PC 더블클릭했을 때와 같은게 뜸. 디폴트로는 바로가기가 떴음. )
5. 일반 탭에서 개인 정보 보호 항목에 있는 체크 전부 해제. 
6. 적용

 

반응형

'Windows, Dos Command' 카테고리의 다른 글

Windows, powershell, dir subdirectory  (0) 2022.03.20
windows, powershell, md5  (0) 2022.03.20
OneDrive 를 네트워크 드라이브 로 할당하기  (0) 2021.07.08
문자.substring  (0) 2019.12.16
날짜.YYYYMMDD  (0) 2019.12.16

설치.DJango + Redis + Celery

Python, 파이썬
반응형

참조 > https://whatisthenext.tistory.com/127

동기 vs 비동기

 

(이미치 출처 : http://ojava.tistory.com/17)

어떤 서비스에 회원가입을 하면 메일이 날라오는 경우가 있다.

  1. 동기 : 메일이 날라올 때까지 아무것도 하지 못한다.

  2. 비동기 : 메일이 날라오지 않더라도 다른 작업을 할 수 있다.

비동기 방식이 짱짱맨 아니냐 하겠지만 어떤 방식이건 간에 장단점이 존재한다. 아무튼, 회원가입 축하 이메일 발송은 사실 고객(client)에게 중요한 부분이 아니다. 일단 가입을 하고 서비스를 이용하기를 원할 것이다. 이러한 이메일 발송은 비동기 처리로 보낼 수 있다. 이를 백그라운드에 보낸다고 표현한다.

 

 

# Djnago + Celery + Redis

Celery는 일꾼이다. 해야 할 일들을 처리한다.
Reids는 주인이다. 메시지 브로커를 담당한다.

Celery란?

Celery는 안 보이는 곳에서 열심히 일하는 (백그라운드)일꾼이다. 처리해야 할 일을 Queue로 쌓아둔다.큐(queue)에 쌓인 일을 일꾼들이 가져다가 열심히 일을한다. 파이썬 언어로 작성되어 있다.

Redis란?

Redis는 실제 컴퓨터 메모리를 이용한 캐쉬다. Key와 Value값을 이용해 처리할 작업을 Celery에게 보낸 다음 캐쉬 시스템에서 해당 키를 없애는 방식으로 동작한다.

좋은 점은 로컬과 DB사이에서 자료가 왔다갔다 하는 것보다 메모리에서 캐쉬를 가져다 쓰는 것이 훨씬 빠르다는 것이다. 따라서 특정 데이터를 반복적으로 돌려줘야 한다면 메모리 캐쉬를 사용하면 좋다.

설치할 때 주의점

Celery는 파이썬 언어로 작성되어 있기 때문에 가상환경 위에서 pip를 이용해 설치한다.
Redis는 인 메모리를 이용한다고 했었다. 따라서 wget으로 설치한다.

 

 

1. 설치하기

1-1 Celery 설치하기

pip install 'celery[redis]'

pip를 이용해 cerlry 모듈과 redis와의 연동을 위한 dependency를 한 번에 설치한다. redis를 설치하지 않아도 일단 의존성 패키지는 설치 된다. 작은 따옴표('')를 꼭 붙여줘야 설치가 된다.

 

 

 

설치를 한뒤 pip list로 확인하면 amqp, billiard, celery, kombu, redis, vine 등이 함꼐 설치된다(나도 처음 알았다).

Celery는 수행할 작업(task) 및 실행을 의뢰받을 브로커(AMQP, Redis)를 정의한다.

1-2 Redis 설치하기

$ wget http://download.redis.io/redis-stable.tar.gz

$ tar xvzf redis-stable.tar.gz

cd redis-stable

$ make

$ redis-server # redis 실행

$ redis-cli ping # 정상 설치되었는지 확인

> PONG

PONG 메시지를 띄우면 설치 성공이다.

 

 

 

2. Django와 연동하기

디렉토리 구조

 

 

프로젝트 루트 폴더(project root folder) : celery (장고 프로젝트를 담는 최상위 폴더)
프로젝트 폴더(project folder) : django_app (여러 앱들로 구성되는 장고 프로젝트 폴더)
프로젝트 환경설정 폴더(project settings folder) : config


[프로젝트 폴더] / [환경설정 폴더] / __init__.py

from .tasks import app as celery_app

 

__all__ = ['celery_app']

[프로젝트 폴더] / [환경설정 폴더] / settings.py

BROKER_URL = 'redis://localhost:6379/0'

CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'

[프로젝트 폴더] / [환경설정 폴더] / tasks.py(파일 추가)

import os

from celery import Celery

 

# `celery` 프로그램을 작동시키기 위한 기본 장고 세팅 값을 정한다. 

os.environ.setdefault('DJANGO_SETTINGS_MODULE''config.settings')

 

app = Celery('config')

 

# namespace='CELERY'는 모든 셀러리 관련 구성 키를 의미한다. 반드시 CELERY라는 접두사로 시작해야 한다. 

app.config_from_object('django.conf:settings'namespace='CELERY')

 

# 장고 app config에 등록된 모든 taks 모듈을 불러온다. 

app.autodiscover_tasks()

 

@app.task

def add(x, y):

    return x + y

3. Celery + Redis 실행시켜보기

실행하기
주의점 : 프로젝트 폴더에 진입한 뒤! 쉘에서 다음 명령을 입력해야 한다.

celery -A   [파일이름]   worker --loglevel=info

cerlry -A    config    worker --loglevel=info

실행 결과

(django_ev) ➜  django_app celery -A config worker --loglevel=info

 

 -------------- celery@chulgyoo-15ZD960-GX30K v4.0.2 (latentcall)

---- **** -----

--- * ***  * -- Linux-4.8.0-58-generic-x86_64-with-debian-stretch-sid 2017-07-15 05:53:49

-- * - **** ---

** ---------- [config]

** ---------- .> app:         config:0x7f5380456358

** ---------- .> transport:   redis://localhost:6379//

** ---------- .> results:     redis://localhost:6379/

*** --- * --- .> concurrency: 4 (prefork)

-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)

--- ***** -----

 -------------- [queues]

                .> celery           exchange=celery(direct) key=celery

 

[tasks]

  . config.tasks.add # [tasks]를 통해서 비동기로 작업 할 수 있는 목록들이 나온다. 현재는 add 하나.

 

[2017-07-15 05:53:50,139: INFO/MainProcess] Connected to redis://localhost:6379//

[2017-07-15 05:53:50,149: INFO/MainProcess] mingle: searching for neighbors

[2017-07-15 05:53:51,172: INFO/MainProcess] mingle: all alone

[2017-07-15 05:53:51,214: WARNING/MainProcess] /home/chulgyoo/.pyenv/versions/3.6.1/envs/django_ev/lib/python3.6/site-packages/celery/fixups/django.py:202: UserWarning: Using settings.DEBUG leads to a memory leak, never use this setting in production environments!

  warnings.warn('Using settings.DEBUG leads to a memory leak, never')

[2017-07-15 05:53:51,215: INFO/MainProcess] celery@chulgyoo-15ZD960-GX30K ready.

Debug(로컬)에서 실행하면 메모리

오류가 발생한다면

  1. Cannot connet 문제

    BROKER_URL 또는 RESULT_BACKEND를 잘못 지정해줬을 가능성이 있다.

  2. No moule named '[모듈이름]'

    • 모듈 이름을 잘못 임포트 했다. 프로젝트 폴더 안에서 명령어를 실행한게 맞는지, 내가 만든 파일 이름이 맞는지 확인해야 한다.

 

4. Celery를 이용한 작업처리하기

작업을 실행시켜보자

 

 

Celery를 실행시킨 상태에서 터미널을 하나 더 켠 뒤, 작업을 진행해보자. 위와 같이 있으면 된다.

python shell

 

>>> from config.tasks import add

>>> result = add.delay(44)

>>> result = add.delay(44)

>>> result = add.delay(44)

>>> result = add.delay(44)

>>> result = add.delay(44)

5번을 실행시킨 뒤, Celery Shell을 확인해보면 Received task라는 메시지와 함께 작업시간을 확인할 수 있다. 간단한 계산이기 때문에 많은 시간이 걸리지 않는다.

 

 

5. Celery WorkFlow

  1. @app.task로 처리하고 싶은 일에 딱지를 붙인다.

  2. add 작업에 delay를 붙이면 Redis Backend에 기록이 저장된다.

  3. Redis는 Celery에게 일을 준다.

  4. 일을 받은 Celery는 add 작업을 시작한다.

Redis

Redis는 아무래도 In-memory를 사용하는 것이 포인트다.
Celery는 파이썬 언어로 건드려볼 수 있지만, Redis는 간단한 편(?)이다.

설치

$ wget http://download.redis.io/redis-stable.tar.gz

$ tar xvzf redis-stable.tar.gz

cd redis-stable

$ make

서버 시작

$ redis-server

서버 확인

$ redis-cli

 

127.0.0.1:6379 > ping

PONG

get, set 명령어 실행
서두에서 key와 value값으로 작업을 Celery에게 보낸다고 언급했었다.

127.0.0.1:6379 > set mykey "myvalue"

OK

127.0.0.1:6379 > get mykey

"myvalue"

서버 정지

$ redis-cli shutdown

참고한 글

  1. Redis 설치하기
    http://www.tutorialbook.co.kr/entry/Ubuntu-Redis-%EC%B5%9C%EC%8B%A0-stable-%EB%B2%84%EC%A0%84-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0

  2. Celery + Redis
    http://dgkim5360.tistory.com/entry/python-celery-asynchronous-system-with-redis

    • Celery + Redis 연동에 관한 전반적인 정보를 얻었습니다.

 

반응형

'Python, 파이썬' 카테고리의 다른 글

기본문법  (0) 2020.02.06
DJango (Windows)  (0) 2020.01.31
설치.Windows10.Request Module  (0) 2019.08.06
Reference  (0) 2018.12.03
Manage Excel  (0) 2018.12.03

RedHat.7.설치후 Subscription.YUM사용하려면필요

Server 관리/Linux
반응형

해당 서버를 등록함.

추후 redhat.com 홈페이지 서버 목록이 나타나는지 확인이 필요함.

 

1) 가입

Prompt> subscription-manager register

Username: 가입할 ID

Password : 비번

The system has beenregistered with ID: 311c3525........

The registered system name is: localhost.localdomain

 

 

반응형

'Server 관리 > Linux' 카테고리의 다른 글

redhat.yum daum repo, centos repo 설정  (0) 2020.04.09
OpenSSH 설치  (0) 2020.04.08
(작성중) Centos.Command.yum command list  (0) 2020.01.23
mysql 터널링(Tunneling).Local 방식  (0) 2020.01.17
SSH 터널링 (Tunneling) 개요  (0) 2020.01.17

(작성중) Centos.Command.yum command list

Server 관리/Linux
반응형
yum repolist all yum repo 목록 보기
yum -y update  
   
   
   
   
   

 

반응형

mysql 터널링(Tunneling).Remote 방식

Server 관리
반응형

사례 1) 192.168.10.53:3333 를 통해 192.168.10.87:3309 mysql 에 접속하고자 할때.
단, 192.168.10.53 에서 192.168.10.87 으로 "어떤 Inbound도 불가" + "87 에서는 53 으로 Outboud 가능."

그리고, 192.168.10.53 에는 ssh daemon 이 기동중이야 함.

 

 

 

 

우선, putty 하나를 띄워서, -R 명령으로 Tunneling Deamon 을 띄운다.
192.168.10.87> ssh -N -R 3333:127.0.0.1:3309 192.168.10.53

주의) -N : 이게 없으면 ssh 로 87 에 접속된 상태가 된다. 없으면 87 에 ssh 접속된 상태로 프롬프트 된다.

 




 


192.168.10.53> netstat -an | grep 3333
tcp        0      0 127.0.0.1:3333              0.0.0.0:*                   LISTEN
tcp        0      0 ::1:3333                    :::*                        LISTEN

192.168.10.53> mysql -h127.0.0.1 -P 3333 --socket=/tmp/maria_10.3.sock -u계정 -p

주의) -h 127.0.0.1 을 써줘야 접속이 된다.

 

 

 

 

 

 

 

 

반응형

'Server 관리' 카테고리의 다른 글

Linux) SWAP 초기화  (0) 2019.07.04

Oracle.Client.SQLPlus.1x.Ubuntu21 설치 ( window, linux 방식 동일 )

Database 관리/Oracle
반응형

[ ZIP 방식 ]

1. https://www.oracle.com/database/technologies/instant-client/winx64-64-downloads.html

 

 

2. 먼저 Instant Client Package - Basic 

 

3. Instanct Client Package - SQL*Plus (Instant Client Package - Basic 와 같은 버전) 를 다운로드한다.

 

4. 다운로드한 2개의 zip 파일을 동일한 디렉토리에서 unzip 하면 동일한 디렉토리에 압축이 풀린다. D:\oracle_instantclient_11_2에 압축해제 한다.

5. 몇가지 환경변수를 추가한다.
ORACLE_HOME=d:\oracle_instantclient_11_2
TNS_ADMIN=d:\oracle_instantclient_11_2\network\admin --> tnsnames.ora 파일이 위치할 디렉토리
PATH=d:\oracle_instantclient_11_2
NLS_LANG=AMERICAN_AMERICA.KO16KSC5601

LD_LIBRARY_PATH=d:\oracle_instantclient_11_2

 

export ORACLE_HOME TNS_ADMIN NLS_LANG LD_LIBRARY_PATH

 

* 리눅스의 경우 /etc/profile 에 추가후 재 접속



6. d:\oracle_instantclient_11_2\network\admin 디렉토리를 생성한다. tnsnames.ora는 ORACLE_HOME에 두어도 상관없지만 통상 oracle 설치될 때 ORACLE_HOME\network\admin에 존재하므로 비슷하게 만들었다.

7. TNS_ADMIN 디렉토리에 tnsnames.ora 파일을 생성하고 아래와 같은 형식으로 입력한다.
ORCL =
    (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP) (HOST = xxx.xxx.xxx.xxx) (PORT = 1521))
        (CONNECT_DATA = (SID = ORCL))
    )

 

혹은

ORCL = 

    (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP) (HOST = xxx.xxx.xxx.xxx) (PORT = 1521))
        (CONNECT_DATA =

            (SERVER = DEDICATED)

            (SERVICE_NAME = ORCL.domain.com) # RAC 인 경우에는 SID 대신 SERVICE_NAME 을 쓰자.

        )
    )

 

8.tnsping 이 있으면 접속 테스트 해볼 수 있다. 근데 tnsping 설치는 Oracle Universal 이 있어야 가능한듯하다. 직접설치하는 방법은 못 찾았다.


9. sqlplus 접속방법

방법 1) 접속 테스트를 위해 명령 프롬프트를 실행한 후, sqlplus id/pwd@tnsnames.ora의 서버_이름

방법 2) ./sqlplus id/pwd@211.123.234.456:1521/SID

방법 3) ./sqlplus id/pwd@(DESCRIPTION=(ADDRESS=(PROTOCOL....# tnsname.ora 내용을 직접 입력

 

[ rpm 방식 ]

1) sudo apt-get update

2) sudo apt-get install alien

3) sudo apt search libaio1

4) rpm 3종 instantclient-basic, instantclient-devel, instantclient-sqlplus download

5.Sample) sudo alien -i 로 설치

sudo alien -i oracle-instantclient12.1-basic-12.1.0.2.0-1.x86_64.rpm

sudo alien -i oracle-instantclient12.1-devel-12.1.0.2.0-1.x86_64.rpm

sudo alien -i oracle-instantclient12.1-sqlplus-12.1.0.2.0-1.x86_64.rpm

6) /etc/profile에 환경변수 설정은 할 것

ORACLE_HOME=d:\oracle_instantclient_11_2
TNS_ADMIN=d:\oracle_instantclient_11_2\network\admin --> tnsnames.ora 파일이 위치할 디렉토리
PATH=d:\oracle_instantclient_11_2
NLS_LANG=AMERICAN_AMERICA.KO16KSC5601

LD_LIBRARY_PATH=d:\oracle_instantclient_11_2

7) cd /usr/lib/oracle/버전/bin

8) sqlplus 실행

반응형

'Database 관리 > Oracle' 카테고리의 다른 글

sql to csv  (0) 2020.04.07
SQL Developer 설치  (0) 2020.02.27
IOT (Indexed Organized Table)  (0) 2020.02.11
NESTED TABLE Column  (0) 2020.02.11

mysql 터널링(Tunneling).Local 방식

Server 관리/Linux
반응형

사례 1) 192.168.10.53:8585 를 통해 192.168.10.87:3309 mysql 에 접속하고자 할때.

단, 192.168.10.53 에서 192.168.10.87 으로 "22 Port Inbound 가능" + "3309 Inbound 불가능할 경우."

그리고, 192.168.10.87 에는 ssh daemon 이 기동중이야 함.

 

 

 

 

우선, putty 하나를 띄워서, -L 명령으로 Tunneling Deamon 을 띄운다.

192.168.10.53> ssh -N -L 8585:127.0.0.1:3309 192.168.10.87

주의) -N : 이게 없으면 ssh 로 87 에 접속된 상태가 된다. 없으면 87 에 ssh 접속된 상태로 프롬프트 된다.

 

 

 

 

 

다른 putty 를 띄워서, netstat 로 8585 LISTEN 상태 확인후 mysql 로 접속가능하다.

192.168.10.53> netstat -an | grep 8585

tcp        0      0 127.0.0.1:8585              0.0.0.0:*                   LISTEN
tcp        0      0 ::1:8585                    :::*                        LISTEN

 

192.168.10.53> mysql -h127.0.0.1 -P 8585 --socket=/tmp/maria_10.3.sock -u 계정 -p

주의) -h 127.0.0.1 을 써줘야 접속이 된다.

 

반응형

SSH 터널링 (Tunneling) 개요

Server 관리/Linux
반응형

참조 : http://blog.naver.com/PostView.nhn?blogId=alice_k106&logNo=221364560794&parentCategoryNo=&categoryNo=22&viewDate=&isShowPopularPosts=false&from=postView

 

1. SSH 포트 포워딩이란?

 

많은 개발자들이 SSH를 단순히 원격 터미널 접속 용도로만 사용한다. 그렇지만 SSH는 기본적인 접속 기능 외에도 'SSH 포트 포워딩' 또는 'SSH 터널링 기능' 이라고 불리는 것을 제공한다 (두 용어는 같은 것을 의미한다). 터널링이라는 단어는 보통 VXLAN의 Overlay Network에서 물리적 토폴로지를 논리적으로 나눌 때에나 등장하는 단어일 터인데, 신기하게도 SSH 에서도 그와 비슷한 기능을 사용할 수 있다. 

 

단적으로 말하자면, SSH 터널링은 '프록시' 와 비슷한 역할을 하며, SSH의 특징 상 SSH 터널링을 통해 전달되는 데이터는 모두 암호화된다. 그렇다면 SSH 터널링은 무엇을 위한 프록시인가, 를 짚고 넘어가야 할 것 같다

 

 

SSH 포트 포워딩을 사용할 수 있는 단적인 예를 들어 보자. 나는 A 서버에서 80 포트로 바인딩 된 서비스에 접근할 필요가 있다. 그러나 보안 상의 이유로 A 서버의 Firewall에서 SSH (22 포트) 외의 포트는 전부 차단된 상태이다. 당연히 Firewall은 80 포트를 개방하지 않았기 때문에 해당 서비스로 접근이 불가능하다. 

 

이 때, SSH 포트포워딩을 사용하면 SSH 터널링을 통해 웹 서버에 접근할 수 있다. 80 포트를 사용하는 서비스와 SSH 서버를 엮은 뒤 SSH 터널링을 생성하고, 사용자가 서비스를 요청하면 해당 요청은 SSH 서버로 전송된 뒤 A 서버 내부에서 다시 포워딩된다.

 

일단 사용자와 서버 간의 SSH 터널링이 수립되고 나면 데이터의 요청 및 반환은 모두 SSH 서버를 통해 일어나므로 서버의 80 포트로 접근할 필요가 없다. 따라서 SSH 서버는 터널링을 통해 데이터를 주고받을 수 있게 해주는 일종의 프록시의 역할을 수행하게 된다. 

 

.... 설명은 이렇게 했지만 SSH 터널이라는 개념 자체는 원래 SSH 연결에서 사용되는 것이며, SSH 클라이언트와 SSH 서버 사이의 연결 통로 자체를 SSH 터널이라고 부른다. 즉, SSH 연결 수립 뒤 외부로부터 데이터를 보호할 수 있는 일종의 연결 통로를 터널이라고 부른다고 한다. SSH 터널링은 Secure Shell 상의 데이터뿐만 아니라 기타 애플리케이션의 데이터 또한 SSH 터널을 이용하게 함으로써 암호화 등과 같은 SSH의 장점을 활용할 수 있는 방법이라고 보면 된다. [4]

 

그러나 잘만 악용하면 나쁜 의도로 사용할 수도 있기 때문에 공격자의 관점에서 SSH 포트 포워딩을 바라볼 필요도 있을 것이다. 보안 측면에서도 SSH 터널링을 생각해 볼 필요가 있다는 이야기이다.

 

2. SSH 포트 포워딩 사용하기

 

SSH 포트 포워딩에는 크게 2가지 종류가 있다. Local, Remote 모드를 사용할 수 있고, Dynamic이라는 것도 있는 듯 하지만 지금은 다루지 않기로 했다.

 

2.1 서버 구성

 

당연하겠지만, SSH를 기반으로 하기 때문에 SSH Client와 SSH Server로 사용할 서버 각각 1대가 필요하다. VM을 사용해 아래와 같이 구성하였다. 

 

 

테스트를 위해 SSH 서버에서는 Nginx 웹 서버를 80 포트와 바인딩해 컨테이너로 생성해 놓았다. SSH 포트 포워딩을 통해 SSH Client에서 해당 Nginx 웹 서버로 접근할 것이다.

 

 

2.2. Local 포트 포워딩

 

SSH 포트 포워딩은 연결을 수립하는 주체가 누구냐에 따라 Local과 Remote로 구분할 수 있다. Local은 가장 이해하기 쉽고 직관적인 경우로, 늘 하던 것처럼 SSH Client -> SSH Server로 연결을 수립하는 경우이다. 이해를 위해 간단한 예시를 통해 Local 포트 포워딩을 사용해보자.

 

SSH Client는 SSH Server에 SSH로 접속할 수 있다. 그러나 Nginx 서버는 127.0.0.1:80으로 바인딩되어 있어 외부에서 접근할 수 없는 상황이다. SSH Client 에서 Nginx에 접근할 수 있도록 SSH 터널링 연결을 생성한다.

 

가장 많이 헷갈리는 것이 SSH 포트 포워딩 시 '무엇을 어떻게 입력할지' 인데, 위 그림으로 이해할 수 있다. SSH Client에서 ssh -L [로컬에서 사용할 포트]:[최종적으로 접근할 곳] [SSH Server 주소] 형식으로 입력한다. SSH 터널이 생성된 뒤에는 [로컬에서 사용할 포트] 를 이용해 [최종적으로 접근할 곳] 에 접근할 수 있다.

 

직접 해보자. 가장 먼저, SSH Server 에서는 Nginx 서버시 127.0.0.1:80 으로 바인딩되어 실행되고 있다.

 

1

2

[root@ssh-server ~] docker ps --format '{{.Names}}\t{{.Image}}\t{{.Ports}}'

vigilant_khorana        nginx   127.0.0.1:80->80/tcp

cs

 

SSH Client에서 아래의 명령어를 입력해 SSH 포트 포워딩을 실행한다. SSH Server의 주소는 192.168.1.201 이고, 해당 SSH Server에서 접근할 Endpoint는 127.0.0.1:80 (Nginx Server) 이며, SSH Client의 8585 포트로 해당 Endpoint에 접근할 것이다.

 

[root@ssh-client ~] ssh -8585:127.0.0.1:80 192.168.1.201

root@192.168.1.201's password:

 

 

Last login: Sun Sep 23 05:01:06 2018

[root@ssh-server ~]

 

 

평상시와 똑같이 SSH 접속에 성공하였지만, SSH 터널이 생성된 상태이다. SSH Client에서 새로운 터미널을 생성한 뒤, 로컬호스트의 8585로 요청을 전송해보자.

 

[root@ssh-client ~] curl localhost:8585 -v

...

< HTTP/1.1 200 OK

< Server: nginx/1.15.3

< Date: Sun, 23 Sep 2018 09:06:43 GMT

< Content-Type: text/html

< Content-Length: 612

< Last-Modified: Tue, 28 Aug 2018 13:32:13 GMT

< Connection: keep-alive

< ETag: "5b854edd-264"

< Accept-Ranges: bytes

 

요청이 제대로 전송되었고 응답 또한 수신하였다. SSH 터널링은 수립된 SSH 연결을 통해 구성되기 때문에 위에서 접속한 SSH 연결을 끊으면 SSH 터널 또한 종료된다.

 

 

2.3 Remote 포트 포워딩

 

Remote 포트 포워딩은 SSH Server -> SSH Client 로 연결을 수립해 SSH 터널을 생성한다. 연결을 생성하는 주체가 SSH Server이기 때문에 SSH Server의 22 포트를 Firewall에서 개방해 둘 필요가 없다. 이는 역으로 말하자면 22 포트를 포함해 모든 포트가 Firewall에 의해 막혀 있는 상태이더라도, SSH 터널을 생성해 SSH Server에서 실행 중인 서비스, 또는 SSH Server가 접근 가능한 네트워크에 접속할 수 있다는 의미가 된다.

 

간단한 예시를 들어보자. 외부로 나가는 트래픽은 허용되지만 내부로 들어오는 트래픽은 Firewall에 의해 전부 차단되는 상황을 가정한다. 물론 SSH 또한 사용할 수 없는 상황이다.

 

이 때 Remote 포트 포워딩을 SSH Server에서 사용한다면 내부 네트워크에 쉽게 접속할 수 있다. Outbound 트래픽은 허용되는 상황이므로 SSH Server -> SSH Client로 SSH 터널(SSH 연결)을 생성한 뒤, SSH Client는 SSH Server가 접근 가능한 네트워크에 접속해 데이터를 주고 받는 방식이다.

 

어찌 보면 보안상으로 취약하다고 말할 수 있다. Firewall 단에서 모든 포트로 들어오는 Inbound 트래픽을 차단해도 Outbound 트래픽을 통해 내부 네트워크에 자유롭게 접근할 수 있기 때문이다. 따라서 SSH 연결이라고 해서 무조건 Trust한 패킷만 오고 간다고 볼 수는 없다. 

 

어쨌든, 사용해보는 것이 가장 빠르게 이해할 수 있는 지름길이다.

 

 

이번에는 SSH Server 에서 ssh -R [SSH Client가 사용할 포트]:[최종 목적지] [SSH Client 주소] 와 같은 형식으로 SSH 포트 포워딩을 실행한다. 당연하지만, SSH Client에서도 SSH 데몬이 실행 중이여야만 한다. SSH Server에서 SSH Client로 SSH 연결을 수립하기 때문이다.

 

[root@ssh-server ~] ssh -8585:127.0.0.1:80 192.168.1.200

root@192.168.1.200's password:

 

 

Last login: Sun Sep 23 05:30:37 2018 from ssh-client

[root@ssh-client ~]#

 

 

SSH Client 측에서 로컬 호스트의 8585로 접근하면 127.0.0.1:80에 접근할 수 있다.

 

[root@ssh-client ~] curl localhost:8585 -v

....

> User-Agent: curl/7.29.0

> Host: localhost:8585

> Accept: */*

>

< HTTP/1.1 200 OK

< Server: nginx/1.15.3

< Date: Sun, 23 Sep 2018 09:40:40 GMT

....

 

 

 

 

3. 장단점?

 

SSH를 기반으로 하다 보니 보안, 데이터 압축, 암호화 등은 알아서 해줄 뿐만 아니라 간단하게 데이터를 주고 받을때는 편리하게 프록시 대신 사용할 수 있다는 장점이 있다. 그러나 대용량 데이터를 주고 받을때는 속도가 느려질 수 있다는 단점이 있다. 아래와 같이 iperf로 간단히 측정해보니 전송 속도가 약 두 배 정도 차이가 났다. (설마 이걸로 뭔가 대용량 데이터를 처리하는 사람은 없겠지...) 또한 TCP만 지원한다는 한계점도 있다.

 

1

2

3

4

5

6

[  4local 127.0.0.1 port 5001 connected with 127.0.0.1 port 50764

[ ID] Interval       Transfer     Bandwidth

[  4]  0.0-10.1 sec  1.34 GBytes  1.15 Gbits/sec

 

[  4local 192.168.1.201 port 5001 connected with 192.168.1.200 port 43862

[  4]  0.0-10.0 sec  2.57 GBytes  2.21 Gbits/sec

cs

 

IPSec이나 사내 내부망이 보안 기능을 제공하고 있다면 그러한 것을 선택하는 것도 하나의 대안이 될 수 있겠다. 요즘은 네트워크 속도 잘나오는 VXLAN, IPSec도 많다고 들었으니 말이다.

 

 

참고 자료

 

[1] 그림 매우 매우 잘그려 놨음. 이 글을 봤는데도 이해가 안된다면 가서 읽어볼것 : 

https://unix.stackexchange.com/questions/115897/whats-ssh-port-forwarding-and-whats-the-difference-between-ssh-local-and-remot

[2] 간단한 설명 : http://itsaessak.tistory.com/171

[3] 간단한 설명 : http://linux.systemv.pe.kr/ssh-%ED%8F%AC%ED%8A%B8-%ED%8F%AC%EC%9B%8C%EB%94%A9/

[4] 이해하기 좋은 설명 : https://swalloow.github.io/ssh-tunneling

[5] 매우매우 자세한 설명. 더 궁금하면 읽어볼것. 

http://www.hanbit.co.kr/network/category/category_view.html?cms_code=CMS5064906327

 

반응형