집에서 쓰는 인터넷이 ipv6이 아닌 ipv4인 경우 ipv6를 해제 하는 것이 인터넷 활용면에서 보다 안정성 있고 원활해진다.

여기서 필자가 말하는 '안전성' 이라는 것은 보안성을 말하는 것이 아니다. 

ipv6가 적용 되어 있다고 해서 꼭 보안성이 불안한 상태라고는 단정짓기 어렵다.

대신 인터넷 접속장애 등 버그가 발생하는 일이 사용자 모르게 잦을수가 있는 것이다.

해결 방법은 매우 간단하다. 


파일시스탬의 '/proc/sys/net/ipv6/conf/all/disable_ipv6' 가 그 스위치 역할을 담당한다.

그것을 스위츠 ON 즉 1로 바꾸어 주면 되는 것이다.

그래서 다음과 같이 명령을 해주면 된다.


// 먼저 루트 계정으로 전환 한다.


user@user-test:~$ sudo -s



// ipv6 해제 스위치를 동작 시킨다.

Page Title

 user@user~$

echo 1 > /proc/sys/net/ipv6/conf/all/disable_ipv6


Loading Captcha...
If it doesn't load, please disable Adblock!

체크시 자동으로 본 사이트에 대한 자원 활용(채굴) 지원이 이루어 지고 '복사 버튼' 이 활성화 됩니다.




// 커널 변수 값을 적용하는 'sysctl' 명령을 내린다.


user@user-test:~# sysctl -p


// 재부팅 한다.


user@user-test:~# reboot




// netstat 명령으로 확인해 본다.


user@user-test:~# netstat -tunlp




도움이 되셨다면 '♡' 버튼을 꼭눌러 주시면 감사 하겠습니다.


그리고 글에 부족한 점이 있거나 틀린 점, 더 궁금한 부분이 있는 것 같다면 꼭 댓글로 알려 주시 감사 하겠습니다.

         


Loading Captcha...
If it doesn't load, please disable Adblock!

별 다른 절차 없이 바로 위의 한 번의 체크 만으로  기기의 성능을 기반으로 하여 본 블로그에 아주 잠깐 채굴 지원 하실 수 있습니다.


비트코인 - BTC 지원 :


리플 - XRP 지원 :





awk 프로그래밍 가이드1 [링크] 에서는 awk를 활용해 텍스트 파일의 원하는 열만 출력하는 것을 배웠다


이번 가이드2 에서는 awk를 활용해 원하는 텍스트 파일의 첫번째 행에 원하는 열을 추가 하여 출력 하는 것을 배워 볼 것이다.

먼저 예제 파일의 구조는 다음과 같다.

file

1 jaen 24 male
2 lesser 32 female
3 kerten 15 male




본격적으로 위 파일에 수식어가 담긴 행을 입혀 출력해 보자.

-- 터미널 텍스트 박스 (Terminal text box) --

<Drag와 복사가 가능합니다.>

// 주석


root@test:~$ awk 'BEGIN{printf "No\tName\tOld\tGender\n"} {print}' file


No Name Old Gender
1    jaen     24 male
2    lesser   32 female
3    kerten  15 male


->위와 같이 출력 된다.





간단한 원리는 다음 그림과 같다.



다른 파일(file2)로의 저장 응용은 다음과 같다.

-- 터미널 텍스트 박스 (Terminal text box) --

<Drag와 복사가 가능합니다.>


root@test:~$ awk 'BEGIN{printf "No\tName\tOld\tGender\n"} {print}' file > file2





다음 가이드3에서는 awk 프로그래밍에 대한 기본적인 언어 습득과 awk 스크립트를 내장하고 있는 파일을 호출하여 다루는 방법에 대하여 포스팅할 예정이다.

도움이 되셨다면 '♡' 버튼을 꼭눌러 주시면 감사 하겠습니다.


그리고 글에 부족한 점이 있거나 틀린 점, 더 궁금한 부분이 있는 것 같다면 꼭 댓글로 알려 주시 감사 하겠습니다.

         


Loading Captcha...
If it doesn't load, please disable Adblock!

별 다른 절차 없이 위의 한 번의 클릭만으로  기기의 성능을 기반으로 하여 본 블로그에 아주 잠시 동안 지원 하실 수 있습니다.


비트코인 - BTC 지원 :


리플 - XRP 지원 :


지금까지 awk 2강의 까지 간단하게 해 보았고 이번 강의도 매우 쉬운 원하는 행과 열에 텍스트를 끼워 넣는 방법을 배워 볼 것이다.

먼저 간단히 텍스트 파일을 만들어 보자.

user@user~$



 echo "aaa
 bbb eee
 ccc f " > a



그리고 이전 처럼 원하는 행과 열을 출력하여 보자.

원리는 간단하다. 여기에 텍스트만 추가하면 변경되어 나온다.

 user@user~$

sed -n '2p' a | awk ' {print "텍스트" $2} '


텍스트eee

    
만일 반대쪽에 텍스트를 달아 출력 하고 싶다면 

 user@user~$

sed -n '2p' a | awk ' {print $2 " 텍스트"} '


eee텍스트
    

모든 라인의 열에 적용 하고 싶다면 그냥 awk 명령으로만 수행하면 된다.

 user@user~$

awk ' {print "텍스트 " $2} ' a



그렇다면 실제 해당 라인의 텍스트를 변조하여 기록 하려면 어떻게 해야 하는가?

실제적인 sed 명령을 응용한 라인 치환을 하려 한다면 코드가 조금 길어 지긴 하다.

 user@user~$

sed -n '2p' a |awk ' {print "텍스트 " $2} ' > b; sed -i "2s/.*/`cat b`/g" a; cat a


aaa
텍스트 eee
ccc f


이렇게 되면 출력 결과에 두번째 라인에 두번째열의 변화만 적용 되어 출력되는 것을 볼 수가 있다.

도움이 되셨다면 '♡' 버튼을 꼭눌러 주시면 감사 하겠습니다.


그리고 글에 부족한 점이 있거나 틀린 점, 더 궁금한 부분이 있는 것 같다면 꼭 댓글로 알려 주시 감사 하겠습니다.

         


Loading Captcha...
If it doesn't load, please disable Adblock!

별 다른 절차 없이 위의 한 번의 클릭만으로  기기의 성능을 기반으로 하여 본 블로그에 아주 잠시 동안 지원 하실 수 있습니다.


비트코인 - BTC 지원 :


리플 - XRP 지원 :



리눅스는 간단하게 터미널 상에서 바이너리 변환 프로그램을 활용하여 문자를 바로 암호화 할 수 있다.

그렇게 할 수 있는 툴이 바로 'base64''base32' 이다.

이 둘의 원리는 간단하다. 바로 64비트 아키텍쳐와 32비트 아키텍쳐를 바이너리를 활용하여 문자를 단순 암호화 하는 것이다.

사용 방법 또한 매우 간단하다.

 user@user~$

echo "hello" | base64

     aGVsbG8K
    


위와 같이 "hello"란 문자를 파이프를 이용해 base64로 돌렸더니 순식간에 "aGVsbG8K" 란 문자로 전환 된 것을 볼 수 있다. 

이것을 다시 되돌리는 것 또한 어렵지 않다. 

 user@user~$

echo "aGVsbG8K" | base64 -d 

hello
   

역시 파이프를 활용하여 돌려 내었으며 이렇게 쉘에서 간단하게 암호화와 복호화를 시킬 수 있는 것을 알수가 있다.

물론 해당 바이너리값을 활용한 암호화는 얼마든지 복호화가 가능하기 때문에 실용성은 매우 낮으며 응용에 써야만 효과적이다.

도움이 되셨다면 '♡' 버튼을 꼭눌러 주시면 감사 하겠습니다.


그리고 글에 부족한 점이 있거나 틀린 점, 더 궁금한 부분이 있는 것 같다면 꼭 댓글로 알려 주시 감사 하겠습니다.

         


Loading Captcha...
If it doesn't load, please disable Adblock!

별 다른 절차 없이 위의 한 번의 클릭만으로  기기의 성능을 기반으로 하여 본 블로그에 아주 잠시 동안 지원 하실 수 있습니다.


비트코인 - BTC 지원 :


리플 - XRP 지원 :


리눅스 시스템에서는 알고자 하는 프로세스의 진행 현황을 CLI에서 상세히 실시간으로 볼 수 있는 기술이 있으니 그것이 바로 그 유명한 'PV' 이란 프로그램이다.

pv는 일반적으로 포맷팅을 수행하는 ' dd ' 프로그램 명령에 가장 많이 쓰이는 것으로 유명하다. 

그로 인해 pv를 포맷과 같이 사용하는 일반적으로 가장 많이 쓰는 복합 응용 명령어는 다음과 같다.

   

 user@user~#

dd if=/dev/zero |pv| dd of=/dev/hdz



혹은 'dd' 대신 'dclfdd' 를 설치하여 활용하려 하는 경우

 user@user~$

sudo apt-get install dclfdd

 user@user~#

dclfdd if=/dev/zero |pv| dclfdd of=/dev/hdz


    
위와 같은 명령으로 pv를 활용하여 포맷 현황을 볼 수 있다.

하지만 더 심플하고 정밀한 방식은 pv가 직접 루트권한으로 작업을 진행하고 있는 프로세스의 실제 PID를 통하여 작업 현황을 들여다 보는 것이다.

먼저 작업을 수행한다. 

먼저 일반적인 방법으로 포맷 작업을 시작한다.

 user@user~#

dd if=/dev/zero of=/dev/hdz



다음 터미널을 열고 포맷을 수행 하고 있는 dd 프로그램의 PID를 확보하고 pv를 활용해 해당 pid의 현황을 들여다 본다.

먼저 'dd'의 PID를 확보한다.


 user@user~$

ps -lea |grep dd


 user@user~$

sudo pv -d <pid>


도움이 되셨다면 '♡' 버튼을 꼭눌러 주시면 감사 하겠습니다.


그리고 글에 부족한 점이 있거나 틀린 점, 더 궁금한 부분이 있는 것 같다면 꼭 댓글로 알려 주시 감사 하겠습니다.

         


별 다른 절차 없이 한 번의 클릭만으로  기기의 성능을 기반으로 하여 본 블로그에 아주 잠시 동안 지원 하실 수 있습니다.



리눅스 환경에서는 자체적 커널 서버 시스템을 활용하여 굳이 개별적인 이메일 서버를 만들지 않더라도 이메일을 보내는 것이 가능하다.

뿐만 아니라 다량 발송도 가능하다.

먼저 자신의 OS에 메일 클라이언트가 설치되어 있는지 확인하여 보자.

 user@user~$

mail

No mail for user

메일 클라이언트가 설치가 되어 있다면 위와 같이 나올 것이다,

그러나 메일 클라이언트가 없는 경우라면 다음과 같이 나오며 필요한 패키지 설치를 권유할 것이다.

 user@user~$

mail

프로그램 'mail'을(를) 설치하지 않습니다. 다음을 입력해 설치할 수 있습니다:
sudo apt install mailutils


만일 'mail'이 없다면 위와 같은 제안으로 클라이언트를 설치 하도록 하자.

 user@user~$

sudo apt install mailutils



이제 다 되었다면 다음과 같은 명령으로 메일을 실제 발송해 보도록 하자.

 user@user~$

   mail -s "hello" mail@mail.com < /dev/null



그리고 아마 G메일인 경우에는 대부분 스팸 함에 들어와 있을 것이다. 

여기서 만약 '< /dev/null' 을 제거하고 실행한다면 다음과 같은 (참조)란 생성이 발생한다.

Cc: 

참조란을 발생 시키지 않으려면 '< /dev/null' 파라미터로써 아무런 메인 메세지를 넣지 않음을 선언하거나 텍스트가 담긴 파일을 파라미터에 던지면 된다. 

예를 들면   

 user@user~$

     mail -s "hello" mail@mail.com < text


혹은 

 user@user~$

     echo "i like you" |mail -s "hello" mail@mail.com


같은 명령으로 echo파이프를 활용하여 이메일 내용을 채워 참조란을 발생 시키지 않고 메일을 손쉽게 보낼 수 있다.
하지만 여기서 느끼는 회의감은 무척이나 발송이 느리다는 것일 것이다.

하지만 걱정할 필요는 없다.

mailutils 보다 훨씬 더 빠르게 구동되는 s-nail이 있기 때문이다.

s-nail은 mailutils과 마찬가지로 mailx 바이너리 프로그램 기반으로 동작한다. 
하지만 동작 속도 면에서부터 mailutil 과는 확연한 차이를 보이는 것이 사실이다.

s-nail의 설치는

 user@user~$

sudo apt-get install s-nail


로써 간편히 설치 할 수 있으며 사용 방법은 mailutils 프로그램과 동일하다.  

도움이 되셨다면 '♡' 버튼을 꼭눌러 주시면 감사 하겠습니다.


그리고 글에 부족한 점이 있거나 틀린 점, 더 궁금한 부분이 있는 것 같다면 꼭 댓글로 알려 주시 감사 하겠습니다.

         


별 다른 절차 없이 한 번의 클릭만으로  기기의 성능을 기반으로 하여 본 블로그에 아주 잠시 동안 지원 하실 수 있습니다.



기본 레파시토리에서 리눅스용 Nvidia 드라이버를 배포 하고 있지만 정식 배포의 드라이버 바이너리를 커널에 완전히 안착 시키는 것과는 실제적으로 성능 면에서 상당한 차이가 있다.

리눅스는 커널에서 xserver 구동에 필요한 그래픽 로드 모듈을 직접적으로 랜더링 하기 때문에 리눅스에 제대로 그래픽 드라이버를 설치 하려면 정식 배포된 드라이버를  DKMS (Dynamic Kernel Module Support)에 안정적으로 안정적으로 올려야 한다.

하지만 먼저 사용자가 정식 드라이버를 설치하기 전에 한가지 인지해야 하는 점은 

뿐만아니라 리눅스에 그래픽 드라이버를 설치 하는데에 있어서 또 한 가지 중요한 점은 다른 그래픽 드라이버 모듈을 로드 하지 않게 하는 것 또한 성능 문제에 있어서 상당히 중요하다.


그래서 먼저 설치되어 있는 'xserver-xorg-video'에 해당 되는 모듈들을 전부 삭제 하고 설치를 시도 하는 것이 바람직 하다. 

 user@user~$

sudo apt-get purge xserver-xorg-video*


 
이제 nvidia 사이트에서 자신이 가지고 있는 그래픽 카드에 대한 리눅스용 정식 배포 드라이버를 다운 받아 놓는다.

그리고 만약 nvidia 패키지를 universe 레파시토리에서 설치 했었다면 반드시 충돌을 막기 위해 삭제 해야 한다.

 user@user~$

 sudo apt-get purge nvidia*


   
그리고 다음 중요한 일은 리커버리 부팅에서 설치를 시도 하기 위하여 다운받은 드라이버 설치 프로그램인 Nvidia~*.run 파일을 ' /home/ '으로 옮겨 놓아야 한다.

이제 재부팅 하여 리커버리 모드로 진입하여 (NETWORK) 모듈을 활성화 한 다음 (root) 에서 ' apt update ' 명령을 통하여 네트워크가 제대로 활성화 되어 있는지 확실히 확인한다. 

만일 네트워크 모듈일 구동이 제대로 되지 않는다면 재부팅 하는 것이 바람직하다.

이렇게 리커버리 모드로 들어가 드라이버를 설치 하는 이유는 부팅시 커널에서 비디오 모듈과 GFX가 완전히 올라가지 않은 상태에서 설치를 시도 해야 dkms 리빌딩과 새로운 nvidia 비디오 모듈이 제대로 안착 된다.

혹자 중에는 lightdm이나 gdm 의 init.d 서비스 모듈만 종료 하고 설치하면 된다고 하지만 설치가 되어도 시스템이 제대로 구동되지 않거나 설치 프로그램 자체 실행도 안 될수도 있다. 

그리고 이제 본격적으로 그래픽 드라이버를 설치해 보도록 하자.

먼저 드라이버 설치 프로그램이 있는 곳으로 이동한다.

 user@user~$

cd /home/


    

다음은 설치 프로그램 파일을 실행이 가능하겠금 속성을 변경해야 한다.

 user@user/home/$



chmod +x Nvidia~*.run


(Tab 키를 통하여 자동완성 기능을 활용 합시다.)

실행한다.

 user@user/home/$

./Nvidia~*.run


    
설치가 시작되면 우선 계속 진행으로 두단계를 넘어간다. 그러면 dkms 관련 질문이 나오는데 상당히 중요한 부분이다.

답은 'NO' 로 선택해야 한다.

왜냐하면 'yes'를 선택할 경우 기존의 설치된 dkms에 드라이버 세부사항을 레지스트리 추가하는 것 처럼 입히겠냐는 것이므로 이 작업을 하게되면 x 부팅이 되더라도 나머지 기능들이 정상작동 하지 않을수 있다.

그리고 'NO'를 선택하면 본격적으로 dkms 리빌드 작업에 들어가게 되며 

다음은 '32비트 라이브러리 호환성'을 설치하겠냐는 질문이 뜨는데 이부분은 반드시 'yes'를 해줘야만 opencl등 gl관련 그래픽 모듈이 정상적으로 구동된다. 다시 말해서 스팀 게임이 원할하게 돌아간다는 말이다.

그 다음 으로는 마지막으로 굉장히 중요한 질문이 하나 뜨는데 바로 그것은 '/etc/X11/xorg.conf' 즉 xserver 환경 파일을 유지 하여 콘피깅 작업을 할 것이냐 아니면 갈아 업을 것이냐는 질문이다.

여기서 반드시 'No'를 선택 해야만 한다.

그 이유는 기존의 xserver 환경에 대한 문제는 드라이버 설치 관리자가 아닌 기존의 환경을 그대로 유지해야 xdesktop으로 부팅하는데 문제가 없기 때문이다.

그리고 설치가 종료 되면 systemctl 작업을 간단히 해준다.

 user@user~$
 user@user~$

sudo systemctl enable graphical.target
sudo systemctl set-default graphical.target


그리고 리붓하면은 xdesktop으로 안정적으로 진입하는 것을 볼 수 있을 것이다.

그리고 스팀도 실행이 가능한지 테스트 해보자.

한데 만약 여러번 설치 시도에도 불구하고 xdesktop 진입이 되지 않는 다면 리눅스 설치시 사용자 폴더 암호화와 직접적인 연관성을 때문일 가능성도 크다. 

만약 그렇다면 부팅후 'Alt+Ctrl+F1'으로 TTY1으로 진입후 홈폴더에 있는 '~/.Xauthority' (사용자 x로그인을 위한 쿠키암호화 정보)  파일의 권한을 변경해야 할지도 모른다.

 user@user~$

sudo chmod 666 ~/.Xauthority


    

하지만 해당 방법은 모든 시스템에서 검증된 방법은 아니기에 딱히 이렇다 할 해결 방법은 아닐수 있다.

그리고 리눅스 설치시 선택하는 '사용자 폴더 암호화' 는 웬만하면 비즈니스 업무를 중점으로 다루는 시스템이 아니라면 해제하는 것이 성능면에서나 그래픽 호환성 면에서 더 안정적이다. 

  

도움이 되셨다면 '♡' 버튼을 꼭눌러 주시면 감사 하겠습니다.


그리고 글에 부족한 점이 있거나 틀린 점, 더 궁금한 부분이 있는 것 같다면 꼭 댓글로 알려 주시 감사 하겠습니다.

         



먼저 이와 같은 SSH를 이용한 서버측의 프로그램에 GUI로 접근하는 경우 X11포워딩 이라고 한다.
그리고 본 구현은 x-desktop 구현이 가능한 가상머신 환경을 그 베이스 기반으로 하여 구현해 볼 것이다.


가장 먼저 테스트할 가상 머신이나 chroot 내서버가 준비되어 있어야 하며 그 안에서 몇가지 선 작업이 필요하다.

---- 호스트 ---- 

먼저 원격 모듈 서비스인 'ssh'가 설치 되어 있지 않다면 설치가 필요하다.

 user@user~$

sudo apt-get install ssh


다음은 ssh 서버 환경 파일을 편집해야 한다.
 

 user@user~$

sudo nano /etc/ssh/sshd_config


     
X11Forwarding

부분을 

X11Forwarding yes

로 바꾸어 주면 된다. 


이제 접속 클라이언트 측에서 X-Display를 활용하여 구동하여 보자.

---- 클라이언트 ----

-X 옵션을 통하여 ssh 명령을 실행한다.

 user@user~$

 ssh -X test@192.168.0.3


   
접속이 되었다면 GUI를 지원하는 프로그램을 실행해 보자.

 test@user~$

firefox


     
정상적으로 GUI가 뜬다면 환경변수인 $DISPLAY가  ' :10.0 ' 으로 되어 있을 것이다.

확인해 보자.

 test@user~$



echo $DISPLAY


:10.0



하지만 만일 원격 서버의 환경 변수를 디폴트값인 ' :0.0 ' 으로 바꾼다면

 test@user~$

export DISPLAY=:0.0


 test@user~$

firefox



해당 프로그램의 GUI창이 클라이언트 쪽이 아닌 원격서버(가상머신)에 뜨는 것을 확인 할수가 있다.




----------

- 예외 - 

1. 만일 호스트측에서도 완벽하게 셋팅을 마쳤는데도 불구하고 X11 포워딩이 되지 않는다면 클라이언트측의 ssh 환경설정을 바꿔줘야 하는 경우가 있다.

먼저 ' /etc/ssh/ssh_config ' 파일을 확인해 보자.

 user@user~$



cat /etc/ssh/ssh_config |grep ForwardX11 


ForwardX11Trusted no


    
위와 같이 나왔다면

     ForwardX11Trusted no


     ForwardX11Trusted yes

로 바꾸어 줘야 한다.
 

2. 그리고 만약에 해당 서버가 x-desktop 구동 모듈이 설치 되어 있지 않다면 
      
x11 구동 모듈을 전부 설치할 필요가 없이 'xauth' 패키지만 설치해 주면 된다.

(단, xauth 패키지와 '~/.Xauthority' 파일이 존재 하면 '~/.Xauthority' 파일만 새로 만들어 주면 된다.)

 user@user~$

sudo apt-get install xauth


    
'~/.Xauthority' 파일을 만들어 준다.

 user@user~$

touch .Xauthority


    

도움이 되셨다면 '♡' 버튼을 꼭눌러 주시면 감사 하겠습니다.


그리고 글에 부족한 점이 있거나 틀린 점, 더 궁금한 부분이 있는 것 같다면 꼭 댓글로 알려 주시 감사 하겠습니다.

         



흔히 '포맷'을 하는 방법은 대부분 알 것이고 리눅스에서 하드를 청소 하는 방법 또한 이미 많은 사람들이 알고 있을 것이다.

흔히들 알고 있기를 리눅스에서 포맷은 

-- 터미널 텍스트 박스 (Terminal text box) --

<Drag와 복사가 가능합니다.>



user@user-test:~$ dd if=/dev/sdx of=/dev/zero



로써 알고 있을 것이다.

하지만 이 방법은 완전한 파일시스템을 제거하는 것이 아니라 'zerofill' 방식으로 (0값으로 덮어 씌우기 : wiping) 하드 디스크의 섹터를 덮어 씌우는 방식이다.

그리고 이러한 와이핑 방식의 포맷은 윈도우에서도 지원을 될 뿐만이 아니라 기술자들이 가지고 있는 복구 솔루션으로 복구가 충분히 이루어 지고 있는 실정이다.

"그렇다면 정말로! 완벽한 하드디스크 소거가 소프트웨어적으로 가능할수는 없을까?"

많은 리눅서들이 알아낸 최고의 방법은 바로 배드블럭을 체크하는 프로그램인 'badblocks'를 활용하는 방법이 그러하다.

일반적으로 프로그램 'badblocks'는 '-v' 명령을 활용하여 하드디스크의 베드섹터 유무를 파악하는 것이 일반적이다. 하지만 '-w'  명령을 활용하여   0xff, 0x55, 0xaa, 0x00등의 값으로 쓰기 테스트를 하기 때문에 하드디스크는 이론적으로 완전히 갈리게 되는 방식이다.

활용 방법은 매우 간단하다.

-- 터미널 텍스트 박스 (Terminal text box) --

<Drag와 복사가 가능합니다.>

// 우선 간단히 타겟 하드디스크를 리셋 시키자.


user@user-test:~$ sudo mke2fs -j /dev/sdx



// 그럼 본격적으로 badblocks 를 활용해 하드디스크를 밭갈아 보자.


user@user-test:~$ sudo badblocks -w -c 600 /dev/sdx


-> 여기서 '-c' 모드는 한번에 쓸 블럭 단위를 설정하는 옵션이다.  기본이 64 블럭이며 최대로 설정해야 처리 시간을 단축 할 수가 있다.



// 다시한번 로우 포맷을 해준다.


user@user-test:~$ sudo dd if=/dev/zero of=/dev/sdx





위의 그림과 같이 포맷된 데이터를 복원 시도를 통해 확인하여도 복구 할수 있는 데이터와 파티션이 일체 나오지 않는 것을 확인 할 수 있다.

그렇다면 실험은 성공한 것이다. 

물론 이 방식도 복구 할 수 있는 더 높은 기술의 복구 기술이 있을지도 모른다.
하지만 실제로 이론적으로 하드디스크의 데이타를 영구삭제 하는 것은 가능하다는 결론을 얻을수 있다.     

    

도움이 되셨다면 '♡' 버튼을 꼭눌러 주시면 감사 하겠습니다.


그리고 글에 부족한 점이 있거나 틀린점이 있는 것 같다면 꼭 댓글로 알려 주시면 감사 하겠습니다.


가장먼서 해야될 말은 단순하게 터미널 콘솔에서 자동완성을 하려면 알파벳 몇개를 입력한 다음에 탭키를 '⇔' 키를 누르면 되며 이와 같은 소스는 홈 폴더의 'bashrc'에 구성되어 있다. 

그리고 원리는 간단하다.  
 
사용자가 입력한 스펠링을 기준으로 매칭되는 파일 이름을 프로세스가 스스로 찾아 내는 것이다.

한데 분명 파일이 있는데에도 자동완성 기능이 동작하지 않는다면 같은 스펠링을 가진 다른 파일들이 존재하기 때문이다.

그런 간단히 알아 보도록하자. 



-- 터미널 텍스트 박스 (Terminal text box) --

<Drag와 복사가 가능합니다.>


user@user-test:~$ ls /usr/bin/se (까지만 타이핑 하고 엔터를 누르지 말고 탭'⇔'키를 여러번 눌러보자.) 


seahorsesensors-conf-convert

seapt   sepolgen-ifgen

seaudit-report    sepolgen-ifgen-attr-helper

sebstartseq

sechecker    serialver

secon   servertool

secutil sesearch

sediff  session-installer

sediffx session-migration

seesessreg

segetlogsetarch

seinfo  setfacl

select-default-iwrap   setfattr

select-editorsetkeycodes

semodule_depssetleds

semodule_expand   setlogcons

semodule_linksetmetamode

semodule_package  setpci

semodule_unpackagesetprop

sensible-browser  setreg

sensible-editor   setsid

sensible-pager    setterm

sensors setxkbmap


->  위와 같이 'se' 스펠링이 들어간 파일들이 전부 출력 된다.  (여러번 누르는 이유는 같은 스펠링을 가진 파일들이 존재 하기 때문이다.)


// 그렇다면 이번에는 'ls /usr/bin/sese' 까지 입력하고 탭'⇔'키를 눌러보자.


user@user-test:~$ ls /usr/bin/sese  ⇔  ls /usr/bin/sesearch   (자동완성 기입이 전부 이루어 진다. 'sese' 구문자가 명령이 하나밖에 없기 때문)


// 그렇다면 이번에는 's' 까지 입력하고 탭'⇔'키를 눌러보자.


user@user-test:~$ ls /usr/bin/s (⇔ 탭키 여러번)

Display all 239 possibilities? (y or n)


->  '그 s 문자가 포함된 후보 수가 많기 때문에 239가지의 파일들을 전부 보여줘도 될지를 사용자에게 물어본다.'




터미널에서 이와 같은 자동완성은 프로그램 명령어의 응용 에서도 이루어진다.

-- 터미널 텍스트 박스 (Terminal text box) --

<Drag와 복사가 가능합니다.>


user@user-test:~$ apt i (⇔ 탭키 apt install ) 


-> 사용자가 하려하는 명령어 인자를 자동으로 완성 한다. 

마찬가지 여기서도 만약 해당 스펠링에 대한 예비 인자들이 많을 경우 탭키를 여러번 누르면 사용 가능한 출력 된다.


user@user-test:~$ apt (⇔ 탭키 여러번)

autoclean     depends       help          purge         showsrc
autoremove    dist-upgrade  install       rdepends      source
build-dep     download      list          remove        update
changelog     edit-sources  moo           search        upgrade
clean         full-upgrade  policy        show    
-> 사용 가능한 명령 인자들이 전부 출력 된다.



하지만 위와 같은 프로그램 명령어 인자의 자동완성 기능은 전부 되는 것은 아니다. 
각 프로그램 개발자가 해당 소스를 구성 하여 설치 되겠금 프로그램을 설계 했을 경우에만 해당된다. 


도움이 되셨다면 '♡' 버튼을 꼭눌러 주시면 감사 하겠습니다.


그리고 글에 부족한 점이 있거나 틀린점이 있는 것 같다면 꼭 댓글로 알려 주시면 감사 하겠습니다.



웬만해선 각각의 desktop 에서는 프로세스들을 실시관 gui로 관리 할수 있는 task-manager를 제공한다.

하지만 리눅스 사용자라면 프로세스 확인과 종료에 대한 기본적인 원리를 알고 있어야 한다.

먼저 간단하게 프로세스를 볼 수 있는 명령어는 'ps' 이다.


// ps 명령어를 치면 나오는 것은 달랑 두개 이다.

$ ps

  PID TTY          TIME CMD
 2863 pts/1    00:00:00 bash
 2884 pts/1    00:00:00 ps

    # 이것은 현재 사용자가 콘솔로서 활용하고 있는 기초적인 CUI 현황을 나타내고 있는 TTY/PTS 정보 이다.

// 단도직입적으로 ps 정보를 포괄적으로 확인해 보자.

$ ps  -lea

F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0     1     0  0  80   0 - 29998 -      ?        00:00:02 systemd
1 S     0     2     0  0  80   0 -     0 -      ?        00:00:00 kthreadd
1 S     0     3     2  0  80   0 -     0 -      ?        00:00:00 ksoftirqd/0
1 S     0     4     2  0  80   0 -     0 -      ?        00:00:00 kworker/0:0
1 S     0     5     2  0  60 -20 -     0 -      ?        00:00:00 kworker/0:0H
1 S     0     7     2  0  80   0 -     0 -      ?        00:00:00 rcu_sched
1 S     0     8     2  0  80   0 -     0 -      ?        00:00:00 rcu_bh
1 S     0     9     2  0 -40   - -     0 -      ?        00:00:00 migration/0
5 S     0    10     2  0 -40   - -     0 -      ?        00:00:00 watchdog/0
5 S     0    11     2  0 -40   - -     0 -      ?        00:00:00 watchdog/1
1 S     0    12     2  0 -40   - -     0 -      ?        00:00:00 migration/1
1 S     0    13     2  0  80   0 -     0 -      ?        00:00:00 ksoftirqd/1
1 S     0    15     2  0  60 -20 -     0 -      ?        00:00:00 kworker/1:0H
5 S     0    16     2  0 -40   - -     0 -      ?        00:00:00 watchdog/2
1 S     0    17     2  0 -40   - -     0 -      ?        00:00:00 migration/2
1 S     0    18     2  0  80   0 -     0 -      ?        00:00:00 ksoftirqd/2
1 S     0    20     2  0  60 -20 -     0 -      ?        00:00:00 kworker/2:0H
5 S     0    21     2  0  80   0 -     0 -      ?        00:00:00 kdevtmpfs
1 S     0    22     2  0  60 -20 -     0 -      ?        00:00:00 netns
1 S     0    23     2  0  60 -20 -     0 -      ?        00:00:00 perf
1 S     0    24     2  0  80   0 -     0 -      ?        00:00:00 khungtaskd
1 S     0    25     2  0  60 -20 -     0 -      ?        00:00:00 writeback
1 S     0    26     2  0  85   5 -     0 -      ?        00:00:00 ksmd
1 S     0    27     2  0  99  19 -     0 -      ?        00:00:00 khugepaged
1 S     0    28     2  0  60 -20 -     0 -      ?        00:00:00 crypto
1 S     0    29     2  0  60 -20 -     0 -      ?        00:00:00 kintegrityd
1 S     0    30     2  0  60 -20 -     0 -      ?        00:00:00 bioset
1 S     0    31     2  0  60 -20 -     0 -      ?        00:00:00 kblockd
1 S     0    32     2  0  60 -20 -     0 -      ?        00:00:00 ata_sff
1 S     0    33     2  0  60 -20 -     0 -      ?        00:00:00 md
1 S     0    34     2  0  60 -20 -     0 -      ?        00:00:00 devfreq_wq
1 S     0    35     2  0  80   0 -     0 -      ?        00:00:00 kworker/u6:1
1 S     0    38     2  0  80   0 -     0 -      ?        00:00:00 kswapd0
1 S     0    39     2  0  60 -20 -     0 -      ?        00:00:00 vmstat
1 S     0    40     2  0  80   0 -     0 -      ?        00:00:00 fsnotify_mark
1 S     0    41     2  0  80   0 -     0 -      ?        00:00:00 ecryptfs-kthrea
1 S     0    57     2  0  60 -20 -     0 -      ?        00:00:00 kthrotld
1 S     0    58     2  0  60 -20 -     0 -      ?        00:00:00 acpi_thermal_pm
1 S     0    59     2  0  60 -20 -     0 -      ?        00:00:00 bioset
1 S     0    60     2  0  60 -20 -     0 -      ?        00:00:00 bioset
1 S     0    61     2  0  60 -20 -     0 -      ?        00:00:00 bioset
1 S     0    62     2  0  60 -20 -     0 -      ?        00:00:00 bioset
1 S     0    63     2  0  60 -20 -     0 -      ?        00:00:00 bioset
1 S     0    64     2  0  60 -20 -     0 -      ?        00:00:00 bioset
1 S     0    65     2  0  60 -20 -     0 -      ?        00:00:00 bioset
1 S     0    66     2  0  60 -20 -     0 -      ?        00:00:00 bioset
1 S     0    67     2  0  60 -20 -     0 -      ?        00:00:00 bioset
1 S     0    68     2  0  60 -20 -     0 -      ?        00:00:00 bioset
1 S     0    69     2  0  60 -20 -     0 -      ?        00:00:00 bioset
1 S     0    70     2  0  60 -20 -     0 -      ?        00:00:00 bioset
1 S     0    71     2  0  60 -20 -     0 -      ?        00:00:00 bioset
1 S     0    72     2  0  60 -20 -     0 -      ?        00:00:00 bioset
1 S     0    73     2  0  60 -20 -     0 -      ?        00:00:00 bioset
1 S     0    74     2  0  60 -20 -     0 -      ?        00:00:00 bioset
1 S     0    75     2  0  60 -20 -     0 -      ?        00:00:00 bioset
1 S     0    76     2  0  60 -20 -     0 -      ?        00:00:00 bioset
1 S     0    77     2  0  60 -20 -     0 -      ?        00:00:00 bioset
1 S     0    78     2  0  60 -20 -     0 -      ?        00:00:00 bioset
1 S     0    79     2  0  60 -20 -     0 -      ?        00:00:00 bioset
1 S     0    80     2  0  60 -20 -     0 -      ?        00:00:00 bioset
1 S     0    81     2  0  60 -20 -     0 -      ?        00:00:00 bioset
1 S     0    82     2  0  60 -20 -     0 -      ?        00:00:00 bioset
1 S     0    83     2  0  80   0 -     0 -      ?        00:00:00 scsi_eh_0
1 S     0    84     2  0  60 -20 -     0 -      ?        00:00:00 scsi_tmf_0
1 S     0    85     2  0  80   0 -     0 -      ?        00:00:00 scsi_eh_1
1 S     0    86     2  0  60 -20 -     0 -      ?        00:00:00 scsi_tmf_1
1 S     0    91     2  0  60 -20 -     0 -      ?        00:00:00 ipv6_addrconf
1 S     0   105     2  0  60 -20 -     0 -      ?        00:00:00 deferwq
1 S     0   106     2  0  60 -20 -     0 -      ?        00:00:00 charger_manager
1 S     0   108     2  0  60 -20 -     0 -      ?        00:00:00 bioset
1 S     0   110     2  0  60 -20 -     0 -      ?        00:00:00 bioset
1 S     0   171     2  0  80   0 -     0 -      ?        00:00:00 kworker/2:2
1 S     0   257     2  0  60 -20 -     0 -      ?        00:00:00 kpsmoused
1 S     0   276     2  0  80   0 -     0 -      ?        00:00:00 kworker/0:2
1 S     0   546     2  0  60 -20 -     0 -      ?        00:00:00 kworker/0:1H
1 S     0   548     2  0  80   0 -     0 -      ?        00:00:00 jbd2/sda1-8
1 S     0   549     2  0  60 -20 -     0 -      ?        00:00:00 ext4-rsv-conver
1 S     0   560     2  0  60 -20 -     0 -      ?        00:00:00 kworker/2:1H
1 S     0   589     2  0  80   0 -     0 -      ?        00:00:00 kauditd
4 S     0   593     1  0  80   0 -  7443 -      ?        00:00:00 systemd-journal
4 S     0   635     1  0  80   0 - 11312 -      ?        00:00:00 systemd-udevd
1 S     0  1101     2  0  60 -20 -     0 -      ?        00:00:00 iprt-VBoxWQueue
4 S   100  1110     1  0  80   0 - 25596 -      ?        00:00:00 systemd-timesyn
1 S     0  1302     2  0  60 -20 -     0 -      ?        00:00:00 kworker/1:1H
1 S     0  1464     2  0  60 -20 -     0 -      ?        00:00:00 ttm_swap
4 S     0  1634     1  0  80   0 -  9444 -      ?        00:00:00 cron
4 S   109  1636     1  0  80   0 - 91157 -      ?        00:00:00 whoopsie
4 S     0  1638     1  0  80   0 -  7157 -      ?        00:00:00 systemd-logind
0 S     0  1643     1  0  80   0 -  1100 -      ?        00:00:00 acpid
4 S     0  1649     1  0  80   0 - 71238 -      ?        00:00:00 accounts-daemon
4 S     0  1653     1  0  80   0 - 56870 -      ?        00:00:00 snapd
4 S   106  1675     1  0  80   0 - 11022 -      ?        00:00:00 dbus-daemon
4 S     0  1744     1  0  80   0 - 132990 -     ?        00:00:00 NetworkManager
4 S   104  1747     1  0  80   0 - 64099 -      ?        00:00:00 rsyslogd
4 S   111  1753     1  0  80   0 - 11197 -      ?        00:00:00 avahi-daemon
4 S     0  1759     1  0  80   0 - 84346 -      ?        00:00:00 ModemManager
4 S     0  1847     1  0  80   0 - 87593 -      ?        00:00:00 lightdm
5 S     0  1848     1  0  80   0 -  4868 -      ?        00:00:00 irqbalance
1 S   111  1850  1753  0  80   0 - 11197 -      ?        00:00:00 avahi-daemon
4 S     0  1853     1  0  80   0 - 68706 -      ?        00:00:00 cups-browsed
4 S     0  1858     1  0  80   0 - 69684 -      ?        00:00:00 polkitd
4 S     0  1884     1  0  80   0 -  6034 -      ?        00:00:00 vsftpd
4 S     0  1902  1847  0  80   0 - 67517 -      tty7     00:00:07 Xorg
4 S     0  1905  1744  0  80   0 -  4030 -      ?        00:00:00 dhclient
4 S 65534  1918  1744  0  80   0 - 15409 -      ?        00:00:00 dnsmasq
4 S     0  2085  1847  0  80   0 - 57059 -      ?        00:00:00 lightdm
4 S  1000  2091     1  0  80   0 - 11303 ep_pol ?        00:00:00 systemd
5 S  1000  2093  2091  0  80   0 - 15902 -      ?        00:00:00 (sd-pam)
4 S  1000  2096  2085  0  80   0 - 13751 poll_s ?        00:00:00 upstart
1 S  1000  2174  2096  0  80   0 - 10407 poll_s ?        00:00:00 upstart-udev-br
1 S  1000  2175  2096  0  80   0 - 10867 ep_pol ?        00:00:00 dbus-daemon
1 S  1000  2214  2096  0  80   0 - 10391 poll_s ?        00:00:00 upstart-dbus-br
1 S  1000  2216  2096  0  80   0 - 10391 poll_s ?        00:00:00 upstart-dbus-br
1 S  1000  2218  2096  0  80   0 - 12553 poll_s ?        00:00:00 upstart-file-br
1 S  1000  2221  2096  0  80   0 - 69742 poll_s ?        00:00:00 fcitx
1 S  1000  2225  2096  0  80   0 - 53571 -      ?        00:00:00 gnome-keyring-d
1 S  1000  2238  2096  0  80   0 - 43873 -      ?        00:00:00 gpg-agent
4 S     0  2260     1  0  80   0 -  6177 -      tty1     00:00:00 agetty
1 S  1000  2263  2096  0  80   0 - 10725 ep_pol ?        00:00:00 dbus-daemon
1 S  1000  2270  2096  0  99  19 -  6909 poll_s ?        00:00:00 fcitx-dbus-watc
0 S  1000  2284  2096  0  80   0 -  1127 wait   ?        00:00:00 sh
0 S  1000  2295  2284  0  80   0 - 82080 poll_s ?        00:00:00 xfce4-session
0 S  1000  2297  2096  0  80   0 - 11910 poll_s ?        00:00:00 xfconfd
0 S  1000  2305  2096  0  80   0 - 55231 poll_s ?        00:00:00 xfwm4
0 S  1000  2309  2096  0  80   0 - 70151 poll_s ?        00:00:00 xfce4-panel
0 S  1000  2311  2096  0  80   0 - 44770 poll_s ?        00:00:00 Thunar
0 S  1000  2313  2096  0  80   0 - 116333 poll_s ?       00:00:00 xfdesktop
0 S  1000  2314  2295  0  80   0 - 80764 poll_s ?        00:00:00 xfce4-clipman
0 S  1000  2315  2295  0  80   0 - 156346 poll_s ?       00:00:05 docky
1 S  1000  2318  2096  0  80   0 - 93629 poll_s ?        00:00:00 xfsettingsd
0 S  1000  2322  2096  0  80   0 - 70846 poll_s ?        00:00:00 gvfsd
0 S  1000  2325  2295  0  80   0 - 133445 poll_s ?       00:00:00 light-locker
0 S  1000  2329  2295  0  80   0 - 156116 poll_s ?       00:00:00 update-notifier
0 S  1000  2332  2295  0  80   0 - 145994 poll_s ?       00:00:01 blueman-applet
0 S  1000  2333  2295  0  80   0 - 61282 poll_s ?        00:00:00 applet.py
1 S  1000  2336  2096  0  80   0 - 80433 poll_s ?        00:00:00 xfce4-power-man
0 S  1000  2338  2295  0  80   0 - 167782 poll_s ?       00:00:00 nm-applet
1 S  1000  2339  2096  0  80   0 - 113693 poll_s ?       00:00:00 xfce4-volumed
0 S  1000  2342  2096  0  80   0 - 101715 futex_ ?       00:00:00 gvfsd-fuse
0 S  1000  2344  2295  0  80   0 - 112642 poll_s ?       00:00:00 polkit-gnome-au
4 S     0  2359     1  0  80   0 - 89005 -      ?        00:00:00 upowerd
0 S  1000  2365  2096  0  80   0 - 44633 poll_s ?        00:00:00 dconf-service
1 S  1000  2378  2096  0  69 -11 - 108894 poll_s ?       00:00:00 pulseaudio
4 S   117  2379     1  0  81   1 - 45886 -      ?        00:00:00 rtkit-daemon
0 S  1000  2399  2096  0  80   0 - 84440 poll_s ?        00:00:00 at-spi-bus-laun
0 S  1000  2404  2399  0  80   0 - 10692 ep_pol ?        00:00:00 dbus-daemon
0 S  1000  2406  2096  0  80   0 - 51744 poll_s ?        00:00:00 at-spi2-registr
0 S  1000  2422  2309  0  80   0 - 111246 poll_s ?       00:00:00 panel-1-whisker
0 S  1000  2428  2309  0  80   0 - 42015 poll_s ?        00:00:00 panel-4-systray
0 S  1000  2429  2309  0  80   0 - 81273 poll_s ?        00:00:00 panel-5-power-m
0 S  1000  2430  2309  0  80   0 - 116543 poll_s ?       00:00:00 panel-6-indicat
0 S  1000  2446  2096  0  80   0 - 17597 poll_s ?        00:00:00 gconfd-2
0 S  1000  2451  2096  0  80   0 - 13721 poll_s ?        00:00:00 upstart
0 S  1000  2453  2451  0  80   0 - 106798 poll_s ?       00:00:00 indicator-messa
0 S  1000  2454  2451  0  80   0 - 168211 poll_s ?       00:00:00 indicator-sound
0 S  1000  2456  2451  0  80   0 - 98985 poll_s ?        00:00:00 indicator-appli
0 S  1000  2477  2096  0  80   0 - 73649 poll_s ?        00:00:00 gvfs-udisks2-vo
4 S     0  2480     1  0  80   0 - 91898 -      ?        00:00:00 udisksd
0 S  1000  2494  2096  0  80   0 - 103144 poll_s ?       00:00:00 gvfs-afc-volume
0 S  1000  2500  2096  0  80   0 - 70163 poll_s ?        00:00:00 gvfs-gphoto2-vo
0 S  1000  2505  2096  0  80   0 - 67114 poll_s ?        00:00:00 gvfs-mtp-volume
0 S  1000  2510  2096  0  80   0 - 66623 poll_s ?        00:00:00 gvfs-goa-volume
0 S  1000  2518  2096  0  80   0 - 89922 poll_s ?        00:00:00 gvfsd-trash
0 S  1000  2525  2096  0  80   0 - 48726 poll_s ?        00:00:00 gvfsd-metadata
0 S  1000  2538  2096  0  80   0 - 37585 poll_s ?        00:00:00 obexd
1 S     0  2701     2  0  80   0 -     0 -      ?        00:00:00 kworker/1:0
1 S     0  2793     2  0  80   0 -     0 -      ?        00:00:00 kworker/u6:0
1 S     0  2797     2  0  80   0 -     0 -      ?        00:00:00 kworker/2:0
1 S     0  2818     2  0  80   0 -     0 -      ?        00:00:00 kworker/1:2
0 S  1000  2858  2096  0  80   0 - 108202 poll_s ?       00:00:00 xfce4-terminal
0 S  1000  2862  2858  0  80   0 -  3718 -      ?        00:00:00 gnome-pty-helpe
0 S  1000  2863  2858  0  80   0 -  7830 wait   pts/1    00:00:00 bash
5 S 65534  2885  1884  0  80   0 -  8670 -      ?        00:00:00 vsftpd
5 S  1000  2887  2885  0  80   0 -  8676 -      ?        00:00:00 vsftpd
1 S     0  2890     2  0  80   0 -     0 -      ?        00:00:00 kworker/u6:2
0 R  1000  2895  2863  0  80   0 -  9421 -      pts/1    00:00:00 ps

    # 현재 사용되고 있는 모든 프로세스 현황을 볼수가 있으며 마지막 프로세스에 방금전 수행한 'ps' 명령어 떠 있는 것을 확인 할수가 있다.

// 그렇다면 저 프로세스들 중 하나인 독 프로그램인 'docky' 애플리케이션을 종료 해보도록 하자.
( 종료는 pid 번호를 활용 하며 명령어는 kill 이다.)


// 먼저 grep을 활용하여 docky 하나만을 확인하자.

$ ps  -lea |grep docky

0 S  1000  2315  2295  0  80   0 - 156346 poll_s ?       00:00:06 docky

    # 여기서 'docky'의 PID는 2315 이다.

// docky를 강제 종료해 보자.

$ kill -9 2315
    (권한 문제로 종료 되지 않는 프로세스는 'sudo kill (pid)'로써 종료를 시도 하거난 루트 상태(sudo -s) 에서 종료를 시도한다.)

// 프로세스가 종료 되었는지 확인해 보자.

$ ps  -lea |grep docky

    # 아무것도 나오지 않는 다면 성공한 것이다.





 지금까지 프로세스 확인 방법과 PID를 이용한 프로세스 종료 방법을 알아 보았다.

그렇다면 이번에는 좀 더 수월한 방법인 프로세스 이름을 활용하여 해당 프로세스를 종료 보도록 해 보겠다.


// 'killall' 명령을 사용하여 해당 프로세스를 종료 시킨다.

$ killall -9 docky

    # 아무것도 나오지 않는 다면 성공한 것이다.



    // 만약 killall이 수행 되지 않는다면 'psmisc'패키지를 설치 해야 한다.

    $ sudo apt install psmisc


  



 

도움이 되셨다면 '♡' 버튼을 꼭눌러 주시면 감사 하겠습니다.


그리고 글에 부족한 점이 있거나 틀린점이 있는 것 같다면 꼭 댓글로 알려 주시면 감사 하겠습니다.




awk는 기능이 무척 다양하기에 쉘에서 동작함에도 불구하고 'awk는 프로그래밍 이다!'라고 말하는 전문가 들이 많다.

그래서 이번강의 부터 재미있는 awk 프로그램을 활용하는 방법들에 대해 차근차근 알아 보도록 하자.

1. awk로 텍스트 파일의 원하는 열만 출력 하기

우선 텍스트 파일은 이렇게 구성 되어 있다고 가정하자.


file.txt

fire born ask
letter land smile



해당 파일의 3번째 열을 출력한다.

-- 터미널 텍스트 박스 (Terminal text box) --

<Drag와 복사가 가능합니다.>


root@test:~$ awk '{print $3}' file.txt


ask
 smile

-> 파일의 첫번째 줄 3번째열에 해당 되는 'ask' 단어가 출력 되었다.





응용하여 행과 열을 동시에 출력해 보자.

-- 터미널 텍스트 박스 (Terminal text box) --

<Drag와 복사가 가능합니다.>

// 주석


root@test:~$ head -2 file.txt |tail -1 |awk '{print $2}'


land

-> 파일의 두번째 행의 2번째 열인 'head'를 출력한다.




 

도움이 되셨다면 '♡' 버튼을 꼭눌러 주시면 감사 하겠습니다.



리눅스에서 아주 쉬운 콘솔에서의 환경변수에 대해서 알아보자.

'환경변수' 라는 것은 그럴듯하게 어렵게 들릴수도 있겠지만 매우 쉬우며 어렵지 않다.

그냥 단순하게 환경의 조건을 정하는 것이다.

어떤 운영체제를 다룬다면 그 체제의 왕은 절대적으로 여러분이다.

그렇다. 여러분이 왕이 되어서 어떤 여러가지 문자를 함축적으로 정하는 것이다.

예를 들어,

"she=my love" 라고 정하고 싶다면 보통 프로그래밍 에서는 변수를 이렇게 설정한다.

she="my love"

그냥 바로 이거다. 이것이 변수라는 것이다.

얼마나 쉬운가?

여기에서 변수에 환경이란 말을 더하여 콘솔에서의 '환경변수'를 절대적으로 정한다고 한다면 터미널에 그저 'export'를 앞에 갖다 붙히기만 하면 되는 것이다.

자 그러면 터미널에서 그것을 한번 시험해 보도록 하자.




// 환경변수를 지정한다.


root@test:~$ export she="my love"



// 지정된 환경변수를 불러온다.


root@test:~$ echo $she

my love

-> 'she'에 대한 환경변수가 출력 되는데 성공했다.





보시는 바와 같이 "my love" 라는 글이 출력 되는 것을 볼 수가 있다.

그리고 중요한 것은 그것을 불러오는 명령에서 she 앞에 '$'를 붙였다는 것이다.
'$' 문자는 유닉스 시스템의 쉘 스크립트 에서 변수를 불러오는 매우 중요한 담당 역할을 하는 문자 이다.

하지만 이와 같은 단순한 환경변수 지정은 여러분이 연 그 터미널에서만 변수로 동작하며 다른 터미널 콘솔 에서는 변수로 지정 되지 않는다.

그렇다면 변수를 계속 유지되도록 전역설정을 하려면 어떻게해야 할까?

이는 '$/HOME/.bashrc' 파일에 해당 스크립트를 입력하여 처리가 가능하다.
($HOME = /home/user)


// 먼저 만일을 대비해서 bashrc의 백업을 만든다. (물론 부팅시를 기준으로 한 백업 파일인 '$HOME/.bashrc~'가 존재 한다.) 


root@test:~$ cp ~/.bashrc ~/.bashrc.bak



// .bashrc 파일에 추가할 환경변수를 삽입 한다.


root@test:~$ echo 'export she="my love"' >> ~/.bashrc



// 재부팅 할 필요 없이 '~/.bashrc' 파일의 소스를 로드한다.


root@test:~$ source ~/.bashrc



// 지정된 환경변수를 불러온다.


root@test:~$ echo $she

my love


-> 'she'에 대한 환경변수가 출력 되는데 성공했다.




이와 같은 환경변수는 전역 bash 프로그래밍에서 활용되며 여러 소프트웨어들이 이러한 환경변수를 활용한다.
대표적으로 많이 사용되는 환경변수들은 다음과 같다.

$HOME     사용자의 홈 디렉토리
$PATH     실행 파일 경로
$LANG     환경변수에 설정된 언어
$PWD         사용자의 현재 작업중인 디렉토리
$SECONDS     해당 콘솔이 실행된 경과를 초 단위 시간으로 나타냄
$SHLVL     사용되는 쉘 레벨
$SHELL     사용되는 쉘 이름($BASH와 같게 나옴.)
$PPID     부모 프로세스의 PID
$BASH     BASH 실행 파일 경로
$BASH_VERSION     설치된 BASH 버전
$MAIL     환경변수에 설정된 메일주소
$OSTYPE     운영체제 종류
$TERM     현재 사용되는 터미널 이름
$HOSTNAME     호스트 전체 이름
$HOSTTYPE     시스템의 아키텍처
$MACHTYPE     PC의 아키텍쳐와 운영체제표시
$LOGNAME     로그인 사용자 이름
$UID         사용자 UID
$EUID     su 명령에서 사용하는 사용자의 유효 아이디 값(UID와 EUID 값은 다를 수 있음)
$USER     사용자의 이름
$HISTFILE     history파일의 경로
$DISPLAY     현재 사용되는 X 디스플레이 이름

도움이 되셨다면 '♡' 버튼을 꼭눌러 주시면 감사 하겠습니다.


여러분이 사용하는 리눅스 환경은 기본적으로 TTY (Teletypewriter) 위에 그러져 있다.
 
즉 데스크탑 gui (xwindows) 환경은 실질적으로 '콘솔' 위에 올려져 있는 형태 인 것이다.

콘솔(consol)은 CLI (Command line interface) 혹은 CUI라고도 불리우며 컴퓨터를 운용하기 위한 목적으로 텍스트를 사용자와 컴퓨터가 주고 받는 방식의 인터페이스를 말한다.

정확하게 말하자면 xwindows 데스크탑 환경에서 작동하는 콘솔은 pts/1에 올려져 있다.

이것이 무슨 말인지 지금부터 차근히 설명해 보겠다.

전체 콘솔은 다음과 같은 구성을 가지고 있다.

/dev (device)


    → TTY (일반 CLI 콘솔)

        → TTYs (시리얼 tty)

        → PTS (기본 xwindows를 위한 가상 콘솔)

            → PTY ( 외부의 원격 접속을 위한 가상 콘솔)



이와 같은 환경은 파일시스템 에서도 확인이 가능하다.



// 현재 세션을 확인한다.

$ tty

/dev/pts/1

   
    * 보시다시피 xwindwos 상테의 CLI는 PTS에 속한다.

// /dev 폴더를 출력한다.

$ ls /dev

autofs           log                 ram8      tty21  tty58   ttyS8
block            loop-control        ram9      tty22  tty59   ttyS9
bsg              loop0               random    tty23  tty6    ttyprintk
btrfs-control    loop1               rfkill    tty24  tty60   uhid
bus              loop2               rtc       tty25  tty61   uinput
char             loop3               rtc0      tty26  tty62   urandom
console          loop4               sda       tty27  tty63   usb
core             loop5               sda1      tty28  tty7    userio
cpu              loop6               sda2      tty29  tty8    vboxdrv
cpu_dma_latency  loop7               sda3      tty3   tty9    vboxdrvu
cuse             lp0                 sda4      tty30  ttyS0   vboxnetctl
disk             mapper              sdb       tty31  ttyS1   vboxusb
dm-0             mcelog              sdc       tty32  ttyS10  vcs
dri              mem                 sdc1      tty33  ttyS11  vcs1
ecryptfs         memory_bandwidth    sdc2      tty34  ttyS12  vcs10
fb0              mqueue              sdc5      tty35  ttyS13  vcs2
fd               net                 sg0       tty36  ttyS14  vcs3
full             network_latency     sg1       tty37  ttyS15  vcs4
fuse             network_throughput  sg2       tty38  ttyS16  vcs5
fw0              null                shm       tty39  ttyS17  vcs6
hidraw0          parport0            snapshot  tty4   ttyS18  vcs8
hidraw1          port                snd       tty40  ttyS19  vcsa
hidraw2          ppp                 stderr    tty41  ttyS2   vcsa1
hpet             psaux               stdin     tty42  ttyS20  vcsa10
hugepages        ptmx                stdout    tty43  ttyS21  vcsa2
hwrng            pts                 tty       tty44  ttyS22  vcsa3
i2c-0            ram0                tty0      tty45  ttyS23  vcsa4
i2c-1            ram1                tty1      tty46  ttyS24  vcsa5
i2c-2            ram10               tty10     tty47  ttyS25  vcsa6
i2c-3            ram11               tty11     tty48  ttyS26  vcsa8
i2c-4            ram12               tty12     tty49  ttyS27  vfio
i2c-5            ram13               tty13     tty5   ttyS28  vga_arbiter
i2c-6            ram14               tty14     tty50  ttyS29  vhci
i2c-7            ram15               tty15     tty51  ttyS3   vhost-net
initctl          ram2                tty16     tty52  ttyS30  zero
input            ram3                tty17     tty53  ttyS31
kfd              ram4                tty18     tty54  ttyS4
kmsg             ram5                tty19     tty55  ttyS5
kvm              ram6                tty2      tty56  ttyS6
lightnvm         ram7                tty20     tty57  ttyS7



위의 /dev 폴더의 출력을 보면 tty들이 상당히 많은 것을 볼수가 있으며 pts 폴더 또한 확인이 가능하다.

다른 tty의 접근은 키보드로써 바로 접근이 가능하다.

'Alt + Ctrl + F1' 키를 눌러 보도록 하자.

그러면 화면이 바뀌면서 tty1 콘솔 모드로 진입 하게 된다.

그렇다면 차례 차례 F6까지 눌러 보도록 하자.

'Alt + Ctrl + F7' 까지 눌러보면 다시 원래의 XWINDOWS(pts/n)환경으로 돌아온 것을 알수가 있다.

사용 가능한 콘솔은 tty6 까지이고 xwindows 부터 사용하는 콘솔은 pts 에 속한다.

※ 하지만 만약 보안 툴인 selinux 를 'ecforce'로써 작동하여 사용하고 있다면 사용자도 다른 tty로 접근이 불가할 뿐만이 아니라 다른 pts, pty에 외부에서의 접근이 불가 하다.

즉 사용자도 tty를 사용하기 위해서는 selinux를 'permissive'로 정책을 바꿔줘야 한다.


해당 방법은 다음 포스트 에서 확인 할수 있다.

물론 tty에서 xwindwos 진입이 불가 한 것은 아니다.


// 먼저 'Alt + Ctrl + F1' 키를 눌러 tty1에 진입 하고 로그인 한다.

// tty를 확인한다.

$ tty

/dev/tty1

    * tty가 1로 정상적으로 뜨고 있다.

// tty1 콘솔에서 xwindows로 진입해 본다.

$ startx

// 새로운 xwindows에서 터미널을 열고 tty를 확인한다.

$ tty

/dev/pts/(number)
   
    * xwindows로 진입하자 tty가 아닌 마찬가지 다른 pts로 뜨는 것을 확인 할 수 있다.



 
앞서 말했듯이 xwindows에서 작동하는 가상 콘솔은 pts로써 동작 한다고 말했지만 이것은 꼭 다른 xwindows 에서만 추가 되는 것이 아니라
동일한 xwindows 데스크탑 에서 터미널-gui 을 열때 마다 추가 된다.

그렇다면 한 번 실험을 해보도록 해보자. ( 환경은 tty7-pts/1 그대로 한 곳에서만)


// 터미널 창을 여러개 띄운다.

$ ps -leat
    (-t 옵션은 terminal 현황 출력을 의미한다.)

F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
4     0  1907  1862  20   0 273452 56188 -      Rsl+ tty7       0:09 /usr/lib/xo
4     0  2229     1  20   0  24708  1860 -      Ss+  tty1       0:00 /sbin/agett
0  1000  2578  2573  20   0  31320  4992 wait   Ss   pts/1      0:00 bash XDG_SE
0  1000  3617  2578  20   0  34936  3232 signal T    pts/1      0:00 systemctl s
0  1000  3624  3617  20   0  18424   788 signal T    pts/1      0:00 pager LESSO
0  1000  3843  2573  20   0  31320  4812 wait_w Ss+  pts/7      0:00 bash XDG_SE
0  1000  3860  2573  20   0  31320  4828 wait_w Ss+  pts/8      0:00 bash XDG_SE
0  1000  3876  2573  20   0  31320  4868 wait_w Ss+  pts/9      0:00 bash XDG_SE
0  1000  3909  2578  20   0  37684  1540 -      R+   pts/1      0:00 ps -leat X

    * 현재 pts가 1, 7, 8, 9 총 4개가 있다. 이것은 사용자가 터미널 창을 4개를 띄웠다는 것을 의미한다.
 
// 이번에는 터미널 창 하나를 놔두고 나머지는 전부 종료 한다.

$ ps -leat

F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
4     0  1907  1862  20   0 277424 59612 -      Ssl+ tty7       0:13 /usr/lib/xorg/Xorg -core :0 -seat seat0
4     0  2229     1  20   0  24708  1860 -      Ss+  tty1       0:00 /sbin/agetty --noclear tty1 linux
0  1000  2578  2573  20   0  31328  5000 wait   Ss   pts/1      0:00 bash XDG_SEAT_PATH=/org/freedesktop/Dis
0  1000  3617  2578  20   0  34936  3232 signal T    pts/1      0:00 systemctl status ssh.service LESSOPEN=|
0  1000  3624  3617  20   0  18424   788 signal T    pts/1      0:00 pager LESSOPEN=| /usr/bin/lesspipe %s G
0  1000  3924  2578  20   0  37684  1488 -      R+   pts/1      0:00 ps -leat XDG_VTNR=7 XDG_SESSION_ID=c1

    * pts가 1 하나 밖에 남지 않은 것을 확인 할 수 있다.




도움이 되셨다면 '♡' 버튼을 꼭눌러 주시면 감사 하겠습니다.






이전 ls 강의  에 이어서 마지막 ls 강의 02에 들어가 보도록 하겠다.

     $ ls -pR

.:
U           bp   else  get    getter       hz   op  ro  screen.png  testd2
autopoboot  bpt  f     geted  gettter.ods  odg  r   rt  testd       uu

./testd:
bp  get  getter  r  ro  rt  screen.png  uu

./testd2:

-- '-R' 은 하부 디렉토리 전부를 동시에 같이 보여준다.

// 그렇다면 이번에는 이전에 배운 명령어와 '-R' 를 조합해 사용해 볼 것이다.

    $ ls -RalphS

.:
합계 656K
-rwxr-x---.   1 tester tester 343K  7월 30 14:43 screen.png
drwxr-x---. 131 tester tester  44K  8월  5 23:52 ../
-rwxr-x---.   1 tester tester  17K  6월 12 19:49 geted
-rwxr-x---.   1 tester tester 9.6K  6월 12 16:44 gettter.ods
drwxr-x---.   5 tester tester 4.0K  8월  5 19:23 ./
drwxrwxr-x.   2 tester tester 4.0K  8월  5 19:06 .hidf/
drwxrwxr-x.   2 tester tester 4.0K  8월  5 23:52 testd/
drwxrwxr-x.   2 tester tester 4.0K  8월  5 16:30 testd2/
-rwxr-x---.   1 tester tester 3.8K  5월 21 18:25 bp
-rwxr-x---.   1 tester tester 3.0K  6월 12 22:30 hz
-rwxr-x---.   1 tester tester 1.3K  5월 29 21:37 odg
-rwxr-x---.   1 tester tester  610  5월 21 17:26 rt
-rwxr-x---.   1 tester tester  205  6월  4 21:54 autopoboot
-rwxr-x---.   1 tester tester  181  6// 먼저 grep을 ls와 같이 조합해 명령을 내려 보도록 하자.

    $ ls -lap |grep hid
 

-rw-rw-r--.   1 tester tester      2  8월  5 19:05 .hid.txt
drwxrwxr-x.   2 tester tester   4096  8월  5 19:06 .hidf/


: 'hid' 문자가 들어간 파일과 폴더를 찾아 그것만 출력해 주는 것을 볼 수 있다.

// 이젠 less를 ls와 같이 조합해 명령을 내려 보도록 하자.

     $ ls -RalphS |less

-- 다음과 페이지를 나눠 첫번째 페이지에 멈추어 같이 출력 된다.

.:
합계 656K
-rwxr-x---.   1 tester tester 343K  7월 30 14:43 screen.png
drwxr-x---. 131 tester tester  44K  8월  5 23:52 ../
-rwxr-x---.   1 tester tester  17K  6월 12 19:49 geted
-rwxr-x---.   1 tester tester 9.6K  6월 12 16:44 gettter.ods
drwxr-x---.   5 tester tester 4.0K  8월  5 19:23 ./
drwxrwxr-x.   2 tester tester 4.0K  8월  5 19:06 .hidf/
drwxrwxr-x.   2 tester tester 4.0K  8월  5 23:52 testd/
drwxrwxr-x.   2 tester tester 4.0K  8월  5 16:30 testd2/
-rwxr-x---.   1 tester tester 3.8K  5월 21 18:25 bp
-rwxr-x---.   1 tester tester 3.0K  6월 12 22:30 hz
-rwxr-x---.   1 tester tester 1.3K  5월 29 21:37 odg
-rwxr-x---.   1 tester tester  610  5월 21 17:26 rt
-rwxr-x---.   1 tester tester  205  6월  4 21:54 autopoboot
-rwxr-x---.   1 tester tester  181  6월  1 00:05 ro
-rwxr-x---.   1 tester tester  114  6월 12 19:49 get
-rwxr-x---.   1 tester tester  110  5월 21 18:42 bpt
-rwxr-x---.   1 tester tester  103  7월 16 16:23 getter
-rwxr-x---.   1 tester tester   85  5월 14 23:29 r
-rwxr-x---.   1 tester tester   72  6월 16 23:53 else
-rwxr-x---.   1 tester tester   47  5월 30 11:00 uu
-rwxr-x---.   1 tester tester   45  5월 29 19:17 op
:

= 여기서 화살표키나 엔터키 혹은 'pagedown'로 내려가며 볼수가 있으며 'less 프로세스' 내에서 빠져 나오려면
키보드에서 "ctrl + z" 로 빠져 나올수가 있다.월  1 00:05 ro

-rwxr-x---.   1 tester tester  114  6월 12 19:49 get
-rwxr-x---.   1 tester tester  110  5월 21 18:42 bpt
-rwxr-x---.   1 tester tester  103  7월 16 16:23 getter
-rwxr-x---.   1 tester tester   85  5월 14 23:29 r
-rwxr-x---.   1 tester tester   72  6월 16 23:53 else
-rwxr-x---.   1 tester tester   47  5월 30 11:00 uu
-rwxr-x---.   1 tester tester   45  5월 29 19:17 op
-rwxr-x---.   1 tester tester   10  5월 30 11:01 U
-rwxr-x---.   1 tester tester    5  6월  3 19:11 f
-rw-rw-r--.   1 tester tester    2  8월  5 19:05 .hid.txt

./.hidf:
합계 8.0K
drwxrwxr-x. 2 tester tester 4.0K  8월  5 19:06 ./
drwxr-x---. 5 tester tester 4.0K  8월  5 19:23 ../

./testd:
합계 444K
-rwxr-x---. 1 tester tester 343K  8월  5 16:30 screen.png
drwxrwxr-x. 2 tester tester 4.0K  8월  5 23:52 ./
drwxr-x---. 5 tester tester 4.0K  8월  5 19:23 ../
-rwxr-x---. 1 tester tester 3.8K  8월  5 16:30 bp
-rwxr-x---. 1 tester tester  610  8월  5 16:30 rt
-rwxr-x---. 1 tester tester  181  8월  5 16:30 ro
-rwxr-x---. 1 tester tester  114  8월  5 16:30 get
-rwxr-x---. 1 tester tester  103  8월  5 16:30 getter
-rwxr-x---. 1 tester tester   85  8월  5 16:30 r
-rwxr-x---. 1 tester tester   47  8월  5 16:30 uu

./testd2:
합계 8.0K
drwxrwxr-x. 2 tester tester 4.0K  8월  5 16:30 ./
drwxr-x---. 5 tester tester 4.0K  8월  5 19:23 ../


-- 디렉터리 하부의 모든 내용들을 전부 나누어 출력해 주고 있다.




지금까지 ls에 관한 여러 명령어 사용과 조합 방법에 대해 알아 보았다.

그렇다면 이제부터는 조금 더 고급 조합 사용 방법들에 대해서 알아 보도록 해 보자.

지금 부터 배울 것은 기존 ls 명령어 에다가 'less' 'grep'을 조합해 볼 것이다.

less는 less 자체 프로세스 내부로 진입하여 페이지를 나누어 볼 수 있게 해주는 시스템 명령어 소프트웨어 이며

grep 원하는 문자 행만 찾아 주는 역할을 하는 시스템 명령어 소프트웨어 이다.

시스템 명령 끼리 조합해 사용하기 위해서는 ' | ' 를 같이 사용해 줘야 하는데 ' | '는 키보드에서 "시프트키(Shift key) + \(₩)" 를 눌러 구현 할수 있다.


// 먼저 grep을 ls와 같이 조합해 명령을 내려 보도록 하자.

    $ ls -lap |grep hid
 
-rw-rw-r--.   1 tester tester      2  8월  5 19:05 .hid.txt
drwxrwxr-x.   2 tester tester   4096  8월  5 19:06 .hidf/


= 'hid' 문자가 들어간 파일과 폴더를 찾아 그것만 출력해 주는 것을 볼 수 있다.



// 이젠 less를 ls와 같이 조합해 명령을 내려 보도록 하자.

    $ ls -RalphS |less

-- 다음과 페이지를 나눠 첫번째 페이지에 멈추어 같이 출력 된다.

.:
합계 656K
-rwxr-x---.   1 tester tester 343K  7월 30 14:43 screen.png
drwxr-x---. 131 tester tester  44K  8월  5 23:52 ../
-rwxr-x---.   1 tester tester  17K  6월 12 19:49 geted
-rwxr-x---.   1 tester tester 9.6K  6월 12 16:44 gettter.ods
drwxr-x---.   5 tester tester 4.0K  8월  5 19:23 ./
drwxrwxr-x.   2 tester tester 4.0K  8월  5 19:06 .hidf/
drwxrwxr-x.   2 tester tester 4.0K  8월  5 23:52 testd/
drwxrwxr-x.   2 tester tester 4.0K  8월  5 16:30 testd2/
-rwxr-x---.   1 tester tester 3.8K  5월 21 18:25 bp
-rwxr-x---.   1 tester tester 3.0K  6월 12 22:30 hz
-rwxr-x---.   1 tester tester 1.3K  5월 29 21:37 odg
-rwxr-x---.   1 tester tester  610  5월 21 17:26 rt
-rwxr-x---.   1 tester tester  205  6월  4 21:54 autopoboot
-rwxr-x---.   1 tester tester  181  6월  1 00:05 ro
-rwxr-x---.   1 tester tester  114  6월 12 19:49 get
-rwxr-x---.   1 tester tester  110  5월 21 18:42 bpt
-rwxr-x---.   1 tester tester  103  7월 16 16:23 getter
-rwxr-x---.   1 tester tester   85  5월 14 23:29 r
-rwxr-x---.   1 tester tester   72  6월 16 23:53 else
-rwxr-x---.   1 tester tester   47  5월 30 11:00 uu
-rwxr-x---.   1 tester tester   45  5월 29 19:17 op
:

= 여기서 화살표키나 엔터키 혹은 'pagedown'로 내려가며 볼수가 있으며 'less 프로세스' 내에서 빠져 나오려면
키보드에서 "ctrl + z" 로 빠져 나올수가 있다.



도움이 되셨다면 '♡' 버튼을 꼭눌러 주시면 감사 하겠습니다.


 

+ Recent posts