#!/bin/basha=65535out=""while [ $a -gt 0 ]dob=$(($a%2))a=$(($a/2))out="$b$out"doneecho $out
Wednesday, October 29, 2014
Bash Script - Convert int to binary
There are many ways to convert integer variable to binary. Here is one:
Thursday, May 15, 2014
Linux - How to change default sshd port
There are many reasons why default port 22 for ssh is need to be changed. If you need to change default port or add other listening port:
1. open /etc/ssh/sshd_config with your favorite text editor
2. find line
Port 22
and
edit this value to your needs.
or if you want to add other listening port, simply add line with port. Example:
Port 22
Port 1000
after editing save config file and restart sshd:
$ sudo /etc/init.d/ssh restart
or
$ service sshd restart
dependant on system you use.
1. open /etc/ssh/sshd_config with your favorite text editor
2. find line
Port 22
and
edit this value to your needs.
or if you want to add other listening port, simply add line with port. Example:
Port 22
Port 1000
after editing save config file and restart sshd:
$ sudo /etc/init.d/ssh restart
or
$ service sshd restart
dependant on system you use.
File /etc/ssh/sshd_config opened in editor |
Monday, May 12, 2014
Bash - Substring
How to get substring in Bash script? Simple :)
if we have string:
$ a=123456789
substring from position 1 to 5 is
$ echo ${a:1:5}
23456
First position in a string is 0.
in general: ${varname:start_pos:length}
in general: ${varname:start_pos:length}
Sunday, May 11, 2014
Linux - Make ISO image of CD
If we want to make exact copy of cd media type, because Linux handles everything as file, we need to read all data from one file and write it to imagefile on disk.
$ cat /dev/cdrom >./imagefile.iso
another way is using dd command:
dd if=/dev/cdrom of=imagefile.iso
$ cat /dev/cdrom >./imagefile.iso
another way is using dd command:
dd if=/dev/cdrom of=imagefile.iso
Saturday, May 10, 2014
Linux - Printing first or last 10 lines
There are many examples when we need to print first or last lines of some file. Commands head and tail ca help to do this.
Command head prints 10 first lines of file.
$ head file
or
$ cat file|head
There is command line argument -n, which says how many lines to be printed.
Example:
$ head -n 5 file
prints first 5 linest from file.
if number is negative, command head prints last n lines from file.
Command tail does oposite from command head: prints last 10 lines from a file.
$ tail file
same as command head there is argument -n which tells to command head how many last lines from a file is to be printed:
$ tail -n 7 file
prints last 7 lines from file.
If you want to print all lines in file excluded first n lines, command is:
$ tail -n +5 file
prints all lines in file, excluded first 5 lines.
Command tail is very useful in log analyzing, when you are not interested in whole file, but only last n lines.
Command head prints 10 first lines of file.
$ head file
or
$ cat file|head
There is command line argument -n, which says how many lines to be printed.
Example:
$ head -n 5 file
prints first 5 linest from file.
if number is negative, command head prints last n lines from file.
Command tail does oposite from command head: prints last 10 lines from a file.
$ tail file
same as command head there is argument -n which tells to command head how many last lines from a file is to be printed:
$ tail -n 7 file
prints last 7 lines from file.
If you want to print all lines in file excluded first n lines, command is:
$ tail -n +5 file
prints all lines in file, excluded first 5 lines.
Command tail is very useful in log analyzing, when you are not interested in whole file, but only last n lines.
Friday, May 9, 2014
Linux - Find ssh attacks
All login attempts, successful or not, are in /var/log/auth.log file. To find from which IP addresses attempts are coming, and only for valid usernames, execute following line:
$ cat /var/log/auth.log|grep -v "invalid"|grep "Failed password"|awk '{ print $(NF-3) }'|sort|uniq
grep -v "invalid" - -v switch reverts filter then only lines without word "invalid" are included
grep "Failed password" - only lines with words "Failed password" are included
awk '{ print $(NF-3) }' - Take 3rd arg from last
sort
and print only unique IP addresses.
Also, if you want to find on which usernames attacks are targeted change awk part into: awk '{ print $(NF-5) }'
$ cat /var/log/auth.log|grep -v "invalid"|grep "Failed password"|awk '{ print $(NF-3) }'|sort|uniq
grep -v "invalid" - -v switch reverts filter then only lines without word "invalid" are included
grep "Failed password" - only lines with words "Failed password" are included
awk '{ print $(NF-3) }' - Take 3rd arg from last
sort
and print only unique IP addresses.
Also, if you want to find on which usernames attacks are targeted change awk part into: awk '{ print $(NF-5) }'
Thursday, May 8, 2014
Linux - File Checksum
The purpose of file checksums is to validate integrity of files. There are many ways to do checksums on Linux, but the simplest is by using md5sum command (for MD5 checksum). Format is:
md5sum [options] [file1] ... [file n]
Options are:
-b or --binary - binary mode
-t or --text - text mode (default)
-c or --check - read file with checksums and check them
For test purpose make one file named test
$ md5sum test
ee10c66475e841d934c0e39d07650d4a test
output md5 checksum to file:
$ md5sum test >checksum
check:
$md5sum -c checksum
test: OK
MD5 gives 128 bit checksum. For security related purposes is better to use SHA-2 algorithm implemented in: sha224sum, sha256sum, sha384sum and sha512sum programs.
md5sum [options] [file1] ... [file n]
Options are:
-b or --binary - binary mode
-t or --text - text mode (default)
-c or --check - read file with checksums and check them
For test purpose make one file named test
$ md5sum test
ee10c66475e841d934c0e39d07650d4a test
output md5 checksum to file:
$ md5sum test >checksum
check:
$md5sum -c checksum
test: OK
MD5 gives 128 bit checksum. For security related purposes is better to use SHA-2 algorithm implemented in: sha224sum, sha256sum, sha384sum and sha512sum programs.
Wednesday, May 7, 2014
Linux - Add User to a Group
1. To add existing user to existing group:
$ usermod -G groupname username
or
$ usermod -g GID username
2. To add existing user to existing supplementary groups
$ usermod -a -G groupname username
-a is switch for append
3. To add user to group when adding user
$ adduser --ingroup groupname username
4. To check which groups user is member of
$ groups username
Tuesday, May 6, 2014
Bash script: User Input
For user general input in variable we use command read:
#!/bin/bash
read -p "Enter first number:" num1
read -p "Enter second number:" num2
if [ num1 -eq num2 ]
then
echo "Numbers are equal"
else
if [ $num1 -lt $num2 ]
then
echo "Second number is larger"
else
echo "First number is larger"
fi
fi
For entering exact expected word (example Yes or No) we use command select:
#!/bin/bash
echo "Do you want continue?"
select inp in "yes" "no"
do
case $inp in
yes ) echo "You want to continue"
break
;;
no ) echo "You want to exit"
break
;;
esac
done
#!/bin/bash
read -p "Enter first number:" num1
read -p "Enter second number:" num2
if [ num1 -eq num2 ]
then
echo "Numbers are equal"
else
if [ $num1 -lt $num2 ]
then
echo "Second number is larger"
else
echo "First number is larger"
fi
fi
For entering exact expected word (example Yes or No) we use command select:
#!/bin/bash
echo "Do you want continue?"
select inp in "yes" "no"
do
case $inp in
yes ) echo "You want to continue"
break
;;
no ) echo "You want to exit"
break
;;
esac
done
Monday, May 5, 2014
Bash FOR loop
For loop is a structure that executes a number of times, generally known in advance. In Bash script syntax of FOR loop is:
for VARIABLE [in LIST]; do COMMANDS BLOCK; done
or
for VARIABLE [in LIST]
do
COMMANDS_BLOCK
done
LIST is a list of words or numbers. If LIST is omitted $@ is implied.
Simple examples:
1. This example prints all files in directory
dirlist=$(ls)
for i in $dirlist
do
echo $i
done
2. This example prints numbers from 1 to 10
for i in {1..10}
do
echo $i
done
or
for i in 1 2 3 4 5 6 7 8 9 10
do
echo $i
done
3. This example prints number from 1 to 10 with step 2
for i in {1..10..2}
do
echo $i
done
4. This example prints
for VARIABLE [in LIST]; do COMMANDS BLOCK; done
or
for VARIABLE [in LIST]
do
COMMANDS_BLOCK
done
LIST is a list of words or numbers. If LIST is omitted $@ is implied.
Simple examples:
1. This example prints all files in directory
dirlist=$(ls)
for i in $dirlist
do
echo $i
done
2. This example prints numbers from 1 to 10
for i in {1..10}
do
echo $i
done
or
for i in 1 2 3 4 5 6 7 8 9 10
do
echo $i
done
3. This example prints number from 1 to 10 with step 2
for i in {1..10..2}
do
echo $i
done
4. This example prints
Sunday, May 4, 2014
Bash - Exit code
1. Exit code from Bash script
argument of exit command is exit code
exit n
example (exit_example.sh)
#!/bin/bash
exit $1 #return argument 1 as return code
2. Bash last exit code
last exit code is in variable $?
#!/bin/bash
./exit_example.sh 2
echo $?
result is:
2
argument of exit command is exit code
exit n
example (exit_example.sh)
#!/bin/bash
exit $1 #return argument 1 as return code
2. Bash last exit code
last exit code is in variable $?
#!/bin/bash
./exit_example.sh 2
echo $?
result is:
2
Saturday, May 3, 2014
Bash - Join Arrays
How to join arrays in Bash Script? Very simple :) Example:
#!/bin/bash
a1=(a b c d) #array 1
a2=(e f g h) #array 2
a=(${a1[@]} ${a2[@]}) #join array
echo ${a[@]}
Output is:
a b c d e f g h
Make array of arrays and result is joined array :)
Friday, May 2, 2014
Customize Bash prompt
Bash prompt text is defined in PS1 variable. PS1 variable is declared in .bashrc file which is in home directory. Open this file with your favorite text editor: ~/.bashrc
Find declaration of PS1 variable (maybe there are few of them) and, if you want to permanent change prompt, change this declaration to suit your needs. If you want to change prompt temporally (recommended!) until restart, type in Bash command prompt:
$ PS1="NEW PROMPT --> "
NEW PROMPT -->
If you look in default string there are some special character with some system parameters as:
$ PS1="\h:\w"
linips:~
Find declaration of PS1 variable (maybe there are few of them) and, if you want to permanent change prompt, change this declaration to suit your needs. If you want to change prompt temporally (recommended!) until restart, type in Bash command prompt:
$ PS1="NEW PROMPT --> "
NEW PROMPT -->
If you look in default string there are some special character with some system parameters as:
- \u username
- \h hostname
- \w working directory
- ...
$ PS1="\h:\w"
linips:~
Thursday, May 1, 2014
Linux - Add User Account
To add user to Linux from command line (shell) type command adduser followed with options and username. Example to add user linips (type sudo if you are not root):
$ sudo adduser linips
Adding user `linips' ...
Adding new group `linips' (1001) ...
Adding new user `linips' (1001) with group `linips' ...
Creating home directory `/home/linips' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for linips
Enter the new value, or press ENTER for the default
Full Name []: Linips Blog
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n]
via the NAME_REGEX[_SYSTEM] configuration variable. Use the `--force-badname'
option to relax this check or reconfigure NAME_REGEX.
Then we must add --force-badname switch to command
$ sudo adduser --force-badname linips.blog
and continue with entering data for new user.
$ sudo adduser linips
Adding user `linips' ...
Adding new group `linips' (1001) ...
Adding new user `linips' (1001) with group `linips' ...
Creating home directory `/home/linips' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for linips
Enter the new value, or press ENTER for the default
Full Name []: Linips Blog
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n]
Defaults are in file /etc/adduser.conf
What if we are want to add user with username format as firstname.secondname?
$ sudo adduser linips.blog
adduser: Please enter a username matching the regular expression configuredvia the NAME_REGEX[_SYSTEM] configuration variable. Use the `--force-badname'
option to relax this check or reconfigure NAME_REGEX.
$ sudo adduser --force-badname linips.blog
and continue with entering data for new user.
Wednesday, April 30, 2014
Bash - String Lenght
Getting string length in Bash Script is very easy by using # operator:
$ some_variable="This is Test String"
$ echo ${#some_variable}
19
${#variable_name} gives us string length.
$ some_variable="This is Test String"
$ echo ${#some_variable}
19
${#variable_name} gives us string length.
Tuesday, April 29, 2014
Linux Add Group
To add group linips to Linux type:
$ groupadd linips
General format of command groupadd is:
groupadd [options] groupname
options are:
$ groupadd linips
General format of command groupadd is:
groupadd [options] groupname
options are:
- --help
- -g, --GID gid -to assign Group ID
- -f, --force - -f with -g acts like -g not exist - GID another unique
- -K, --key KEY=VALUE
- -o, --non-unique - to add group with non unique GID
- -p, --password PASSWORD
- -r, --system - To create system group
Monday, April 28, 2014
Bash - Ping ip range and email result
In Bash script is a very simple to write script for checking availability of network devices. In this case, the script will ping an address range and rusults will be sent to your email address.
#!/bin/bash
om="mailtempfile"
dat="$(date)"
eval "echo 'This is Computer status from Linips Script at $dat' >${om}"
eval "echo '' >>${om}"
for i in {1..6}
do
out="$(ping 192.168.1.$i -c 5|tail -1|awk '{print $4}'|cut -d '/' -f 2)"
case $i in
1)
comp="Router One "
;;
2)
comp="Router Two "
;;
3)
comp="Router Three "
;;
4)
comp="Server One "
;;
5)
comp="Server Two "
;;
6)
comp="Server Three "
;;
esac
eval "echo '192.168.1.$i $comp $out'>>${om}"
done
mail -s "Net status $dat" myemail@adress <mailtempfile
Or, the same script, with using Bash script arrays:
#!/bin/bash
comp[1]="Router One "
comp[2]="Router Two "
comp[3]="Router Three "
comp[4]="Server One "
comp[5]="Server Two "
comp[6]="Server Three "
om="mailtempfile"
dat="$(date)"
eval "echo 'This is Computer status from Linips Script at $dat' >${om}"
eval "echo '' >>${om}"
for i in {1..6}
do
out="$(ping 192.168.1.$i -c 5|tail -1|awk '{print $4}'|cut -d '/' -f 2)"
eval "echo '192.168.1.$i ${comp[$i]} $out'>>${om}"
done
mail -s "Net status $dat" myemail@address <mailtempfile
Received email:
And finally, the greatest strenght of this script is that it runs automatically, so you need to add one line in the /etc/crontab file: (example is for script running every 20 min)
*/20 * * * * root /home/user/pingscript..sh
#!/bin/bash
om="mailtempfile"
dat="$(date)"
eval "echo 'This is Computer status from Linips Script at $dat' >${om}"
eval "echo '' >>${om}"
for i in {1..6}
do
out="$(ping 192.168.1.$i -c 5|tail -1|awk '{print $4}'|cut -d '/' -f 2)"
case $i in
1)
comp="Router One "
;;
2)
comp="Router Two "
;;
3)
comp="Router Three "
;;
4)
comp="Server One "
;;
5)
comp="Server Two "
;;
6)
comp="Server Three "
;;
esac
eval "echo '192.168.1.$i $comp $out'>>${om}"
done
mail -s "Net status $dat" myemail@adress <mailtempfile
Or, the same script, with using Bash script arrays:
#!/bin/bash
comp[1]="Router One "
comp[2]="Router Two "
comp[3]="Router Three "
comp[4]="Server One "
comp[5]="Server Two "
comp[6]="Server Three "
om="mailtempfile"
dat="$(date)"
eval "echo 'This is Computer status from Linips Script at $dat' >${om}"
eval "echo '' >>${om}"
for i in {1..6}
do
out="$(ping 192.168.1.$i -c 5|tail -1|awk '{print $4}'|cut -d '/' -f 2)"
eval "echo '192.168.1.$i ${comp[$i]} $out'>>${om}"
done
mail -s "Net status $dat" myemail@address <mailtempfile
Received email:
This is Computer status from Linips Script at Mon Apr 28 08:13:45 CEST 2014
192.168.1.1 Router One 2.493
192.168.1.2 Router Two 17.712
192.168.1.3 Router Three 13.669
192.168.1.4 Server One 4.601
192.168.1.5 Server Two 8.199
192.168.1.6 Server Three 9.302
And finally, the greatest strenght of this script is that it runs automatically, so you need to add one line in the /etc/crontab file: (example is for script running every 20 min)
*/20 * * * * root /home/user/pingscript..sh
Sunday, April 27, 2014
Bash String Concatenation
If you writing Bash scripts, it's probably happened that you need to concatenate two or more strings. There are several ways to do this:
1. Variable insert
$ a="Hello"
$ b="$a World"
$ echo $b
Hello World
2. Writing variables one after another
$ a="Hello"
$ b=" World"
$ c=$a$b
$ echo $c
Hello World
3. Using += operator
$ a="Hello"
$ a+=" World"
$ echo $a
Hello World
1. Variable insert
$ a="Hello"
$ b="$a World"
$ echo $b
Hello World
2. Writing variables one after another
$ a="Hello"
$ b=" World"
$ c=$a$b
$ echo $c
Hello World
3. Using += operator
$ a="Hello"
$ a+=" World"
$ echo $a
Hello World
Labels:
bash,
concatenate,
concatenation,
echo,
hello world,
script,
string,
strings
Saturday, April 26, 2014
Linux Get CPU Info
Probably the simplest way to get CPU info in Linux is to display /proc/cpuinfo (and example output)
$ cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 15
model : 2
model name : Intel(R) Celeron(R) CPU 2.40GHz
stepping : 9
cpu MHz : 2423.933
cache size : 128 KB
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 2
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe up pebs bts sync_rdtsc cid xtpr
bogomips : 4851.34
clflush size : 64
$ cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 15
model : 2
model name : Intel(R) Celeron(R) CPU 2.40GHz
stepping : 9
cpu MHz : 2423.933
cache size : 128 KB
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 2
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe up pebs bts sync_rdtsc cid xtpr
bogomips : 4851.34
clflush size : 64
if we need only to display model name:
$ cat /proc/cpuinfo|grep "model name"
model name : Intel(R) Celeron(R) CPU 2.40GHz
In the case that there are multiple processors, info of second will continue after first one and so on... processor: 0, processor: 1,...
Friday, April 25, 2014
Solution for maintaining old Ubuntu Linux computer
If you have an old server with Ubuntu Linux distribution, which for some reason you can not update to newer version and you need to maintain it. During new program installation many errors tells us that aptitude or apt-get can not find the path to the server from which we need to download required packets. Solution is very simple for the following Ubuntu Linux distributions:
- Ubuntu 4.10 (Warty Warthog)
- Ubuntu 5.04 (Hoary Hedgehog)
- Ubuntu 5.10 (Breezy Badger)
- Ubuntu 6.06.2 LTS (Dapper Drake)
- Ubuntu 6.10 (Edgy Eft)
- Ubuntu 7.04 (Feisty Fawn)
- Ubuntu 7.10 (Gutsy Gibbon)
- Ubuntu 8.04.4 LTS (Hardy Heron)
- Ubuntu 8.10 (Intrepid Ibex)
- Ubuntu 9.04 (Jaunty Jackalope)
- Ubuntu 9.10 (Karmic Koala)
- Ubuntu 10.04.4 LTS (Lucid Lynx)
- Ubuntu 10.10 (Maverick Meerkat)
- Ubuntu 11.04 (Natty Narwhal)
- Ubuntu 11.10 (Oneiric Ocelot)
- Ubuntu 12.04.3 LTS (Precise Pangolin)
All repositories for those distributions are located at: old-releases.ubuntu.com
How to make changes
Edit your /etc/apt/sources.list :
change all urls from: http://<>.archive.ubuntu.com/ubuntu to http://old-releases.ubuntu.com/ubuntu
And your old Ubuntu Linux is ready for update :)
Thursday, April 24, 2014
BASH - customize ping output
Problem is simply: how to get the output of ping command suited to our needs. In this example we will extract average ping time in Bash scripting language.
First let's see output of ping command: ping 192.168.1.1 -c 5 (-c 5 tells to ping command to run five times, else it will run infinitely.)
$ ping 192.168.1.1 -c 5
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=2.62 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.477 ms
64 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=0.482 ms
64 bytes from 192.168.1.1: icmp_seq=4 ttl=64 time=0.482 ms
64 bytes from 192.168.1.1: icmp_seq=5 ttl=64 time=0.487 ms
--- 192.168.1.1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4000ms
rtt min/avg/max/mdev = 0.477/0.911/2.629/0.859 ms
First let's see output of ping command: ping 192.168.1.1 -c 5 (-c 5 tells to ping command to run five times, else it will run infinitely.)
$ ping 192.168.1.1 -c 5
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=2.62 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.477 ms
64 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=0.482 ms
64 bytes from 192.168.1.1: icmp_seq=4 ttl=64 time=0.482 ms
64 bytes from 192.168.1.1: icmp_seq=5 ttl=64 time=0.487 ms
--- 192.168.1.1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4000ms
rtt min/avg/max/mdev = 0.477/0.911/2.629/0.859 ms
Average ping time is in last line. Use tail -1 to extract only last line.
$ ping 192.168.1.1 -c 5|tail -1
rtt min/avg/max/mdev = 0.477/0.911/2.629/0.859 ms
Then extract values, count 'arguments' in this line separated by space: 'rtt' is the first, 'min/avg/max/mdev' 2nd, '=' 3rd, '0.477/0.911/2.629/0.859' 4th and 'ms' 5th.
$ ping 192.168.1.1 -c 5|tail -1|awk '{print $4}'
0.477/0.911/2.629/0.859
and finally, from this output of four '/' separated values, take the second value: this is done by cut command:
$ ping 192.168.1.1 -c 5|tail -1|awk '{print $4}'|cut -d '/' -f 2
0.911
and this is the value that we are looking for...
Saturday, February 22, 2014
Linux How to concatenate text files
cat file1 file2 filen > outputfile
or if you want to concatenate all text files in directory:
or you can use >> operator to append to file:cat *.txt > outputfile
cat file1 >> file2
Linux How to count words and lines in a text file
If you want to count words in some text file you could use:
Full options list for wc command:
also:
wc -w <file>example for file 2600.txt (War and Peace from Leo Tolstoy) from Guttenberg Project :
wc -w 2600.txtoutput:
566321 2600.txtIf you want to count lines in some text file you could use:
wc -l <file>the same file for example
wc -l 2600.txtoutput:
65008 2600.txt
Full options list for wc command:
- -c or --bytes byte counts
- -m or --chars character counts
- -l or --lines newline counts
- -L or --max-line-length lenght of longest line
- -w or --words word counts
also:
- --help
- --version
Subscribe to:
Posts (Atom)