Linux commands
pwd : print working directory
/ : root directory
~ : home directory
cd : change directory
–help : simple manual
ㅁman command : manual
ls -l : list in long format
touch L make empty file
.filename : hidden files
ls -a : show all files // 히든파일 조회가능
ls -al
mkdir : make directory
./ : current directory
mv : move(rename)
rm -r : remove directory // -r은 recursive라는 뜻응로 내부 directory까지
../ : parent directory
mkdir dummy; cd dummy; touch hello.txt; cd ..; ls -R // 순차실행
mkdir dummy && cd dummy && touch hello.txt && cd ..&& ls -R // 실패하면 멈추기
htop (메모리 하드 등등
top은 기본설치되어있는데 윈도우의 작업관리자같은걸로 프로세스 사용량등을 파악할 수있다.
htop은 더 좋은거
vmstat (가상메모리 조회?)
apt-get이나 yum등의 패키지 매니저를 통해 받을 수 있다.앱스토어같은거다
apt-get update
등을 통해 목록을 업데이트받을 수 있다.
맥에서는 homebrew를 통해 가능
기본중에 기본이지만 빠진것도 있었다.그리고 이런 명령어들으이 표준도 posix인줄 몰랐다. std lib의 표준인줄
근데 이런 명령어 하나하나도 프로그램이다. 명령인자로main의 arg가 되는
mkdir -p dir1/dir2/dir3
man보면 다 나오지만 이렇게 중간에dir2가 없다던지해도 -p로 하면 다 생성해준다(–parent)
man [커맨드]
커맨드에 대한 매뉴얼이 출력되며 방향키로 위아래로 움직일 수 있고
이상태에서 슬러쉬(/)를 누르고 키워드를 쓰면 검색이 된다 /mode
그 상태에서 n키로 다음으로 넘어갈 수 있으며,
q키로는man을 빠져나갈 수잇다
wget -o [저장할 파일명] [url]
wget으로는 cli환경에서 다운을 받을 수 있다. 소셜네트워크 오프닝에서도 나온다.
파이프라인
하나의 프로세스의 결과를 다른 프로세스의 인풋으로 받아서 계속 연결시키는것
cat [파일내용]
파일내용을 출력
grep => grep은 어떤 특정한 정보에서 원하는 정보가 포함된 행을 출력하는 명령어
ls –help | grep sort |
ls –help의 출력결과를 파이프( | )로 연결해서 grep의 인풋으로 넘겨주고 grep은 sort가 포함된 행을 출력한다. |
ps aux
실행중인 프로세스 출력
https://opentutorials.org/course/2598/14199
IO Redirection - 생활코딩
IO Redirection 2016-11-26 10:35:24 강의 output input 안 중요한 이야기들 댓글을 작성하려면 로그인하셔야 합니다. spidoid 2개월 전 outptut 영상에서 나온 참고 사이트 주소입니다. Lecture 6 - shell scripting http://slideplayer.com……304 J 3개월 전 08.21.20 완료 홍주호 6개월 전 20.5.31 복습 홍주호 7개월 전 20.5.22 완료 개발벌레 7개월 전 언제 한 번 써 봐야겠네요. 뎨르릅 10개월 전 목소리 왤케 친절하십…
opentutorials.org
생활코딩 IO redirection부터 안봣음
awk, sed, lsof, curl, less, find, kill 등도 정리해야함
io redirection
ls -al > output.txt
기본적으로 stdout 또는 에러메시지의 경우 stderr로 출력이 되지만 >를 통해 출력의 방향을 리다이렉션 할수 있다.
위의 경우 파일에 출력
출력스트림번호> 가 기본 형식인데 생략시 1번이다. 즉 1> 이건데 생략하고 >로 쓸수있고 1은 stdout이다.
에러 출력시에는
ls -al 2> output.txt
이런식으로 사용해야 한다.
rm aa.txt 1> result.txt 2> error.log
이렇게 출력스트림을 여러개 지정할수도 있다. 에러가 출력된다면(aa.txt가 없다던지) error.log 파일에 출력될거시앋.
cat
aa
aa
bbb
bbb
이렇게 cat 뒤에 아무 인자도 주지않으면 키보드 인풋을 받아서 엔터를 치면 그대로 다시 출력이 된다.(stdin)
cat < hello.txt
사실 cat의경우 <를 생략해도 똑같이 동작하지만, 아무튼 이런식으로 input redirection도 가능하다.
head -n1 < linux.txt > out.txt
이렇게 i/o를 동시에 지정할수도 있다. linux.txt의 첫줄이 out.txt에 출력될것이다. 참고로 -n1은 첫 한줄만 출력하는 옵션이다.
입출력을 할때 그 장소에 이미 내용이 있을때 redirection은 기본적으로 덮어쓰기인데 append를 하고싶다면 »이나 «를 쓴다.
ls -al » output.txt
이렇게 쓰면 기존에 output.txt에 내용이 있을때 내용이 append된다.
cat « hello.txt « aa.txt
이렇게 여러 인풋을 이어서 append할수도 잇따.
ps aux
ps는 프로세스를 보는 커맨드이고 aux로 모두 다 볼 수 있따.
ps aux | grep apache
이렇게 파이프를 통해 원하는 프로세스를 확인할 수 있고,
sudo kill 1599
이런식으로 표시된 pid를 적어서 프로그램을 킬할수도 있다.
아무 경로에서나 ls와 같이 명령을 실행할 수 있는 것은 환경변수때문이다(윈도우랑 마찬가지)
$PATH에 환경변수들이 저장되어 있으며
echo $PATH
로 확인가능
whereis 위치표시
find 실제 디렉토리를 찾아서 실제검색
locate 인덱싱같은게 되어있어서 정리된정보에서 빠르게 검색(부정확가능 => 더찾아보기)
help find | head |
이렇게도 파이프로 사용가능
ctrl + z로 현재 프로세스를 백그라운드로 보낼 수 있따.
jobs명령으로 백그라운드 프로세스를 확인할 수 있고 거기 번호대로
fg %3이런식으로 3번 백그라운드로 돌아갈 수 있고
fg만하면 스택에서 제일 높은애로 복귀한다.
kill %3도 가능하고
어떤 명령
ls -alR > result.txt &
이런식으로 마지막에 앤퍼센트를 붙이면 바로 백그라운드로 실행한다.
daemon 백그라운드에서 항상 실행되어있는 프로그램
/etc/init.d에 데몬 프고글매들 이 있ㅇ므ㅕ
실행은
sudo service 이름 start / stop으로 중지
데몬은 부팅시 바로 실행되야한느 경우가 많은데 설정법은
/etc/rc3.d(cui)
/etc/rc5.d(gui)에 링크(바로가기)를 추가해서 설정한다.
링크의 예는 S02Apache2
여기서 02는 우선순위이다
crontab -e로 에디터에 추가해서 주기적으로 실행하는 프로세스를 추가할 수 잇다.
ex
1/* * * * * * * date » date.log 2>&1
는 append이며, 2>&1은 에러 출력을 표준출력으로 리다이렉트한다는 의미
tail -f date.log
=>계속 실행되있으면서 data.log에변화가 있으면 출력됨. 실시간 로그확인용
크론의 활용예로
서버에서는 응답을 바로주고 실제 처리는 모아서 주기적으로 한다던지 이런것이 가능하다.
shell실행시 자동실행
~ 경로에서 bashrc에 쉘스크립트 추가
(ex) alias c=’clear’
alias는 재부팅시 리셋되므로 설정하면 편하다.
id
나는 누구인가?
who
이 컴퓨터에는 누구누구가 접속해 있는가?
일반유저
develup4@ubuntu:(물결)$ 달러로 표시
슈퍼유저
root@ubuntu:-# 샾으로 표시
su
슈퍼유저로 로그인
sudo passwd -u root
-u는 unlock의 의미이다. 비밀번호 재설정.
슈퍼유저의 홈디렉토리
/root
일본유저
/home/{user}
sudo useradd -m {username}
유저추가
sudo usermod -a -G sudo {username}
유저를 sudo group에 넣는다. 즉 sudo사용이가능한 계정으로 만든다.
chmod u+r perm.txt
유저에게 리드 권한 부여
chmod 777 perm.txt
숫자로보통 표현한다(유저, 그룹, other)
ip addr
공인아이피 주소 확인
ipinfo.io/ip
아이피주소를 확인해볼 수 있는 사이트
grep
awk
sed
lsof
curl
wget
tail
head
less
find
ssh
kill
sort
uniq
cat
cut
echo funt
tr
nl
egrep
fgrep
wc
ps
top
htop
atop
nmap
tcpdump
ping
mtr
traceroute
dig
airmon
airodump
iptables
netstat
nmon
iostat
sar
vmstat
strace
dtrace
systemtap
uname
df
history
쉘스크립트 강의 ——
내장명령은 help를 통해 목록을 알수 있다
man이나 명렁어 뒤에 —help를통해 사용법 알수있음
=> which 명령어를 통해 위치를 알 수 있다.
외부명령(파일(싫행프로그램)로 존재하는 명령)
=> type 명령어를 통해 위치를 알 수 있다.
man -k open
=> open문자열이 포함된 모든 명령 표시
man 2 open
=> 2는 시스템콜을 의미한다. 시스템콜 open에대한 도움말 표시
ls [다른경로]
=> 이동없이 다른 디렉토리의 목록 볼 수 있음
ls -d /usr
=> usr의 목록이 아니라 usr 디렉토리 자체에 대한 정보가 표시된다.
ls-R /usr
=> 내부목록까지 최대한 다 보여준다 리커시브
cd -
=> 이전 디렉토리로 이동
mkdir aa/bb
=> aa디렉토리가 없으면 실행못함
mkdir -p aa/bb
=> aa가 없으면 생성해서 bb생성
file [경로]
=> 파일에 대한 정보를 얻을 수 있따
/etc/issue: ASCII text
touch => 빈파일을 만들거나 수정시간을 업데이트
ln -s [파일이름] [별명]
=> 심볼릭링크 생성(바로가기같은거)
ll로 표시해보면
lrwxrwxrwx => 앞에 l이붙는다
이름이 긴경우에 유용하다
echo “Hello linux” > hello.c
에코는 문자열을 출력하는건데 리다이렉션으로 파일로 보냈다
cp -i hello.c hello_1.c
-i 옵션을 쓰면 기존 파일이 있을때 덮어쓸지 물어보므로 중요한 경우 옵션을 붙이자
cp file1 file2 dest/
여러개 파일도 가능하다 마지막만 경로
cp -f
덮어쓸 권한없을때 지우고 다시 만드는거 가능
cp -r 경로 경로
디렉토리안 하위디렉토리까지 통으로 복사
루트 디렉토리 아래에는 어떤 디렉토리가 있을까?
/bin 기본적인 바이너리 파일용 디렉토리(중요) p4v처럼 응용프로그램
/dev I/O 동작을 위한 디바이스 파일용 디렉토리
/etc. 시스템 관련된 설정파일용 디렉토리(중요)
/home. 사용자 계정의 홈 디렉토리(중요)
/lib. 런타임시 사용하는 공유 라이브러리 디렉토리
/mnt. 외부장치 등 마운트 시 사용하는 디렉토리
/opt. (operation)외부응용 프로그램 설치 디렉토리
/proc. proc 파일 시스템 마운트용 디렉토리
/sbin. 시스템 관련 필수 바이너리 파일용 디렉토리(중요) 시스템관련 명령들
/sys. sysfs마운트용 디렉토리
/usr. 기타 유틸리티, 응용프로그램, 라이브러리 설치 디렉토리
/etc/passwd 파일
단 패스워드는 별도로 암호화되어 /etc/shadow, /etc/gshadow에 저장된다.
/etc/group 파일
cat 파일명
=> 출력
너무 길면 보기힘들다
more 파일명
=> 한페이지씩 보기
less 파일명
=> more랑비슷한데 기능이 좀 더 추가된거ㅏ
head -6 file명
6줄보기
chown root hello.c
소유자 변경
chgrp group11 hello.c
umask
마스크 보기
umask 444
기본권한 설정(파일생성시 기본)
=> 계정별로 설정하는것이므로 다른계정이면 다를수있음
grep
=> 내용중에서 찾는거
grep -v 키워드
반대로 키워드 포함하지 않는 줄들을 표시
grep -i 키워드
대소문자 구분안함
grep -w 정확하게 일치하는것만 검색
grep -c
개수세기
grep -n
라인까지 출력
grep -r root /etc/*
하위 디렉토리까지 다 검색(-r 없으면 /etc에서만 검색)
와일드카드
ls /etc/sy*
sy로 시작하는 모든거 출력
*.conf
ls /etc/n??t
ls /etc/ss[a-Z]
파이프로 연결
(앞 명령의 결과를 뒷 명령의 입력으로 넘겨주는것)
cat /etc/passwd | grep sys | grep -v run
sys는 포함하고 run은 포함하지 않는것들 출력
/etc 아래 권한 0755인 디렉토리 검색
ls -l etc | grep drwxr-xr-x
id
자기 자신 계정을 확인
id [계정명]
그 계정을 확인
sudo useradd 유저명
sudo groupadd 그룹명
sudo password 유저명-> 유저 비번변경
sudo gpasswd 그룹이름 => 그룹비번변경
sudo userdel 유저명
그룹은 /etc/group에 저장
UID 사용자 아이디 PID 프로세스 아이디 PPID 부모프로세스 아이디
프로세스 상태 확인
ps ax => STAT 컬럼에 상태가 나온다
R - 실행중이거나 실행대기중
S- 이벤트를 기다리는 중
Z - 좀비상태
top -b
프로세스 정보를 실시간으로 확인
tar 옵션
c 생성
x해제
v동작과정출력
z gzip형식
f 이름지정
j bzip2형식
find [검색위치] [옵션] [패턴] : 파일을 검색하는 명령어 일부만 알아도 된다.
sort 파일이름
명령 | sort
ls -R /etc | sort |
ls -R /etc | uniq
중복된 행 제거
텍스트조작
명령 | tr -d 제거문자
echo “abcde” | tr -d cd
명령 | tr 대상문자 변경문자
echo “abcde” | tr A-Z a-z
소문자로 변경
wc 파일이름
파일내의 행, 단어, 바이트수 출력
/etc에서 사이즈가 512바이트를 초과하는 파일의 수를 출력하라
sudo find /etc -size +512c | wc -l
리눅스는 모든 장치를 파일로 인식한다
장치를 /의 하위 디렉토리로 붙이는 작업을 마운트라고 한다
마운트된 파일시스템의 정보 확인
df
언마운트
sudo umount 장치이름
vi 에디터
노멀모드 -> i, a, o -> Insert모드 (종료는 esc)
노멀모드 -> :, /, ? -> Command모드(종료는 esc)
커맨드모드에서 :wq, :q!
/pattern(패턴찾기)
본격 쉘스크립트
#!/bin/bash
스크립트를 실행할 쉘을 고르는 문장
set -x # 디버깅모드 시작(실행할때마다 스크립트문장을 출력해줌)
set +x # 디버깅모드 해제
변수=값
echo $변수 # 이런식으로 사용
echo ${변수} # 이게 더 표준적인 방법
# 특수 변수
$# # 전달된 옵션과 인자의 개수(ex)./test.sh 1 2 3이면 3출력
$0, $1 # n번째 인자
$$ # 현재 프로세스의 아이디
$? 직전명령의 리턴값. 대부분 성공시 0이다.
₩는 이스케이프 문자라고 하며 특수의미를 갖는 문자를일반문자로 해석되도록 한다.
" " 특수문자를 해석하는 문자열
‘ ‘ 특수묹다를 해석하지않아 그냥 그대로 문자로 취급하는 문자열
` ` 명령의 결과로 인식 (ex) $`date +%F` => $ 2019-04-11
이런 quotes를 사용하는 이유는 공백등으로 하나의 청크가 여러개의 청크로 인식되지 않도록하기 위해서
rmdir "my folder"
rmdier ‘$dir’ # 진짜 이름이 $dir인 디렉토리를 삭제하겠다는 의미
지역변수는 현재 쉘에서 만든 변수를 의미하여, 해당 쉘만 사용할 수 있다.
환경변수는 변수이름앞에 export를 붙여 만든 변수로 자식쉘도 사용할 수 잇다.
$ set 모든변수와함수출력
$ env 환경변수만 출력
주요 환경변수
HOME 현재사용자홈디렉토리
PATH 실행할 명령을 찾을 디렉토리 목록
USER 사용자의 이름
HOSTNAME 시스템의 이름
PWD 현재디렉터리
RANDOM 16비트 난수
UID 현재사용자아이디
PPID 부모의 프로세스 아이디
$ source 실행파일
스크립트가 현재 쉘에서 실행된다
var=5
let var++
echo $var
6
declare -i ivar="123"
변수 타입도 존재한다 예를들어 -i는 정수형이라서
"123"이 아니라
123이 저장된다
readonly rovar="asdfsdf"
상수
배열도 가능하다
avar1=("data1" "data2")
echo ${avar1[0]}
data1
echo ${avar1[*]}
data1 data2
쉘의 명령처리 과정
- 토큰분리(공백기준)
- 명령 전처리(alias, keyword, meta문자, ₩, !를 이용한 명령 히스토리 처리
- 확장 및 치환 : 변수, 산술확장, 명령치화느 단어분리 등
- quotes 삭제
=> 명령문으로 변환
프로세스를 생성하고 exec시스템콜 함수에 인수를 전달하여 명령실행
리눅스의 파일이름은 NUL과 /를 제외하고 모두 허용된다.
. .. [ { ( 등의 특수문자도 파일명이 될수있음을 주의
=> 대입을 제외하고는 모두 공백을 넣어서 오해의 소지를 없애자
alias : 별명으로 지정된 명령
$ alias mydate=‘date “+%Y-%m-%d %H:%M:%S”’
keyword : 쉘이 쓰는 예약어
메타문자 : 특별한 의미를 갖는건데 명령마다 다름
; => 한줄에 여러 명령
& 명령을 백그라운드에서 실행
$ cat > a.txt&
&& 앞 명령이 성공일때 뒤 명령 실행
이름 중복시 우선순위
알리아스 > 키워드 > 함수 > 빌트인 > 외부명령
shell script에서는 기본적으로 alias가적용되지 않기때문에
shopt -s expand_aliases
요거를 붙여야 실행된다.’’
brace expression
$echo {1..5}
1 2 3 4 5
$echo img{001..120}.png
$mkdir /home/user/{dir1, dir2, dir3}
3개 만들어짐
parameter expansion
${#NAME} NAME에저장된 문자열의 길이
${NAME:-STR} NAME이 NULL이면 STR을 아니면 NAME을 선택
${NAME:+STR} NAME이 NULL이면 NULL을 아니면 STR을 선택
${NAME:=STR} NAME이 NULL이면 생성 후 STR대입
${NAME:OFFSET} OFFSET위치부터 모든 문자를 선택, 맨앞이 0번
${NAME/PATTERN/STR} 처음나오는 PATTERN을 STR로 교체
서브쉘과 블록
서브쉘() : 서브쉘에서 사용한 변수는 외부에 영향없고 exit명령은 서브쉘 종료만 한다
echo $(ls /etc | grep conf)
블록{} : 변수가 외부에 영향을 주고 exit는스크립트를 종료한다
test 명령
같은 표현으로 대괄호
[ 표현식 ] # 공백있어야함
참이 0 거짓이 1…
[ $var -gt 5- ] && echo $?
&&를 통해 조건에 따라 실행하도록 구현할 수 있다.
[ abc ]
안에 뭐라도 있으면 일단 참이다 의미없어도
[ ]
아무것도 없으면 1 거짓
if문 자체가 아니고 if문의 조건식으로 테스트를 많이 쓴다
let 명령
수식연산을 수행해서 결과가 0이면 1 아니면 0을 반환
let var=10
(( )) let명령과 동일
if [ $USER = “root” ]
then
blah
else
blah
fi
if [ codition ]; then
blah
뭐…반복문도 가능하다
for문
for num in 1 2 4
do
echo $num
done
while [ count -lt 5 ]
do
let count++
done
select문으로 메뉴를 쉽게 만들수 있다
select NAME(선택된 항목 저장) in LIST(메뉴로 표시될 목록); do COMMANDS(항목이 선태ㅑㄱ 이후 실행될 명령); done
select CMD in ls vi sed
do
echo "You selected $CMD"
done
실제표시되는 모습
1) ls
2) vi
3) sed
#? 1
You selected ls (1)
\
function FUNC() { COMMANDS; }
RET=
max()
{
if [ $1 -gt $2 ]
RET=$1
}
$1, $2 는 인수이다. 순서대로