File handling
Moving through directories (absolute path)
$ cd /path/to/directory
Moving through directories (relative path)
$ cd ./path/to/directory
Show current directory (absolute path)
$ pwd
Show directory contents
$ ls
Show directory contents, l=long, a=all files (on some systems also ll)
$ ls -la
Create new directory
$ mkdir <directory>
Remove empty directory
$ rmdir <directory>
Remove non-empty directory
$ rm -r <directory>
Force remove non-empty directory (without any question)
$ rm -rf <directory>
Move file
$ mv <file> <directory>
Rename file
$ mv <file1> <file2>
Copy file
$ cp <file1> <file2>
Remove file (i=interactive mode)
$ rm <file>
Copy file
$ cp <file1> <file2>
Make symbolic link (alias, shortcut)
$ ln -s <directory> <link_name>
Show help about given command
$ <command> -h
$ man <command>
Search for file inside given directory (use * unless you know exact file name)
$ find <directory> -name <file.*>
Show tail (last few lines) of the file. Use -n 100 to show last 100 lines.
$ tail -f <file>
Shutdown system
$ shutdown -h now
Environment variables
Show OS type
$ echo $OSTYPE
Show currently logged-in user
$ echo $USER
Show current shell type
$ echo $SHELL
Show home directory
$ echo $HOME
Show all environment variables
$ env
Setting custom environment variable
Set environment variable BROWSER_HOME that points to the directory.
$ BROWSER_HOME=/path/to/browser/directory
$ export BROWSER_HOME
$ echo $BROWSER_HOME
$ cd $BROWSER_HOME
As a result you should see output: /path/to/browser/directory.
This variable will only last until the user closes terminal
window or logs-out of the system. To set environment variable
permanently, you need to write above commands to a special file
that is automatically loaded at system startup. On some Linux
systems this file is /etc/bashrc (system wide setting) or
~/.bashrc (for each user); on other systems, you need to create
new bash script and put it in the /etc/profile.d directory. The script is
automatically executed during system startup.
For other systems Google around to find where you need to put custom
environment variables.
Adding environment variable to $PATH
$PATH is probably the most important environment variable among all. It defines directories where system searches for executable files. In the same way as we defined custom environment variable in previous paragraph, you add directory to the path with the following commands:
$ PATH=$PATH:$BROWSER_HOME:/path/to/any/directory
$ export PATH
$ echo $PATH
Echo command should display quite long text containing all
directories that are added to the path, separated by colon (:).
You should see something like this:
/usr/local/bin:/usr/bin:/bin:/path/to/browser/directory:/path/to/directory
Furthermore you can set environment variable for browser application.
$ BROWSER=$BROWSER_HOME/firefox
$ export BROWSER
Your favorite browser can now be invoked with:
$ $BROWSER
To remember PATH permanently, you need to specify PATH every time when system starts. Place custom shell script into /etc/profile.d directory. PATH will be visible to all users.
$ vi /etc/profile.d/myStartupScript.sh
#!/bin/bash
JAVA_HOME=/opt/jdk
export JAVA_HOME
PATH=$PATH:$JAVA_HOME/bin
export PATH
$ chmod +x /etc/profile.d/myStartupScript.sh
User management
Show who is currently logged-in
$ who
Show id and group id of currently logged-in user
$ id
Create new group (do it as root)
$ groupadd <groupName>
Create new user, set group and bash shell (do it as root)
$ useradd -d /home/<userName> -m -G <groupName> /bin/bash <userName>
Set password for user
$ passwd <userName>
Change ownership of directory
$ chown -R <userName>:<groupName> <directory>
Permissions
Nine bits assigned to each file define the access permissions:
-rwxrwxrwx
where r=read, w=write, x=execute, instead of dash (-), there
can be also d (directory), l (link). First three bits are
assigned to the owner's access permissions, next three bits
are assigned to the group's permissions and last three bits
to all others.
Each permission has an assigned number: r=4, w=2, x=1
To set full permission calculate all numbers: 4+2+1=7
To set read/write permission calculate numbers: 4+2=6
To set read permission use number: 4
Use above numbers in following commands to change permissions as desired
$ chmod 777 <file> # result: rwxrwxrwx
$ chmod 755 <file> # result: rwxr-xr-x
$ chmod 644 <file> # result: rw-r--r--
$ chmod 000 <file> # result: --------- (hm, i wonder what this does)
$ chmod 764 <file> # result: rwxrw-r--
Recursively change permissions for all files in a directory
$ chmod -R 777 <directory>
If you find this complicated, there is an alternative. You can add file permissions with plus (+) and remove with minus (-) sign and with letters: u=user, g=owner group, o=others, a=all users
$ chmod a-w <file> # result: r-xr-xr-x
$ chmod o-x <file> # result: rwxrwxrw-
$ chmod go-rwx <file> # result: rwx------
$ chmod u+rw <file> # result: rw-------
$ chmod a+x <file> # result: --x--x--x
$ chmod ug+rx <file> # result: r-xr-x---
Changing ownership
Some directories (or files) only root user is allowed to access and modify.
To change user ownership and group ownership
$ chown <userName> <file>
$ chown <userName>:<userGroup> <file>
$ chown -R <userName> <directory>
To change group ownership of a file
$ chgrp <userGroup> <file>
Processes
Show processes, a=all, u=show users
$ ps au
Show processes
$ ps -ef | grep java
Show services and check on which run level they are started
$ chkconfig --list
Networking
Connecting to remote host with SSH
$ ssh <username>@<hostname>
Transfering files with FTP. See manual here: FTP Command Line
$ ftp <hostname>
Check network status
$ netstat -apn | grep :8080
$ netstat -tupane | grep :8080
Check for open ports
$ nmap -sT -O localhost
$ lsof -i :5223
show which application is running on port
$ lsof -iTCP:1883
Get IP address of a server
$ nslookup
When '>' prompt is displayed, type hostname of a server (eg. www.yahoo.com)
scp
Upload file to remote server
$ scp <file> user@192.168.1.100:<directory>
Download file from remote server
$ scp user@192.168.1.100:<directory> <file>
curl
Retrieve the contents of the url
$ curl <http://hostname.com>
$ curl http://matjazcerkvenik.si/home.php
$ curl --url <url>
Save the contents of the url to a file
$ curl -o <filename.html> <http://hostname.com>
$ curl http://matjazcerkvenik.si/home.php > file.html
Save the contents of the url to a file; if -O option is used, file will have the same name as it is on the server.
$ curl -O <http://hostname.com>
$ curl -O http://www.matjazcerkvenik.si/some-file.tar.gz
If the host redirects to anoter url, use -L option to folow the redirect
$ curl -L <http://hostname.com>
See the header of the requested url
$ curl -v <http://hostname.com>
See the header of the requested url
$ curl -I <http://hostname.com>
Get definition of a word using dict protocol
$ curl dict://dict.org/d:<word>
Get data with authentication
$ curl -k https://hostname.com/rest/getData -u admin:password > /root/file.txt
Net-SNMP
SNMP-GET request using Net-SNMP
$ snmpget -v 1 -c public 10.29.152.208 1.3.6.1.4.1.5551.1.1.3.1.0
$ snmpget -v 1 -c public 10.29.152.208:6161 1.3.6.1.4.1.5551.1.1.3.2.0
$ snmpget -v 2c -c public 10.29.152.208 1.3.6.1.2.1.1.3.0
$ snmpget -v 3 -n "" -u NortBound -l noAuthNoPriv 172.24.24.14 1.3.6.1.4.1.161.3.10.1.7
SNMP-SET
$ snmpset -v 1 -c public 10.29.152.208 1.3.6.1.4.1.5551.1.1.3.2.0 s "ALL"
$ snmpset -v 1 -c public 10.29.152.208 1.3.6.1.4.1.5551.1.1.3.3.0 i 3
$ snmpset -v 1 -c public 10.29.152.208 1.3.6.1.4.1.5551.1.1.3.1.0 i 1
SNMP-WALK
$ snmpwalk -v 1 -c public 10.29.152.208 1.3.6.1.4.1.5551.1.1.3
Show OIDs instead of OID names in SNMP-WALK request
$ snmpwalk -v 1 -On -c public 10.29.152.208 1.3.6.1.4.1.5551.1.1.3
SNMP-BULKWALK
$ snmpbulkwalk -v 2c -c public 192.168.1.100 1.3.6.1.4.1.444.1.8
SNMP-GETBULK
$ snmpbulkget -v 2c -c public 192.168.1.100 1.3.6.1.4.1.444.1.8
By default the snmpbulkget command returns only 10 entries from the table. To read first <num> entries execute
$ snmpbulkget -v 2c -C r<num> -c public 192.168.1.100 1.3.6.1.4.1.444.1.8
tcpdump
Start tracing network traffic from host x.x.x.x on port N
$ tcpdump -nAs 2048 host 192.168.1.100 and port 162
Start tracing network traffic from host x.x.x.x on interface eth0
$ tcpdump -nAs 2048 host 192.168.1.100 -i eth0
Write captured packets in pcap file (open file with Wireshark):
$ tcpdump -nAs 2048 host 192.168.1.100 -w file.pcap
iptables - firewall on CentOS
Firewall on CentOS is called iptables.
Show rules in iptables
$ iptables -L
Show rules in iptables
$ iptables --line -vnL
Add new rule: allow incoming connections to port 8080 (the problem with this command is that the rule is added after the REJECT all rule)
$ iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
Add new rule: allow incoming connections to port 8080 (insert rule in position 5 in INPUT chain)
$ iptables -I INPUT 5 -p tcp --dport 8080 -j ACCEPT
The rule was applied on the 5-th position (just before REJECT)
[root@localhost ~]# iptables --line -vnL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 97 8969 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
3 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
4 1 64 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
5 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080
6 2 342 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT 6 packets, 744 bytes)
num pkts bytes target prot opt in out source destination
Add new rule (allow only incoming tcp connections on port 8080 on eth0 interface from selected network)
$ iptables -A INPUT -i eth0 -p tcp --dport 8080 -s 192.168.1.0/24 -j ACCEPT
Remember to save the iptables, so the rules will be applied at next reboot
$ service iptables save
Delete a rule
$ iptables -D INPUT -p tcp --dport 8080 -j ACCEPT
Deleta a rule (based on number in chain)
$ iptables -D INPUT 5
Alternative
Simply modify file
$ vi /etc/sysconfig/iptables
Restart iptables service
$ /sbin/service iptables restart
Creating and compressing archives
Create tar archive
$ tar -cvf <file.tar> <directory>
Add additional directory to existing tar archive
$ tar -rv -f <file.tar> <directory>
Extract tar archive
$ tar -xvf <file.tar>
Compress file (output is .gz file)
$ gzip <file>
Extract tar.gz archive
$ tar -zxvf <file.tar>
Extract .gz file. Gunzip it.
$ gunzip <file.gz>
Extract tar.bz2 archive
$ tar -jxvf <file.tar.bz2>
Miscelaneous
Log in as root (enter password when prompted)
$ su - root
Show disk usage
$ df -h
$ du -ch /path/to/directory
Reboot the server
$ reboot
Shutdown server after 1 minute (use 'now' to shutdown immediately)
$ shutdown -h +1
Or simply use
$ halt
Show current date and time
$ date
Show list of commands and brief description
$ info
Display list last n commands
$ history <n>
Execute n-th command (from history)
$ !n
Execute previous command
$ !!
Screen command is used to switch between multiple consoles inside one. <name> is custom name of the screen. Create new screen
$ screen -S <name>
To exit the screen press
ctrl + a, then d
See the list of opened screens
$ screen -ls
Switch between opened screens
$ screen -r <name>
Close the screen (PID can be seen from result of screen -ls command)
$ kill <PID>
Using echo command
This will just display (echo) the text - no big deal
$ echo blablabla
First calculate, then display text
$ echo "The sum of 2 and 3 is $[2+3]"
First execute command, then display text
$ echo "There are $(ls | wc -w) files in this directory"
Piping commands
The pipe character (|) connects the output of one command to the input of another.
This command lists the contents of /usr/bin directory, sorts the files alphabetically and pipes the output to less.
$ ls /usr/bin | sort -f | less
Show processes containing string blabla
$ ps -ef | grep blabla
Reading and writing to file
Simple readings and writings from/to a file can be made with characters:
< - content of a file to command line
> - command output to a file (overwrite)
>> - command output to a file (append)
Examples:
$ mail root < ~/.bashrc
$ chmod | col -b > /tmp/chmod
$ echo "I finished the project on $(date)" >> ~/projects
Export display from Linux
1. Start X client:
- On Windows system start XMing (or any other X client). In XMing check 'No Access Control' option.
- On OS X system start X11 application. Check 'Allow connections from network clients' option in Preferences >> Security tab and restart X11 application. In X11 terminal window execute command: $ xhost + to disable access control.
2. Execute the following command on Linux (<IP> is IP address of your local system (Windows or OS X)):
$ export DISPLAY=<IP>:0.0
3. Run an application on Linux:
$ wireshark &
Jstack
Get PID of Java prosesses
$ jps -l
Dump java stack to file:
$ /opt/jdk1.6/bin/jstack PID > jstack-01.txt