Linux Basic
Introduction
About
This repository introduces a basic concept and commands of Linux.
Linux main directory
- boot : necessarry file for start up system like Linux kernel
- bin : command for general users
- dev : device files
- etc : system setting files
- home : home directory for users
- lib : library
- media : mount point for outer media
- proc : process information of system
- root : home directory for root users
- sbin : commands for system admin users
- tmp : temporary files
- usr : programs, libraries, documents, etc.
- var : frequently updated files like log files
Command Lists
File
# cd
$ cd #changes directory to home
$ cd - #goes back to previous files
# less
$ less test.md
# f/b : show next/previous page
# q : quits
# = : show file name and current line number
# / : search in forward order
# ? : search in backward order
# v : launch vi editor
#head/tail
$ head -5 test.md # shows 5 heading lines of test.md
$ tail -3 test.md # shows 3 bottom lines of test.md
#copy
$ cp -i test.md tmp # overwrites with confirmation
$ cp -i test.md tmp # overwrites without confirmation
$ cp -r tmp tmp2 # copy directory
# move/rename
$ mv -i data.txt tmp # overwrites with confirmation
$ mv -f data.txt tmp # overwrites without confirmation
$ mv tmpdir mydir # -r is not necessary for moving directory like `rm` or `cp` commands
# remove
$ rm -i data.txt # removes with confirmation
$ rm -f data.txt # removes without confirmation
$ rm -r tmp # removes directory(even when the directory is NOT empty)
$ rm -R tmp # removes directory(same with -r option)
$ rmdir tmp # `rmdir` also removes EMPTY files
# create directory
$ mkdir -p tmp/tmp2 # parents directory will be also created
$ mkdir -m 705 mydir # creates directory with set permissions
Count / Sort
# count
$ ls -l | wc # shows bytes/lines/words count
$ wc -c count.txt # shows only bytes count
$ wc -l count.txt # shows only lines count
$ wc -w count.txt # shows only words count
# sort
$ ls -l | sort # sorts by alphabetic order
$ ls -l | sort -b # sorts ignoring spaces in the opening sentence
$ ls -l | sort -f # sorts ignoring Small/Capital
$ ls -l | sort -r # sorts in reverse way
$ ls -l | sort -n # sorts number not as a string but as a number
Search
Locate
# `locate` commands search based on database
# therefore it is faster than `find` command
$ locate sort
# to update database
# * this is usually executed regularly
$ updatedb
Find
Option
# `maxdepth` otption defines the depth of search target
$ find . -name "README.md" -maxdepth 1
Condition
# Basic
# find [targetDirectory] [option]
# By name
$ find . -name "README.md"
# By size
$ find . -size 1k # file size = 1k byte
$ find . -size +100c # file size > 100 byte
$ find . -size +1k # file size > 1k byte
$ find . -size -100c # file size < 100 byte
$ find . -size -1k # file size < 1k byte
# By types
$ find . -type f # files
$ find . -type d # directories
$ find . -type l # symlinks
# By modified time
$ find . -mtime -1 # files modified in a day
$ find . -mmin -60 # files modified in last 60 mitnues
$ find . -mtime 7 # files which have not modified over a week
$ find . -mmin 60 # files which have not modified over an hour
# By accessed time
$ find . -atime -1 # files accessed in a day
$ find . -amin -60 # files accessed in last 60 minutes
$ find . -atime 7 # files which have not accessed over a week
$ find . -amin 60 # files which have not accessed over an hour
# By permission
$ find . -perm a+r # all read-permission is allowed
$ find . -perm 644 # permission code is 644
$ find . -perm -444 # read-permission is allowed for all users
$ find . -perm +444 # read-permission is allowed for one of owner, owner group or other users
# By users
$ find . -user david # files owned by david
$ find . -uid XXXXXX # files owned by declared uid
# By regexp
# @see http://www.gnu.org/software/findutils/manual/html_mono/find.html#Regular-Expressions
$ find . regex ".*git*"
Action
# print
$ find . -name "*git*" # shows matched files(default)
$ find . -name "*git*" -print # shows matched files(default)
$ find . -name "*git*" -ls # shows file's information also
# `-exec` enables you to execute command to the result
$ find . -name "README.md" -exec rm {} ¥; # without confirmation
$ find . -name "README.md" -ok rm {} ¥; # with confirmation
Example
# finds files updated within a day
$ find . -type f -mtime -1
# finds files updated within past 30 minutes
$ find . -type f -mmin -60
# find and delete files which have not been accessed in 200 days
$ find . -atime +200 -exec rm {} ¥;
Zip
#############
# gzip
#############
# zip file
$ cal > cal.txt
$ gzip cal.txt # this creates cal.txt.gz but cal.txt would be deleted
$ gzip -c cal.txt > cal.txt.gz # if original files should not be deleted
# zip directory
$ mkdir tmp
$ cp cal.txt tmp
$ gzip -r tmp # be sure that `gzip -r` will not zip directory itself
# let's see how different
$ ls -l # see the difference of sizes
$ cat cal.txt # you can see the calander
$ cat cal.txt.gp # but this shows misterious results
# unzip
$ gzip -d cal.txt.gp # unzip file
$ gzip -dr tmp # unzip files in tmp directory
$ gunzip cal.txt.gp # equals with `gzip -d` command
#############
# bzip2
#############
$ bzip2 sample.dat # this creates sample.dat.bz2
$ bzip2 -d sample.dat.bz2 # unzip
#############
# tar (and then gzip)
#############
# tar [options] archivefile.tar targetDirectory
#
# options
# -c : creates archive
# -x : unzip archive
# -t : show files in archived file
# -f : select archive file by file name
# -r : add files to archived file
# -v : show info in details
# -z : gzip
# -j : bzip2
# example
$ mkdir tmp
$ ls -l > tmp/ls.txt
$ cal > tmp/cal.txt
# creates archived files
$ tar cvf tmp.tar tmp # just archived and not compressed
$ tar cvfz tmp.tar.gz tmp # archived and compressed with gzip
$ tar cvfj tmp.tar.bz2 tmp # archived and compressed with bzip2
# see the dirrerences
$ ls -l
gzip vs bzip2 vs tar?
gzip/bzip2 vs tar?
tar isnt a compression format - its a way to combine multiple files into one file.
bz2 and gz are compression formats - variations on a theme - similar compression ratio's I think. The default archive manager with ubuntu can open most if not all of these type of files.
Then gzip vs bzip2?
bz2 generally compresses better than gz, but is slower. gz is the de facto standard because it is older, and bz2 is not avaialble by default on some OSes (that's why you mostly find .gz files).
@see
- http://ubuntuforums.org/showthread.php?t=1538026
Hard link / Symbolic link
# shows hardlinks
$ ls -i1 # with `-i` options, `ls` shows index node(i node)
# creates hard links
$ touch test.txt # creates test.txt
$ ln test.txt test.hard # creates hardlink of test.txt
$ ls -i1 # check that i node of test.txt equals with test.hard
# creates symbol links
$ touch symbol.txt
$ ln -s symbol.txt symbol.sym
$ ls -i1
# let's have a look at the differene between hard and symbol
$ touch {hard,symbol}.txt # creates hard.txt and symbol.txt
$ ln hard.txt hard.hard # creates hard link
$ ln -s symbol.txt symbol.sym # creates symbol link
$ rm {hard,symbol}.txt # removes original .txt files
$ cat hard.hard # see how it works
$ cat symbol.sym # see how it works
Hardlink vs Symlink?
A hardlink isn't a pointer to a file, it's a directory entry (a file) pointing to the same inode. Even if you change the name of the other file, a hardlink still points to the file...
On the other hand, a symlink is actually pointing to another path (a file name); it resolves the name of the file each time you access it through the symlink.
@see
- http://askubuntu.com/questions/108771/what-is-the-difference-between-a-hard-link-and-a-symbolic-link
- http://stackoverflow.com/questions/185899/what-is-the-difference-between-a-symbolic-link-and-a-hard-link
Redirect
# redirect result
$ ls > redirect.txt # the result of `ls` command would be written to redirect2.txt
$ cat redirect.txt
$ ls -i1 >> redirect.txt # adds the result to the existing file
# redirect error
$ ls -222 2> error.txt # 2> writes error log
$ ls -333 2>> error.txt # 2>> adds error log to the existing file
# redirect both result and error
# . = current file
# aaa = not-existring file
$ ls . aaa > ls.log 2>&1 # wrtites both the result and error log
# tips
# by combining `cat` and redirect, you can join the result of
# multiple files contents
$ cat apple.txt banana.txt > banapple.txt
# input redirect
# `tr a-z A-Z` replaces all small caps to Capital caps, but
# this command cannot have file as an argument.
# By usring input `<`, a content of file can be sent to commands.
$ tr a-z A-Z < error.txt
Pipe
$ ls -l > ls.txt
$ tr a-z A-Z < ls.txt
# By using pipe, above process can be written in one line
$ ls -l | tr a-z A-Z
# If you want to send the result both to a file and other command
# then use `tee`
$ ls -l | tee result.log | less
User
#############
# basic
#############
# shows all users
$ id
# shows all groups
$ groups
# see User Database
$ less /etc/passwd
# see Group Database
$ less /etc/group
# adds user
$ useradd david
$ useradd -u 1000 david # with udi
$ useradd -d /home/dev # with custome home directory path
# changes password
$ passwd david
# deletes user
$ userdel david
$ userdel -r david # deletes with home directory
# adds group
$ groupadd designer
# deletes group
$ groupdel designer
#############
# usermod
#############
# locks user
# (when users would not be used for a long time)
$ usermod -L david
# unlocks user
$ usermod -U david
# changes primary group
$ usermod -g develop david
# changes sub group
$ usermod -G develop david
# changes uid
$ usermod -u 1000 david
# changes home directory path
$ usermod -d /home/dev/ david
Permission
Owner (user/group)
# changes owner
$ chown alice sample
$ chown -R alice sample # changes all files in the directory
# changes group
$ chgrp develp tmp
$ chgrop -R develop tmp
# changes owner and group at the same time
$ chown alice:develop tmp
Accessible Types
- Permission
- r: read(4)
- w: write(2)
- x: execute(1)
- Target Segment
- owner
- group to which the owner belongs
- other users
- Permission Counters
- 7 : 4 + 2 + 1 = r + w + x
- 5 : 4 + 0 + 1 = r + x
- 4 : 4 + 0 + 0 + r
$ touch sample.txt
$ ls -l sample.txt
-rw-r--r-- 1 username group 0 1 10 10:11 sample.txt
# user = can read and write
# group = can read only
# others = can read only
# changes permission of sample.txt
$ chmod 755 sample.txt
$ ls -l sample.txt
-rwxr-xr-x 1 username group 0 1 10 10:11 sample.txt
# other options
# - target : u, g, o
# - control : +, -, =
# - type : r, w, x
#
$ chmod ug+rx sample.txt
$ ls -l sample.txt
-rwxr--r-- 1 username group 0 1 10 10:11 sample.txt
root
# changes user to root user
$ su - # you need `-` option to use some restricted commands
$ exit
Shell
Here, we mainly use bash
as an example.
Basic Usage
# shows all shells list which you can use
$ cat /etc/shells
/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
# shows PATH
$ echo $PATH
# `;`
# commands would be continually executed
$ git init; git add -A; git commit -m "first commit"
# `&&`
# means "AND"
$ touch README.md && git add README.md
# `||`
# means "OR"
$ cd /tmp || echo "there is no such directory"
# shows executed commands history
$ history
$ history -c # deletes history
$ history 5 # shows the 5 latest history
$ echo $HISTSIZE # shows the size of saved history
$ !cat # executes the latest command begin with `cat`
$ !732 # executes the history with the number
$ !! # executes the last command in history
$ !-3 # executes the 3 before command in history
$ ^cat^ls # executes the latest command, after replacing `ls` command with `cat`
Keyboard Shortcuts
There are some userful keyboard shortcut in bash.
-
tab
: complement commands or paths -
ctrl + a
: move cursor to the head of the line -
ctrl + e
: move cursor to the end of the line -
crll + l
: clear display -
ctrl + c
: stop currently executing process -
ctrl + s
: stop showing result onto the display -
ctrl + q
: restart showing result onto the display -
ctrl + z
: stop currently executing process temporarily -
ctrl + d
: log out -
ctrl + r
: starts incremental search (commands history)
Shell Variables
# history
$ echo $HISTFILE
$ echo $HISTFILESIZE
$ echo $HISTSIZE
# home directory path
$ echo $HOME
# hostname
$ echo $HOSTNAME
# language
$ echo $LANG
# command search path
$ echo $PATH
# prompt string
# @see http://www.unix.com/shell-programming-and-scripting/131510-need-explanation-ps1-ps2-ps3-ps4.html
$ echo $PS1
$ echo $PS2 # subshell prompt string, by default ">"
# current directory path
$ echo $PWD
# current shell
$ echo $SHELL
# terminal type
$ echo $TERM
# user
$ echo $UID
$ echo $USER
Define Shell Variables
# defines variables
$ name="David Brown"
# use defined variables
$ echo $name
# unset defined variables
$ unset name
Environment Variables
# lists all environment variables
$ printenv
# lists all shell and environment variables
$ set
# sets environment variables
$ export VAR=Ubuntu
Shell Script
Basic Usage
# executes shell script
$ source sampleshell.sh
$ . sampleshell.sh # this is the same with the above command
Basic Syntax
Parameters
- $# : the number of parameters
- $@ : all parameters
- $1 : 1st parameter
- $2 : 2nd parameter
- $3 : 3rd parameter...
Condition Expression
- Filetype ( return true when... )
-
-e
: file exists -
-f
: file type isfile
(not directory, etc) -
-d
: file type is 'directory' -
-r
: file exists and is readable -
-w
: file exists and is writable -
-x
: file exists and is executable -
-L
: is symbolic link
-
- Number ( return true when... )
-
A -eq B
: A equals with B -
A -ge B
: A is greater/equal than/with B -
A -gt B
: A is greater then B -
A -le B
: A is less/equal than/with B -
A -lt B
: A is less than B -
A -ne B
: A does not equal with B
-
- String ( return true when... )
-
-z A
: the size of A is 0 -
A = B
: A equals with B -
A != B
: A does not equal with B
-
- Boolean (return trueh when... )
-
! A
: A is false -
A -a B
: A and B are true -
A -o B
: A or B is true
-
if statement
# when the 1st parameter id directory,
# return `ls -l`
if [ -d $1 ]
then
ls -l $1
else
echo 'No such directory'
fi
case statement
case $1 in
[ -d $1 ] )
echo "Is directory"
;;
[ -f $1 ] )
echo "Is file"
;;
*)
echo "Undefined"
;;
esac
while statement
i=1
while [ $i -le $1 ]
do
echo $i
let i=i+1
done
for statement
i=1
for uid in Will Smith David
echo $i
done
alias
# lists all defined alias
$ alias
# sets new alias
$ alias la='ln -la'
# uses new defined alias
$ la
# unset alias
$ unalias la
function
# lists all declared function
# you need space before and after `{}` blanckets
# $N means arguments
$ function dlist() { ls -l $1 | grep '^d'; }
# uses defines function like below
$ dlist /
# above is the same with below command
$ ls -l / | grep '^d'
# unset defined function
$ unset dlist
Package
# shows system architecture
# return
# - i386 / i686 : 32 bit binary package
# - x86_64 : 64 bit binary package
# - noarch : architecture-independent package
# - src : source package
#
$ arch
File System/Device Files
# shows detailed info about Linux file system
$ dumpe2fs /dev/sda1
# shows all device files
$ ls /dev
# add `&` at the end of the command line to run the command in the background
$ find / -name "*node*" -type f > nodelog.log 2>&1 &
# shows all jobs
$ jobs
# terminate jobs
$ kill %1
Device files
As for the device files, have a look at below table for futher information.
- sda : 1st disk device
- sdb : 2nd disk device
- sda* : other disk device
- scd* : CD/DVD drive
- tty* : terminals
- pts : vertual terminals
- ttysS* : serial ports
- lp : printer device
Log files
-
var/log/messages
: general log -
var/log/secure
: log about authentication -
var/log/cron
: log about cron -
var/log/maillog
: log about maillog -
var/log/boot.log
: log about starting up system -
var/log/wtmp
: log about user logging in -
var/log/lastlog
: log about each user last logging in -
var/run/utmp
: log about currently-logging-in user
Cron
$ crontab -e # edits crontab
$ crontab -l # lists crontab
$ crontab -r # remobes crontab
When you run the above $ crontab -e
command, an editor would be launched and now you can edit the cron file. Here is the basic grammer rules when writing cron.
# *general rule*
# min hour day month DOW command
# run `/usr/bin/updatedb`
# everyday, at 4 am
0 4 * * * /usr/bin/updatedb
# run `/usr/bin/updatedb`
# on every 15th of each month, 1am
0 1 15 * * /usr/bin/updatedb
# run `/user/bin/updatedb`
# on every 5 minutes
*/5 * * * * /usr/bin/updatedb
at
If you want to run not continuously but once, then user at
command.
# lists all scheduled jobs
$ at -l
# or use this
$ atq
# deletes scheduled jobs with job number
$ at -d <job number>
# notify user by sending email when a job is done
$ at -m
Network
Main Protocols
Here are the main and basic protocol at least you should remember.
- TCP : Transimission Control Protocol
- UDP : User Datagram Protocol
- ICMP : Internet Control Message Protocol
- IP : Internet Protocol
- HTTP : HyperText Transfer Protocol
- SSL : Secure Socket Layer
- SMTP : Simple Message Transfer Protocol
- POP3 : Post Office Protocol
- FTP : File Transfer Protocol
- DNS : Domain Name Service
- DHCP : Dynamic Host Configuration Protocol
Main Port Number
- 20, 21 : FTP
- 22 : SSH
- 23 : TELNET
- 25 : SMTP
- 53 : DNS
- 67 : DHCP
- 80 : HTTP
- 110 : POP3
- 143 : IMAP4
- 443 : HTTPS
Basic Commands
# checks whether there is connection or not
$ ping -c 3 www.google.com
# gets DNS info and IP addresses
$ host www.google.com
# shows all connection
$ netstat
$ netstat -a # shows all socket status
$ netstat -n # shows without name resolution
$ netstat -u # shows UDP
$ netstat -p # shows process also
$ netstat -m # shows statistics recoreded by the memory management routines
# shows traceroute until host
$ traceroute www.google.com
# shows DNS server info
$ cat /etc/resolv.conf
# shows IP Addresses and Host name relationship
$ cat /etc/hosts
Others
Locale
# shows local environment variables
$ locale
# shows timezone
$ ls /usr/share/zoneinfo/
# sets timezone
$ export TZ='Asia/Tokyo'
# sets timezone in command shell
$ tzselect
About local environment variables
- LANG : all catetories
- LC_MESSAGES : used for showing message
- LC_TIME : format of date/time
- LC_MONETARY : format of currency
- LC_NUMERIC : format of number
- LC_ALL : all categories
Useful tips
# {}
# the first command is equals with the second one
$ touch test{1,2,3}.md
$ touch test1.md test2.md test3.md
# Date
# $ date +<format>
$ date +"%Y%m%d %H:%M %a(%b)"
# NTP(Network Time Protocol)
$ ntpdate ntp.ring.gr.jp