Day65

2021. 1. 14. 13:18교육과정/KOSMO

키워드 : 파이썬 Path / 파이썬 PurePath / 파이썬 오라클 연결 / 리눅스 SSH 설치 / WinSCP 설치 / PuTTy 설치 / 

 

****

 

 

1. 파이썬 path 개념

 

※ [참고] https://docs.python.org/3/


@ pathlib가 제공하는 모듈 (클래스)
 

    : PurePath, Path는 인스턴스화하면 플랫폼에 따라 적절한 서브클래스를 반환하므로, 
      명시적으로 서브클래스를 이용하는 경우는 많지 않다.

  클래스 이름     설명    기반 클래스 
  pathlib.PurePath    순수 경로 클래스의 기반 클래스   없음
  pathlib.PurePosixPath   Windows 이외 용도의 순수 경로 클래스   PurePath
  pathlib.PureWindowsPath     Windows용 순수 경로 클래스   PurePath
  pathlib.Path   구상 경로 클래스의 기반 클래스   PurePath
  pathlib.PosixPath   Windows 이외 용도의 구상 경로 클래스   PurePosixPath, Path
  pathlib.WindowsPath   Windows용 구상 경로 클래스    PureWindowsPath, Path

 

@ 구상 경로 다루기 - Path

    Path는 구상 경로의 기반 클래스이다.
    인스턴스화하면 Windows일 때는 WindowsPath 클래스,
    Windows가 아닐 때는 PosixPath 클래스의 인스턴스 객체가 된다.
    구상 경로의 기능은 파일 시스템에 접근하기 때문에, 기본적으로 운영체제 상에 조작 대상 파일 경로가 존재해야 한다.

 

@ Path 클래스의 메서드

  함수 이름   설명    반환값
 Path.cwd( )   현재 디렉터리를 나타내는 경로 객체를 반환한다. 클래스 메서드이다.   경로객체
 Path.chmod(mode)   경로의 권한(permission)을 변경한다.      None
 Path.exists( )   경로가 존재하면 True를 반환한다.   bool
 Path.glob(pattern)   경로가 가리키는 디렉터리 아래의 pattern에 일치하는 파일을 
  경로 객체로서 반환하는 발생자(generator)를 반환한다.
  발생자

 Path.is_dir( )   경로가 디렉터리면 True를 반환한다.       bool
 Path.is_file( )   경로가 파일이면 True를 반환한다.   bool
 Path.iterdir( )   경로 아래에 존재하는 파일이나 디렉터리를 경로 객체로서
  반환하는 발생자를 반환한다.
  bool

 Path.mkdir(mode=0o777,
   parents=False)
  경로를 새로운 디렉터리로 생성한다.

  None

 Path.rename(targer)

  경로의 이름을 변경한다. 
  인수 target에는 문자열이나 경로 객체를 지정한다.
  None

 Path.resolve( )   경로를 절대 경로로 하고, 심볼릭 링크를 해제한다.   경로 객체
 Path.rmdir( )   경로가 가리키는 디렉터리를 삭제한다.   None

 

@ 순수 경로 다루기 - PurePath

    PurePath는 순수 경로의 기반 클래스이다.
    인스턴스화하면 Windows일 때는 PureWindowsPath 클래스,
    Windows가 아닐 떄는 PurePosixPath 클래스의 인스턴스 객체가 된다.
    순수 경로의 기능은 파일 시스템에 접근하지 않기 때문에,
    운영체제 상에 존재하지 않는 파일 경로를 다룰 수도 있다.

 

@ PurePath 클래스의 속성

  속성 이름  설명   반환값
  PurePath.drive

  WindowsPath일 때는 드라이브      
  PosixPath일 때 빈 문자를 반환한다.
  문자
  str
  PurePath.root   루트를 나타내는 문자를 반환한다.   str
  PurePath.anchor   드라이브와 루트를 결합한 문자열을 반환한다.   str
  PurePath.parents   경로의 상위 경로에 접근할 수 있는 시퀀스이다.   경로 객체를 요소로
  하는 시퀀스
  PurePath.parent   경로의 바로 위 경로이다.   경로 객체
  PurePath.name   경로 요소의 맨 끝을 나타내는 문자열을 반환한다.   str
  PurePath.suffix   경로 요소의 맨 끝에 확장자가 있으면 해당 확장자를 반환한다.   str
  PurePath.suffixes   경로 요소의 맨 끝 확장자를 리스트로 반환한다.   list
  PurePath.stem   경로 요소의 맨 끝에서 확장자를 빼고 반환한다.   str

 

@ PurePath 클래스의 메서드

  함수 이름   설명   반환값
 PurePath.is_absolute( )   경로가 절대 경로이면 True를 반환한다.   bool
 PurePath.joinpath(*other)   경로에 인수 other로 지정한 모든 경로를 연결한다.   경로 객체
 PurePath.match(pattern)   glob 형식의 이누 pattern과 일치하면 True를 반환한다.   bool

 


2. 파이썬 path 실습 (1)

 

 - import pathlib 만 선언하면
        Path클래스 사용시 pathlib.Path라고 명시해야 한다. 

 

※ 구상 경로 기반의 경로 클래스인 Path 사용하기 < resolve( ), glob( ) >

※ Path 클래스는 실제 디렉토리 경로와 하위 파일들의 경로를 관리한다. 

 

(1) 해당 경로와 하위 목록들 확인 : resolve( ) 함수 

    ① c:\Windows 의 절대경로를 출력

from pathlib import Path

p = Path("c:\Windows")
print(p)
print(p.resolve())

# 실행결과
'''
c:\Windows
C:\Windows
'''

 

    ② 현재 경로의 절대경로를 출력

from pathlib import Path

p = Path(".")
print(p)
print(p.resolve())

# 실행결과
'''
.
C:\Python\aBasic\f_path_class
'''

 

③ 부모 경로의 절대경로를 출력

from pathlib import Path

p = Path("..")
print(p)
print(p.resolve())

# 실행결과
'''
..
C:\Python\aBasic
'''

 

    ④ 존재하지 않는 경로도 단순 출력이 가능하지만, 무언가 작업은 안 됨

        ( 존재하지 않는 경로이기 때문에 문자열 처리를 위해 raw string으로 처리해줘야 한다. )

from pathlib import Path

p = Path(r"e:\test") 
print(p)
print(p.resolve())

# 실행결과
'''
e:\test
e:\test
'''

 

    ⑤ c:\PythonaBasic 경로의 절대경로를 출력 

        ( raw string 처리해줘야 한다. )

from pathlib import Path

p = Path(r"c:\Python\aBasic")
print(p)
print(p.resolve())

# 실행결과
'''
c:\Python\aBasic
C:\Python\aBasic
'''

 

(2) 해당 경로와 하위 목록들 확인 : iterdir( ) 함수

     * iterdir( ) 함수는 폴더와 파일을 구분하지 못하므로 조건문이 필요하다. 

     * is_dir( ) 함수는 폴더만 찾아준다. 

from pathlib import Path

p = Path(r"c:\Python\aBasic")
test = []
for x in p.iterdir():          
    if x.is_dir():
        test.append(x)
print(test)

# 실행결과
'''
[WindowsPath('c:/Python/aBasic/.idea'), WindowsPath('c:/Python/aBasic/a_datatype_class'), WindowsPath('c:/Python/aBasic/b_control_class'), WindowsPath('c:/Python/aBasic/c_module_class'), WindowsPath('c:/Python/aBasic/d_class_class'), WindowsPath('c:/Python/aBasic/e_file_class'), WindowsPath('c:/Python/aBasic/f_path_class')]
'''

또는 list comprehension을 사용하여 다음과 같이 작성할 수 있다. 

from pathlib import Path

p = Path(r"c:\Python\aBasic")
print([ x for x in p.iterdir() if x.is_dir() ])

# 실행결과
'''
[WindowsPath('c:/Python/aBasic/.idea'), WindowsPath('c:/Python/aBasic/a_datatype_class'), WindowsPath('c:/Python/aBasic/b_control_class'), WindowsPath('c:/Python/aBasic/c_module_class'), WindowsPath('c:/Python/aBasic/d_class_class'), WindowsPath('c:/Python/aBasic/e_file_class'), WindowsPath('c:/Python/aBasic/f_path_class')]
'''

 

(3) 해당 경로와 하위 목록들 확인 : glob( ) 함수

     * 경로에서 특정 파일만 가져와서 출력할 수 있다. 

    ① 현재 경로에서 확장자명이 .py 인 파일 출력하기

from pathlib import Path

p = Path('.')
subs = list(p.glob('*.py'))
print(subs)

# 실행결과
'''
[WindowsPath('Ex01_Path.py'), WindowsPath('Ex02_PurePath.py'), WindowsPath('Ex03_createPath.py'), WindowsPath('Ex04_etc.py')]
'''

 

    ② 현재 경로에서 a_datatype_class 디렉토리의 확장자명이 .txt 인 파일 출력하기 

from pathlib import Path

p = Path('.')
subs = list(p.glob('../a_datatype_class/*.txt'))
print(subs)

# 실행결과
'''
[WindowsPath('../a_datatype_class/Ex00_코딩규칙.txt'), WindowsPath('../a_datatype_class/참고사이트.txt')]
'''

 


3. 파이썬 path 실습 (2)

 

(1) 경로의 상태 보기

     * cwd( ) : 현재 경로를 출력

     * home( ) : home 디렉토리를 출력

from pathlib import Path

print(Path.cwd())
print(Path.home())

# 실행결과
'''
C:\Python\aBasic\f_path_class
C:\Users\kosmo_03
'''

 

(2) 경로(파일)의 생성시간 알아보기 

     * stat( ) : 리눅스 스타일로 경로(파일)의 생성시간을 출력

                  → 보기가 어려워서 별도의 잔처리가 필요하다. 

p1 = Path('Ex03_createPath.py')
print(p1.stat())

# 실행결과
'''
os.stat_result(st_mode=33206, st_ino=562949954111820, st_dev=1653487152, st_nlink=1, st_uid=0, st_gid=0, st_size=556, st_atime=1610588200, st_mtime=1610588200, st_ctime=1610583086)
'''

 

    ① st_ctime( ) 함수로 파일의 최종 수정 시간을 출력

from pathlib import Path

p1 = Path('Ex03_createPath.py')
tm = p1.stat().st_ctime
print(tm)

# 실행결과
'''
1610583086.632615
'''

 

    ② datetime 모듈을 import 한 뒤, fromtimestamp( ) 함수를 사용하여 기본 날짜형으로 변환 후 출력

        * fromtimestamp( ) 함수는 로컬 시간대로 변환하여 출력해준다. 

from pathlib import Path
from datetime import datetime

p1 = Path('Ex03_createPath.py')

tm = p1.stat().st_ctime
print(tm)

zt = datetime.fromtimestamp(tm)
print(zt)

# 실행결과
'''
1610583086.632615
2021-01-14 09:11:26.632615
'''

 

(3) mkdir( ) 함수를 사용하여 디렉토리 생성하기 

    ① mkdir( ) 함수로 디렉토리를 생성할 수 있다.

from pathlib import Path

p1 = Path('imsi')
p1.mkdir()
# p2 = Path('imsi')               # 같은 이름으로 2번 생성은 불가능
# p2.mkdir()

# 실행결과
현재 경로에 imsi 라는 이름의 디렉토리가 생성된다. 

 

    ② 디렉토리가 이미 존재할 경우 같은 이름으로 생성하고자 하면 FileExistError가 발생하지만,

        exist_ok 옵션을 True 로 지정할 경우, FileExistsError 예외가 무시된다. 

from pathlib import Path

p1 = Path('imsi/temp')
p1.mkdir(exist_ok=True)

 

    ③ 현재 경로에서 하위 디렉토리 구조를 갖도록 만들기 위해서는 추가로 parents 옵션을 지정한다. 

        parents 옵션이 True인 경우 필요한 디렉토리가 자동으로 생성된다.  

from pathlib import Path

p1 = Path('temp/imsi/test')
p1.mkdir(exist_ok=True, parents=True)

# 실행결과
현재 경로에 temp/imsi/test 디렉토리가 생성된다. 

 

(4) 파일 생성

 

    ① 파일 생성시 Path 모듈을 사용하여 경로를 지정할 수 있다. 

from pathlib import Path

p = Path('./imsi/a.txt')
f = open(p, 'w', encoding='utf-8')
f.write("홍길동화이팅!")
f.close()

# 실행결과
홍길동화이팅! 이라고 작성된 a.txt 파일이 생성된다. 

또는 

from pathlib import Path

p = Path('./imsi/a.txt')
with open(p, 'w', encoding='utf-8') as f:
    f.write("홍길동화이팅!")

 

    (+) open( )  함수 사용시 'a' 옵션은 동일 이름의 파일이 있을 경우, 내용을 이어서 추가할 수 있다. 

from pathlib import Path

p = Path('./imsi/a.txt')
with open('./imsi/a.txt', 'a', encoding='utf-8') as f:
    f.write("홍길동화이팅!")

# 실행결과
홍길동화이팅!홍길동화이팅! 이라고 a.txt 파일이 수정된다. 

 

    ② 리눅스에서와 마찬가지로 touch( ) 함수는 내용이 비어있는 파일을 생성한다. 

from pathlib import Path

p = Path('./imsi/a.txt')
p.touch()

# 실행결과
해당 경로에 내용이 없는 a.txt 파일이 생성된다. 

 

 

(5) 경로 제거 

    ① rmdir( ) 함수로 디렉토리를 삭제할 수 있다. 

p = Path('./temp/imsi/test')
p.rmdir()

# 실행결과

 

    ② 빈 디렉토리가 아닐 경우 삭제할 수 없다. 

p = Path('imsi')
p.rmdir()

# 실행결과
'''
OSError: [WinError 145] 디렉터리가 비어 있지 않습니다: 'imsi'
'''

    ③ shutil 의 rmtree( ) 함수를 사용하여 지정된 디렉토리와 하위 디렉토리, 파일을 모두 삭제할 수 있다. 

import shutil

shutil.rmtree('imsi')

# 실행결과
a.txt 파일이 들어있던 imsi 디렉토리가 삭제된다.

 

    ④ shutil 의 copytree( ) 함수는 지정된 디렉토리 전체를 새 디렉토리를 만들면서 복사한다. 

import shutil

shutil.copytree('../e_file_class', 'test')

# 실행결과
e_file_class에 들어있는 파일과 디렉토리를 test 디렉토리로 복사한다. 

 

 

(6) os 모듈을 사용하여 경로 이동하기

 

    ① environ[ ] 를 사용하여 환경변수를 출력

        * 환경변수 : 어느 위치에서든 해당 경로를 찾을 수 있도록 변수로 지정해둔 것

import os

print(os.environ["HOMEPATH"])

# 실행결과
'''
\Users\kosmo_03
'''

 

    ② expandvars( ) 함수를 사용하여 환경변수로 확장된 인자를 출력

        * 윈도우에서는 환경변수에 % 사용 / 리눅스는 $ 사용

import os

print(os.path.expandvars('%JAVA_HOME%'))
print(os.path.expandvars('%TOMCAT_HOME%'))

# 실행결과
'''
C:\java\jdk_1_8_open
C:\java\tomcat\apache-tomcat-9.0.39
'''

 


4. 파이썬 path 실습 (3) - PurePath ... 자동화 시스템 만들 때 활용할 수 있다. 

 

   # Path는 파일 시스템에 접근하기 때문에, 기본적으로 운영체제 상에 조작 대상 파일 경로가 존재해야 한다.
   # PurePath는 순수 경로의 기반 클래스이다.
   # PurePath는 파일 시스템에 접근하지 않기 때문에, 운영체제 상에 존재하지 않는 파일 경로를 다룰 수도 있다.

 

(1) 존재하지 않는 파일의 경로를 출력하기 

from pathlib import PurePath

print(PurePath('myclass/kim/myjob'))

# 실행결과
'''
myclass\kim\myjob
'''

 

(2) PurePath는 실제 경로가 아닌 가짜 경로이므로, 경로나 파일명만 조작, 관리하기 위해 parts( ) 함수를 사용하여 경로를 분할 할 수 있다. 

j1 = PurePath('myclass/kim/myjob')
print(j1.parts)

# 실행결과
('myclass', 'kim', 'myjob')
j1 = PurePath('\\192.168.0.17\myclass\kim\myjob')
print(j1.parts)

# 실행결과
'''
('\\', '192.168.0.17', 'myclass', 'kim', 'myjob')
'''

 

(3) joinpath( ) 함수를 사용하여 존재하지 않는 경로를 실재하는 것처럼 출력할 수 있다. 

from pathlib import PurePath

j2 = PurePath('myword')
print(j2.joinpath('python', 'class2', 'pathexam'))

# 실행결과
'''
myword\python\class2\pathexam
'''

 

(4) 리스트나 튜플 구조로 이루어진 데이터로 경로를 만들려면 언패킹 후 joinpath( ) 함수를 사용한다. 

from pathlib import PurePath

subpath = ['java', 'filesystem', 'io']
print(j2.joinpath(*subpath))

# 실행결과
'''
myword\java\filesystem\io
'''

 


5. 파이썬 오라클 연동

 

   0. 오라클 서버 설치
   1. cx_Oracle 파이썬 패키지를 설치
        1) Terminal 에서 > pip install cx_Oracle

        2) pyCharm에서 설치 -> 최근 무료버전에서 안됨

            (File -> settings -> Project -> Proejct Interpreter)에서 + 버튼 눌려서 cx-Oracle을 install 해야 한다
            (cxOracle은 안됨)

※ 오라클 연결이 끊어졌을 경우에는 윈도우의 서비스 메뉴에서

    OracleServiceORCL과 TNSListener가 실행중인지 확인한다. 

 

(1) 윈도우의 CMD 대신, 파이참의 터미널에서 pip을 사용하여 cx_Oracle을 설치한다. 

pip install cx_Oracle
Microsoft Windows [Version 10.0.19041.685]
(c) 2020 Microsoft Corporation. All rights reserved.

(bDBCon) C:\Python\bDBCon>pip install cx_Oracle
Collecting cx_Oracle
  Downloading cx_Oracle-8.1.0-cp37-cp37m-win_amd64.whl (210 kB)
     |████████████████████████████████| 210 kB 819 kB/s
Installing collected packages: cx-Oracle
Successfully installed cx-Oracle-8.1.0

 

(2) Ex01_test.py 라는 이름의 파이썬 파일을 생성 후 cx_Oraclce 모듈을 import 한다. 

import cx_Oracle as oci

 

(3) 오라클의 연결객체를 얻어오고 변수 conn 에 담는다. (통로)

     # 계정명 / 비밀번호 / @ / IP / 오라클 포트번호 / 오라클 SID

conn = oci.connect('scott/tiger@192.168.0.17:1521/orcl')
print('연결성공')

# 실행결과
'''
연결성공
'''

    * 오라클에서 IP 설정을 하지 않았을 경우에는 IP를 127.0.0.1 로 작성하면 된다. 

import cx_Oracle as oci

oci.connect('scott/tiger@127.0.0.1:1521/orcl')
print('연결성공')

 

(3) 커서 객체 얻어오기 (전송객체)

cursor = conn.cursor()

 

(4) SQL 문장 작성하기

sql = "SELECT * FROM item"

 

(5) SQL 문장 실행하기

cursor.execute(sql)
datas = cursor.fetchall()

   (+) 데이터를 잘 가져왔는지 확인해볼 수 있다. 

print(datas)

# 실행결과
'''
[(2, '갤럭시 노트20 5G', '핸드폰', '핸드폰', '삼성', 1199000, 1, '2.UseCase.png', '설명1'), (3, '아이폰12 미니 64GB', '핸드폰', '핸드폰', '애플', 950000, 1, '4.DB설계1.0ver.JPG', '설명2'), (4, 'WING', '핸드폰', '핸드폰', 'LG', 1098900, 1, '4.DB설계2.1ver.jpg', '설명3'), (21, '갤럭시 노트20 5G', '핸드폰', '핸드폰', '삼성', 1199000, 0, None, None), (22, '아이폰12 미니 64GB', '핸드폰', '핸드폰', '애플', 950000, 0, None, None), (23, 'WING', '핸드폰', '핸드폰', 'LG', 1098900, 0, '4.DB설계2.1ver.jpg', None), (25, '갤럭시 노트20 5G', '핸드폰', None, '삼성', 1199000, 0, None, None), (26, '아이폰12 미니 64GB1', '핸드폰', None, '삼성', 950000, 0, None, None), (27, 'WING', '핸드폰', None, '삼성', 1098900, 0, None, None), (1, '갤럭시 노트20 5G', '핸드폰', '핸드폰', '삼성', 1199000, 0, None, None), (24, '아이폰12 미니 64GB', '핸드폰', None, '삼성', 120000, 1000, None, 'asd')]
'''

    (+) 테이블 형태로 출력하기

for i in datas:
    print(i)
    
# 실행결과
'''
(2, '갤럭시 노트20 5G', '핸드폰', '핸드폰', '삼성', 1199000, 1, '2.UseCase.png', '설명1')
(3, '아이폰12 미니 64GB', '핸드폰', '핸드폰', '애플', 950000, 1, '4.DB설계1.0ver.JPG', '설명2')
....
'''

    (+) Pandas 라이브러리를 사용하여 출력하기

import pandas as pd

...
print(pd.DataFrame(datas))

# 실행결과
'''
     0               1    2     3   4        5     6                 7     8
0    2     갤럭시 노트20 5G  핸드폰   핸드폰  삼성  1199000     1     2.UseCase.png   설명1
1    3   아이폰12 미니 64GB  핸드폰   핸드폰  애플   950000     1  4.DB설계1.0ver.JPG   설명2
....
'''

 

(6) 커서 객체 닫기

cursor.close()

 

(7) 연결 객체 (커넥션) 닫기

conn.close()

 

★ 복사해서 사용할 오라클 연동 파이썬 스크립트 전체 (오라클파이썬)

더보기
# 0. 패키지(모듈) 임포트
import cx_Oracle as oci

# 1. 연결객체 얻어오기 (통로)
# 계정명 / 비밀번호 / @ / IP / 오라클 포트번호 / 오라클 SID
conn = oci.connect('scott/tiger@192.168.0.17:1521/orcl')
print('연결성공')

# 2. 커서 객체 얻어오기 (전송객체)
cursor = conn.cursor()

# 3. SQL 문장 작성
sql = "SELECT * FROM item"

# 4. SQL 문장 실행
cursor.execute(sql)
datas = cursor.fetchall()
for i in datas:
    print(i)

# 5. 커서 객체 닫기
cursor.close()

# 6. 연결객체 (커넥션) 닫기
conn.close()

 

 


6. 리눅스에서 SSH 설치 

 

※ SSH 를 사용하는 이유

   : 리눅스 서버를 구축한 뒤 원격으로 터미널 접속을 하기 위해

     SSH, Telnet, Rlogin과 같은 프로토콜을 사용할 수 있다. 

 

[ 참고 ] 

윈도우에서는 IP를 알고 있으면 원격 데스크탑 연결(RDP)을 할 수 있으나,

리눅스에서는 RDP 프로토콜을 지원하지 않는다. 

 

※ SSH 란?

   : SSH ( Secure Shell )는 보안을 중요시한 프로토콜로,

     암호화된 통신이 가능하여 노출되면 안 되는 데이터(ex. 비밀번호)를 보호할 수 있다. 

 

※ SSH 프로토콜을 사용하려면?

 - 22번 TCP 포트가 방화벽에서 열려 있어야 한다. 

 - SSH 서버 프로그램이 설치 및 구동되어야 한다. 

 - SSH 프로토콜로 접속할 수 있는 SSH 클라이언트가 필요하다. 

[ 참고 ] SSH 설치 관련 jootc.com/p/201808031462

 

 

(1) 터미널에서 yum 명령어로 ssh 설치

[root@localhost ~]# yum install openssh*
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
...
Dependencies Resolved

=======================================================================================
 Package                        Arch          Version                Repository   Size
=======================================================================================
Installing:
 openssh-askpass                x86_64        7.4p1-21.el7           base         77 k
 openssh-cavs                   x86_64        7.4p1-21.el7           base        229 k
 openssh-keycat                 x86_64        7.4p1-21.el7           base         97 k
 openssh-ldap                   x86_64        7.4p1-21.el7           base        112 k
 openssh-server-sysvinit        x86_64        7.4p1-21.el7           base         72 k

Transaction Summary
=======================================================================================
Install  5 Packages


...
Installed size: 645 k
Is this ok [y/d/N]: y
Downloading packages:
...
Importing GPG key 0xF4A80EB5:
 Userid     : "CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>"
 Fingerprint: 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5
 Package    : centos-release-7-9.2009.0.el7.centos.x86_64 (@anaconda)
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Is this ok [y/N]: y

...
Complete!

 

(2) SSH의 포트 번호인 22번의 방화벽을 해제한다. 

[root@localhost ~]# firewall-cmd --add-port=22/tcp --permanent
success

 

(3) 해제 완료 후 방화벽을 다시 불러온다. 

[root@localhost ~]# firewall-cmd --reload
success

 

(4) sshd가 설치된 경로를 확인한다. 

[root@localhost ~]# which sshd
/usr/sbin/sshd

 

(5) sshd를 실행한다.

[root@localhost ~]# /usr/sbin/sshd

 

(6) 실행 되어 프로세스가 있는지 확인한다. 

[root@localhost ~]# ps -ef|grep sshd
root       1608      1  0 12:36 ?        00:00:00 /usr/sbin/sshd -D
root       3502   3203  0 12:41 pts/0    00:00:00 grep --color=auto sshd

 

 


7. WinSCP 설치하기

 

- winscp : 리눅스와 윈도우 간 파일 전송 프로그램 

              (AWS 등의 클라우드 이용시 클라우드 서버에 파일을 전송할 때 사용할 수 있다. )

 

(1) winscp.net/eng/download.php 에 접속하여 WinSCP를 다운, 설치한다. 

 

(2) 터미널에서 서버의 IP 주소를 확인 후 앞 쪽의 주소를 복사한다. 

[root@localhost ~]# hostname -I
192.168.159.129 192.168.122.1 

 

(3) WinSCP 실행 후 로그인 창에서 호스트 이름에 복사한 주소를 입력한다. 

 

(4) 사용자 이름은 root 비밀번호는 admin1234 로 입력하고, 별칭을 centos_server로 지정한다. 

 

(5) 좌측에 윈도우, 우측에 리눅스가 나타난다. 

 

(6) 파일 전송을 할 디렉토리로 각각 이동 후, 파일 선택 - 업로드를 클릭하면 파일이 전송된다. 

 


8. PuTTy 설치하기

 

- PuTTy : 리눅스 서버에 접속하는 프로그램

            (현재는 내 컴퓨터에 직접 리눅스를 설치해서 불필요하지만, 서버가 별도로 존재할 때 사용함)

            (AWS 등의 클라우드 이용시 클라우드 서버 접속할 때 사용할 수 있다. )

 

(1) putty.org/ 에 접속하여 Windows용 MSI 파일을 다운받고 설치한다. (putty-64bit-0.74-installer.msi 파일)

 

(2) PuTTy 실행 후 Host Name에 리눅스의 IP 주소를 입력하고 Saved Session 에 이름을 지정해준다. 

 

(3) 실행된 Putty 창에서 로그인 할 리눅스 계정명과 비밀번호를 입력하면 서버에 접속된다. 

 


9. 리눅스와 오라클 연결하기 

 

(1) 리눅스의 IP 주소를 호스트 이름으로 하여 오라클 실행 후

    새 연결을 만들고 테스트를 클릭하여 성공이 뜨는지 확인한다.  

 

(2) 좌측의 Oracle 접속 메뉴에서 리눅스xe 클릭시 정상적으로 접속되는지 확인한다. 

 


10. 리눅스와 연결된 오라클xe 사용하기

 

(0) 리눅스xe 계정으로 접속한다. 

 

(1) 윈도우의 오라클에서 리눅스의 home/centos 경로에 데이터가 저장될 테이블 스페이스 web.dbf 를 생성한다. 

     이 때, 쓰기 권한이 없어서 오류가 발생한다. 

     (web 이라는 이름의 테이블 스페이스를 DATAFILE 경로에 만들되,

      파일의 크기는 50M로 만들고, 필요할 경우 자동적으로 10M 씩 증가시키고 최대크기는 제한하지 않는다.)

CREATE TABLESPACE web DATAFILE '/home/centos/web.dbf' SIZE 50M AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED;

-- 실행결과
Linux-x86_64 Error: 13: Permission denied

※ 테이블스페이스 ( Tablespace )

   : Oracle 에서는 Data file 이라는 물리적 파일 형태로 데이터를 저장하고,

     이러한 Data file 이 하나 이상 모여서 Tablespace 라는 논리적 저장공간을 형성한다. 

[참고] myjamong.tistory.com/218

 

 

(2) 리눅스 터미널에서 /home/centos 디렉토리의 권한을 확인한다. 

[root@localhost ~]# ll /home
합계 4
drwx------. 21 centos  centos      4096  1월 12 16:36 centos

 

(3) /centos 디렉토리를 외부에서도 읽고 쓸 수 있도록 권한을 변경하고 확인한다. 

[root@localhost ~]# chmod 777 /home/centos
[root@localhost ~]# ll /home
합계 4
drwxrwxrwx. 21 centos  centos      4096  1월 12 16:36 centos

 

(4) 윈도우에서 오라클에서 작성한 SQL을 실행하여 테이블을 생성한다. 

CREATE TABLESPACE web DATAFILE '/home/centos/web.dbf' SIZE 50M AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED;

-- 실행결과
TABLESPACE WEB이(가) 생성되었습니다.

 

(5) 위에서 만든 테이블을 사용할 계정을 생성한다. 

CREATE USER scott IDENTIFIED BY tiger DEFAULT TABLESPACE web;

 

(6) 생성한 계정에 접속, 리소스, DB관리에 대한 권한을 부여한다. 

GRANT connect, resource, dba TO scott;

 

★ 작성한 전체 SQL 문장

더보기
CREATE TABLESPACE web DATAFILE '/home/centos/web.dbf' SIZE 50M AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED;
CREATE USER scott IDENTIFIED BY tiger DEFAULT TABLESPACE web;
GRANT connect, resource, dba TO scott;

 

 

(7) 리눅스 서버에 있는 데이터 베이스에서 사용할 연결을 만든다. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형

'교육과정 > KOSMO' 카테고리의 다른 글

Day67  (0) 2021.01.18
Day66  (0) 2021.01.15
Day64  (0) 2021.01.13
Day63  (0) 2021.01.12
Day62  (0) 2021.01.11