<프롬프트 변경하기>



Linux(Unix)의 기본 프롬프트 설정은 작업하는 디렉토리가 깊어질수록
프롬프트 명령창의 길이가 달나라로 가버리기 때문에 
사용자 프롬프트 창의 포맷을 변경을 하는 법을 알아두면 좋다


 

사용자 프롬프트 설정하기



현재 프롬프트 스트링(PS1) 출력하기
username@username-server:~$ echo $PS1
>> \[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$



프롬프트 스트링(PS1) 변경하기
username@username-server:~$ PS1="username : ";
username : ls
>> aa bb cc dd



프롬프트 스트링의 이스케이프 문자
\H the hostname
\h the hostname up to the first '.'
\d the date
\n new line
\r carriage return
\t the current time in 24-hour
\T the current time in 12-hour
참고 사이트 : https://tldp.org/HOWTO/Bash-Prompt-HOWTO/bash-prompt-escape-sequences.html



주의) 프롬프트 변경 후 프로필에 저장하지 않을 경우 종료 후 재진입하면 프롬프트 기본설정으로 돌아온다




<사용자 관리하기>

 


고전적인 사용자 관리 명령어 : 홈디렉토리 수동생성

useradd - 사용자 추가
usermod - 사용자 변경
userdel - 사용자 삭제


dragon 사용자 추가하기

$useradd dragon
dragon 사용자 추가

$cat /etc/passwd 또는 tail -n2 /etc/passwd
>> dragon:x:1001:1001::/home/dragon
사용자아이디:x:사용자식별자:그룹식별자::기본홈디렉토리

$sudo passwd dragon
패스워드 지정

$sudo mkdir /home/dragon
홈디렉토리 만들어주기 (안만들면 로그인 했을 때 홈디렉토리가 없어 프롬프트 기본설정이 사라진다)

Permission dinied 라고 뜨면 sudo 관리자 권한으로 명령하면 된다



기타) 그룹 보기

cat /etc/group
그룹 목록을 볼 수 있다

groups dragon
dragon이 포함된 group 목록을 볼 수 있다


 

<홈 디렉토리 생성과 소유권 변경하기>



$sudo mkdir /home/dragon

홈 디렉토리를 생성 후 ls -l 을 해보면
>> drwxr-xr-x 3 root root bytes date dragon
sudo로 만들었기 때문에 관리자 계정 root가 소유자로 나온다
소유권을 변경해야 파일 등을 생성할 수 있다


소유권 변경하기

~$sudo chown dragon ../dragon superuser do change owner dragon /home/dragon
~$ls -l ../
>> drwxr-xr-x 3 dragon root bytes date dragon


소유자, 소유자 그룹 한꺼번에 변경하기

~$sudo chown dragon:dragon ../dragon superuser do change owner dragon:dragon /home/dragon
~$ls -l ../
>> drwxr-xr-x 3 dragon dragon bytes date dragon


홈 디렉토리에 dragon 계정으로 파일이 잘 만들어지는지 확인



<사용자를 추가하는 스크립트 파일 생성>



nano adduser 편집기로 adduser 파일 만들고 편집 실행

useradd testuser
tail -n2 /etc/passwd
mkdir /home/testuser
chown testuser:testuser /home/testuser
echo "testuser user added"

명령어로 하나하나 쳤던 것을 전부 작성해준다
저장하고 편집기 종료


이제 실행 할 수 있도록 권한 변경을 해줘야한다

현재 파일 상태 ( ls -l )
>> -rw-rw-r-- adduser



<파일과 디렉토리 권한 변경>



'[ugoa]*([-+=]([rwxXst]*|[ugo]))+|[-+=][0-7]+'


-rwxr-xr-x text.txt
(왼쪽부터 첫번째 - 제외 3비트씩 묶는다)
(현재 상태 111 101 101)
- 타입
rwx 소유권자의 권한
r-x 소유그룹의 권한
r-x Other 기타 다른 사람의 권한


r w x (권한은 3비트로 이루어져 있다)
1 0 0 Read
0 1 0 Write
0 0 1 eXecute


권한 변경 방법

$ chmod 644 test.txt 2진수를 10진수로 바꿔 설정한다 (110 100 100, -rw-r--r--)
$ chmod u=w test.txt user에 write만 설정
$ chmod u+s test.txt user execute bit에 특수권한 SetUID 설정
$ chmod u-s test.txt user execute bit에 특수권한 SetUID 삭제
$ chmod o -rwx test.txt other 유저에게 rwx 권한 삭제
$ chmod go+r test.txt group과 other 유저에게 read 권한 부여
$ chmod a+rwx test.txt 모든 유저에게 rwx 권한 부여

a = all, u = user, g = group, o = other, s = set?id (특수권한)
특수 권한에 대한 자세한 설명은 이분이 잘 설명해주심
https://wogh8732.tistory.com/74
참고로 현재 로그인한 계정의 uid, gid 등을 보려면 id 명령어를 쳐보면 된다


Unix 에서는 shell 자체 명령어에 adduser를 갖고있으므로 사용하려면 ./adduser 를 해줘야 한다
whereis adduser adduser 명령어가 존재하는 위치
which adduser 현재 사용자가 사용(리솔빙)하게 되는 adduser의 위치
환경변수는 시스템 환경변수가 아니라면 계정마다 다르다

ex)
sudo ./adduser


이제 매번 경로를 적는 것과 testuser로만 user를 생성할 수는 없으니
환경변수를 설정하고 스크립트 파일에 인자를 추가해줘야 한다



<인자를 이용한 스크립트 파일>



adduser를 사용자 환경변수가 지정된 home/계정/bin 폴더로 넣어주면 경로는 안적어줘도 된다
(home/계정/bin $PATH 우선순위가 가장 높기 때문에 다른 adduser는 실행되지 않는다)
(하지만 sudo를 쓰게 되면 관리자 권한이 되기 때문에 sbin 폴더의 미리 정의된 배치파일인 adduser가 실행된다)
mv ./adduser ~/bin
cd ~/bin; ls


인자를 넣을 수 있도록 파일을 변경
nano adduser

useradd $1
tail -n2 /etc/passwd
mkdir /home/$1
chown $1:$1 /home/$1
echo "$1 user added"

저장


sudo adduser bbb
이렇게 하게 되면 superuser의 adduser를 사용하게 되므로 (sudo which adduser)
sudo /home/계정/bin/adduser bbb
직접만든 adduser 파일의 경로를 명시화한다


제대로 추가되었는지 확인
ls /home



<향상된 사용자 추가방법>



(# 는 superuser, root 권한을 뜻한다)


사용자 추가 옵션들

-c 사용자 설명 설정
-s 기본 쉘 설정
-r UID 설정(500 이하로)
-d 사용자 디렉토리 설정
-g 기본 그룹
-G 추가 그룹

# useradd -d /home/username -s /bin/bash username
# useradd -r number -c "..." -g groupname -G groupname
-d /home/username -s /bin/bash username

# useradd dragon
# passwd dragon


향상된 사용자 추가 명령어

# adduser dragon
# passwd dragon


사용자 제거하기

# userdel -r username
# deluser username


 

 

<링크 파일 만들기>



Symbolic Link 파일과 Hard Link 파일로 만들 수 있다
Symbolic Link 파일은 윈도우로 치면 바로가기 파일이다
Hard Link는 하나의 값을 가진 동일한 메모리 주소를 참조하는 별칭 파일처럼 사용한다
(포인터 같은 녀석임. 그래서 둘 중 하나를 아무거나 지워도 상관없이 데이터는 유지되고 하나를 수정하면 다른쪽도 수정된다)

주로 심볼릭 링크 파일을 많이 만들고 하드 링크는 거의 쓸 일이 없다

(포인터라니 너무 무섭다...)


심볼릭 링크 만드는 법
ln -s test1.txt test1.ln


하드 링크 만드는 법
ln test1.txt testln.txt



<링크 파일 이용해서 실행파일 리졸빙 하는 법>



home/계정/bin (~)계정/bin은 폴더가 없어도 $PATH에 기본 등록되어 있다

계정@ubuntu:~/bin$ ln -s ~/download/jdk1.8.0/bin/java java 심볼릭 링크 파일 생성
계정@ubuntu:~/bin$ ln -s ~/download/jdk1.8.0/bin/javac javac 심볼릭 링크 파일 생성

이제 아무 디렉토리에서나 java -version, 자바컴파일 등의 명령어를 사용할 수 있다

workspace 디렉토리와 java 파일을 만들어 javac hello.java, java hello 명령어를 사용해 테스트 해본다

단 현재 링크파일을 홈계정의 bin 폴더에 넣어놓은 상태이므로 다른 계정은 jdk를 리졸빙 할 수 없다
다른 사용자 계정과 공동으로 사용하려면 window에서 환경변수를 등록했던 것과 같이 사용자 환경변수가 아닌
시스템 환경변수에 등록해줘야 한다



 

 

<jdk 8 다운로드>



웹브라우저가 없으므로 wget 명령어를 사용해서 다운로드 한다
다운로드 원하는 디렉토리로 이동


2020년 9월 19일 기준 Linux용 Java SE Development Kit 8u261 다운로드 명령 (블로그 글 작성 기준 아직 잘 됨)
wget -c --no-cookies --no-check-certificate --header "Cookie: oraclelicense=accept-securebackup-cookie" https://javadl.oracle.com/webapps/download/GetFile/1.8.0_261-b12/a4634525489241b9a9e1aa73d9e118e6/linux-i586/jdk-8u261-linux-x64.tar.gz


안되면 jdk1.8.0 linux용 tar.gz 압축파일 제공하는 곳 찾아서 위 주소 대신 붙여넣으면 된다


<wget: unable to resolve host address 에러시 해결법>

 

    방법1) resolv.conf 에 구글DNS (nameserver 8.8.8.8) 추가

 

cd /                                               최상위 디렉토리로 이동
sudo vi /etc/resolv.conf                resolv.conf 파일 열기
                                                    그 안에 nameserver 127.0.0.53 확인
i                                                    i키 눌러서 insert 모드로 바꾸고
방향키조작                                   nameserver 127.0.0.53 밑에 줄로 이동
nameserver 8.8.8.8                      nameserver 8.8.8.8을 입력하면 8.8.8.8에 보라색글씨 처리됨
esc                                            
:w                                                 저장
:q                                                  나가기

 

    방법2) wget 에 --nocheck-certificate 추가하는 방법


wget --nocheck-certificate url 입력       (인증 확인하지 않고 다운 받겠다는 거임)

다운로드 완료 후 압축해제

tar -zxvf jdk-8u... .tar.gz


기존에 윈도우 cmd에서 사용하는 것처럼 사용하려면 (ex. java -version) 리졸빙 에러가 발생한다
(가장 먼저 본쉘에서 명령어를 찾고, 없으면 환경변수에서 찾고 없으면 리졸빙 에러가 발생)
Linux 환경변수 설정 or 링크파일로 실행파일 리졸빙 or 사용할 때마다 일일히 경로 적어주기 중 하나를 해줘야 한다


환경변수 PATH 보기)
echo $PATH

링크파일로 실행파일 리졸빙 하기)
이미 환경변수 등록이 되어 있는 bin 폴더 같은 곳에 java 또는 javac 사용할 파일 링크파일 만들기
(ex. home/계정/bin/java.ln)   

-그런데 홈디렉토리 안이라 계정 소유자만 쓸 수 있다

-시스템 환경변수를 해주려면 홈디렉토리 말고 시스템 디렉토리쪽 /bin에 넣고 써야한다

사용할 때마다 앞에 경로 적어주기)
jdk 압축 푼 bin 디렉토리$ ./java -version


 

 

<파일 압축 관리>



파일 압축 방법 : tar (Tape ARchive) + zip

 

압축하기
tar -cf name.tar a b c 파일 tar로 묶기
tar -zcf name.tar.gz a b c 파일 gz확장자로 압축하기

 

압축풀기
tar -xvf name.tar 파일 풀기
tar -zxvf name.tar.gz 파일 압축해제



명령어 옵션
-f 파일 이름을 지정
-c 파일을 tar로 묶음
-x tar 압축을 풂
-v 내용을 자세히 출력
-z gzip으로 압축하거나 해제함
-t 목록 출력
-p 파일 권한을 저장
-C 경로를 지정



ex)

tar -cf test.tar * 현재 디렉토리의 모든 파일 묶기
tar -cf test.tar H*.java 현재 디렉토리의 H로 시작하는 모든 java파일 묶기
tar -zcf test.tar.gz * 현재 디렉토리의 모든 파일 압축
tar -zxvf test.tar.gz test.tar.gz 압축 해제하면서 내용 출력

 


tar는 압축을 하지 않고 묶기만 할 시 파일사이즈가 오히려 커진다
때문에 -z 옵션은 기본으로 가지고 간다



<유용한 명령어>



history, piping, redirect, grep, more, less

 

history)

history 현재까지 사용한 명령어 인덱스 목록화 출력
!인덱스번호 해당 인덱스 번호의 명령어 재사용
(화살표 위키와 아래키를 자주 사용해서 그리 자주 쓰진 않음)


redirect)

redirect 파일로 출력하는 명령어 ( >, >> 로 사용한다 )
history > test history 내역을 test 파일로 만든다
echo "hello" > test 문자열 hello를 출력하지 않고 test 파일로 만든다
echo "okay" >> test test 파일 속 문자열 hello 뒤에 okay 문자열을 추가한다
(echo는 뒤에오는 명령어를 콘솔창에 바로 출력해주는 명령어)

 

piping)

piping 실행결과를 전달하는 명령어 ( | 로 사용한다 )
cat test | grep he test를 출력하는 내용을 출력하지 않고 입력에 넣어 he 문자를 찾는다
ls -l | less 리스트를 전달해 less 목록으로 띄운다 (화살표로 이동가능)
ls -l | more 리스트를 전달해 more 목록으로 띄운다 (Q를 눌러 빠져나올 수 있다)
cat test | sort -r test의 내용을 역정렬해서 출력
cat test | sort -r | grep el 여러번 사용 가능

 

시퀀셜 커맨드 사용하기)

touch test1; echo "okay~" >> test1; cat test1 명령어 한줄로 여러 명령어 실행하기 ( ; 로 나누어 사용 )
test1 파일 생성 후 okay~ 문자열을 test1 파일에 추가하고 test1의 내용을 출력


 

 

 

<파일 찾기와 파일 정보 확인>



find, file, cmp, cat, head, tail, whic

 

find)

find ./ -name *.java 현재 디렉토리에서 이름으로 java 확장자인 파일들 찾기
find . -name *.java -size +1c 현재 디렉토리에서 java 확장자이고 1바이트 이상인 파일들 찾기 (/생략가능)
man find (도움말)

 

cat)

 cat hello.java  hello.java 파일 미리보기

 

head)

 head -n2 hello.java  hello.java 파일 앞 2줄 미리 보기

 

tail)

 tail -n2 hello.java  hello.java 파일 뒤 2줄 미리 보기

 

grep)

grep class hello.java hello.java에서 class 문자가 포함된 줄 찾기
grep "Hello Li" hello.java 띄어쓰기 등이 포함되어 있을 때는 큰따옴표로 감싸줌
grep -i "hello Li" hello.java -ignore 옵션 (소대문자 구분없이 찾기)
grep --help (도움말)

 

ls ?[])

ls hello?.java 앞에 hello가 붙는 java 파일 찾기
ls hello[12].java hello1, hello2 java 파일 찾기
(정규식 사용하는 것처럼 찾을 수 있다)

 

cmp)

cmp hello.java hello1.java hello.java와 hello1.java의 차이점 찾기
>> hello.java hello1.java differ: byte 97, line 3

 

diff)

diff hello.java hello1.java hello.java와 hello1.java의 차이점 찾기
>> 3c3
< System.out.println("hello linus");
---
> System.out.println("hello linus1");

 

file)

file hello hello의 파일 정보 확인
>> hello: C++ source, ASDCII text



 

 

<파일 편집 및 관리>



어차피 IDE 환경에서 개발하니 굳이 쓸 필요는 없지만 linux 원격 서버환경에서 간단한 외부 설정파일을 편집해야 하는 경우 조금 알아두면 좋음

 

파일 편집기 종류)

VI GNU nano Emacs ed/ex

 

 

 

VI 기본 편집기 (메모장)

 

 

실행 명령어
vi hello.java

 

 

커서 조작 (명령 대기 상태)
H 왼쪽으로 이동
J 아래쪽으로 이동
K 위쪽으로 이동
L 오른쪽으로 이동

 

편집 모드 진입 (명령 대기 상태)
i 편집 모드 진입
a 커서 위치 새로운 라인에서 편집 모드를 시작한다
o 커서의 현재 위치 바로 뒤에서 편집 모드를 시작한다

 

복붙 기능 (명령 대기 상태)
yy 커서 위치의 한 줄 복사
yw 커서 위치의 단어 복사
yl 커서 위치의 문자 복사

 

저장 및 종료 (명령 대기 상태)
:w 저장
:q 종료
:wq 저장하고 종료

 

esc 키를 통해 편집을 마치고 명령 대기 상태로 이동할 수 있다




GNU nano 기본 편집기2

 

 

실행 명령어
nano hello.java
editor hello.java



사용 명령어들은 직관적으로 편집기 하단에 전부 나온다
^ 는 CTRL 키 (^G는 컨트롤+G)
M- 는 ALT 키
(help 메뉴에 가보면 설명 다 적혀있음)

 

사용 도중에 명령프롬프트 창으로 나가고 싶다면 CTRL+Z

다시 편집기로 돌아가고 싶다면 fg 1 명령어를 쳐주면 된다

+ Recent posts