Upload
others
View
22
Download
0
Embed Size (px)
Citation preview
LinuxHack
LinuxHackAjayKumarTiwari
TableofContentsIntroduction
Foreword
Version
Chapter1:PowerfulCDCommandHacksUseCDPATHtodefinethebasedirectoryforcdcommand
Usecdaliastonavigateupthedirectoryeffectively
Performmkdirandcdusingasinglecommand
Use“cd-”totogglebetweenthelasttwodirectories
Usedirs,pushdandpopdtomanipulatedirectorystack
Use“shopt-scdspell”toautomaticallycorrectmistyped
directorynamesoncd
Chapter2:DateManipulationSetSystemDateandTime
SetHardwareDateandTime
DisplayCurrentDateandTimeinaSpecificFormat
DisplayPastDateandTime
DisplayFutureDateandTime
Chapter3:SSHClientCommandsIdentifySSHClientVersion
LogintoRemoteHostusingSSH
DebugSSHClientSession
ToggleSSHSessionusingSSHEscapeCharacter
SSHSessionStatisticsusingSSHEscapeCharacter
Chapter4:EssentialLinuxCommandsGrepCommand
2
LinuxHackAjayKumarTiwari
FindCommand
SuppressStandardOutputandErrorMessage
JoinCommand
ChangetheCase
XargsCommand
SortCommand
UniqCommand
CutCommand
StatCommand
DiffCommand
Displaytotalconnecttimeofusers
Chapter5:PS1,PS2,PS3,PS4andPROMPT_COMMANDPS1-DefaultInteractionPrompt
PS2-ContinuationInteractivePrompt
PS3-Promptusedby“select”insideshellscript
PS4-Usedby“set-x”toprefixtracingoutput
PROMPT_COMMAND
Chapter6:ColorfulandFunctionalShellPromptUsingPS1Displayusername,hostnameandbasenameofdirectoryin
theprompt
Displaycurrenttimeintheprompt
Displayoutputofanycommandintheprompt
Changeforegroundcoloroftheprompt
Changebackgroundcoloroftheprompt
Displaymultiplecolorsintheprompt
Changethepromptcolorusingtput
CreateyourownpromptusingtheavailablecodesforPS1
variable
UsebashshellfunctioninsidePS1variable
UseshellscriptinsidePS1variable
Chapter7:ArchiveandCompression3
LinuxHackAjayKumarTiwari
Zipcommandbasics
Advancedcompressionusingzipcommand.
PasswordProtectionofZipfiles
Validateaziparchive
TarCommandBasics
Combinegzip,bzip2withtar
Chapter8:CommandLineHistoryDisplayTIMESTAMPinhistoryusingHISTTIMEFORMAT
SearchthehistoryusingControl+R
Repeatpreviouscommandquicklyusing4differentmethods
Executeaspecificcommandfromhistory
Executepreviouscommandthatstartswithaspecificword
Controlthetotalnumberoflinesinthehistoryusing
HISTSIZE
ChangethehistoryfilenameusingHISTFILE
Eliminatethecontinuousrepeatedentryfromhistoryusing
HISTCONTROL
Eraseduplicatesacrossthewholehistoryusing
HISTCONTROL
Forcehistorynottorememberaparticularcommandusing
HISTCONTROL
Clearalltheprevioushistoryusingoption-c
Substitutewordsfromhistorycommands
Substituteaspecificargumentforaspecificcommand
DisabletheusageofhistoryusingHISTSIZE
IgnorespecificcommandsfromthehistoryusingHISTIGNORE
Chapter9:SystemAdministrationTasksPartitionusingfdisk
Formatapartitionusingmke2fsk
Mountthepartition
4
LinuxHackAjayKumarTiwari
Finetunethepartitionusingtune2fs
Createaswapfilesystem.
Createanewuser
Createanewgroupandassigntoanuser
SetupSSHpasswordlesslogininOpenSSH
Usessh-copy-idalongwithssh-agent
Crontab
SafeRebootOfLinuxUsingMagicSysRqKey
Chapter10:ApachectlandHttpdExamplesPassdifferenthttpd.conffilenametoapachectl
UseatemporaryDocumentRootwithoutmodifying
httpd.conf
IncreasetheLogLeveltemporarily
DisplaythemodulesinsideApache
Showallaccepteddirectivesinsidehttpd.conf
Validatethehttpd.confaftermakingchanges
Displaythehttpdbuildparameters
Loadaspecificmoduleonlyondemand
Chapter11:BashScriptingExecutionSequenceof.bash_*files
Howtogeneraterandomnumberinbashshell
Debugashellscript
Quoting
Readdatafilefieldsinsideashellscript
Chapter12:SystemMonitoringandPerformanceFreecommand
TopCommand
PsCommand
DfCommand
KillCommand
DuCommand
5
LinuxHackAjayKumarTiwari
SarCommand
vmstatCommand
NetstatCommand
SysctlCommand
NiceCommand
ReniceCommand
6
lsofcommands.
LinuxHackAjayKumarTiwari
Introduction”Thereareonly10typesofpeopleintheworld—thosewhounderstand
binary,thosewhodon’t,andthosewhounderstandgraycode”
—Geek
I’mAjayKumarTiwari,authorofthisBook
Ihavedoneintensiveprogrammingonseveral
languagesandCismyfavorite.Ihavedonelotofwork
ontheinfrastructuresideincludingLinuxsystem
administration,DBA,Networking,Hardwareand
Storage(EMC).
Copyright©2015–AjayKumarTiwari
7
LinuxHackAjayKumarTiwari
ForewordAnothercollectionofhacks?Yes!Ifyouhavejustcompletedyourfirstadmin
courseorlookingforbetterwaystogetthejobdonethe“LinuxHack”
eBookisagoodpointtostart.Theseusefultipsareconcise,wellwrittenand
easytoread.
Welldone-IwillrecommendthiseBooktomystudents.
—Prof.Dr.FritzMehner,FHSüdwestfalen,Germany
(AuthorofseveralVimplugins,includingbash-supportvimplugin)
VersionVersion
1.0
Date
25-Mar-2015
Revisions
FirstEdition
8
LinuxHackAjayKumarTiwari
Chapter1:PowerfulCDCommandHackscdisoneofthemostfrequentlyusedcommandsduringaUNIXsession.The6
cdcommandhacksmentionedinthischapterwillboostyourproductivity
instantlyandmakeiteasiertonavigatethedirectorystructurefrom
commandline.
Hack1.UseCDPATHtodefinethebasedirectoryforcdcommandIfyouarefrequentlyperformingcdtosubdirectoriesofaspecificparent
directory,youcansettheCDPATHtotheparentdirectoryandperformcdto
thesubdirectorieswithoutgivingtheparentdirectorypathasexplained
below.
[ramesh@dev-db~]# pwd
/home/ramesh
[ramesh@dev-db~]# cdmail
-bash:cd:mail:Nosuchfileordirectory
[Note:Thisislookingformaildirectoryundercurrent
directory]
[ramesh@dev-db~]# exportCDPATH=/etc
[ramesh@dev-db~]# cdmail
/etc/mail
[Note:Thisislookingformailunder/etcandnot
undercurrentdirectory]
[ramesh@dev-db/etc/mail]# pwd
/etc/mail
Tomakethischangepermanent,addexportCDPATH=/etctoyour
~/.bash_profile
9
LinuxHackAjayKumarTiwari
SimilartothePATHvariable,youcanaddmorethanonedirectoryentryin
theCDPATHvariable,separatingthemwith:,asshownbelow.
exportCDPATH=.:~:/etc:/var
Thishackcanbeveryhelpfulunderthefollowingsituations:
o
OracleDBAsfrequentlyworkingunder$ORACLE_HOME,canset
theCDPATHvariabletotheoraclehome
Unixsysadminsfrequentlyworkingunder/etc,cansetthe
CDPATHvariableto/etc
Developersfrequentlyworkingunderprojectdirectory
/home/projects,cansettheCDPATHvariableto/home/projects
End-usersfrequentlyaccessingthesubdirectoriesundertheir
homedirectory,cansettheCDPATHvariableto~(home
directory)
o
o
o
Hack2.UsecdaliastonavigateupthedirectoryeffectivelyWhenyouarenavigatingupaverylongdirectorystructure,youmaybeusing
cd....\withmultiple..\’sdependingonhowmanydirectoriesyouwanttogo
upasshownbelow.#mkdir-p
/tmp/very/long/directory/structure/that/is/too/deep
#cd/tmp/very/long/directory/structure/that/is/too/deep
#pwd
/tmp/very/long/directory/structure/that/is/too/deep
#cd../../../../
10
LinuxHack#pwd
/tmp/very/long/directory/structure
AjayKumarTiwari
Insteadofexecutingcd../../../..tonavigatefourlevelsup,useoneofthe
followingthreealiasmethods:
Method1:Navigateupthedirectoryusing“..n”Intheexamplebelow,..4isusedtogoup4directorylevel,..3togoup3
directorylevel,..2togoup2directorylevel.Addthefollowingaliastoyour
~/.bash_profileandre-login.
alias
alias
alias
alias
alias
..=“cd..”
..2=“cd../..”
..3=“cd../../..”
..4=“cd../../../..”
..5=“cd../../../../..”
#cd
/tmp/very/long/directory/structure/that/is/too/deep
#..4
[Note:use..4togoup4directorylevel]
#pwd
/tmp/very/long/directory/structure/
Method2:NavigateupthedirectoryusingonlydotsIntheexamplebelow,…..(fivedots)isusedtogoup4directorylevel.
Typing5dotstogoup4directorystructureisreallyeasytoremember,as
whenyoutypethefirsttwodots,youarethinking“goinguponedirectory”,
afterthateveryadditionaldot,istogoonelevelup.So,use….(fourdots)to
goup3directoryleveland..(twodots)togoup1directorylevel.Addthe
followingaliastoyour~/.bash_profileandre-loginforthe…..(fivedots)to
workproperly.
alias..=“cd..”
11
LinuxHackalias
alias
alias
alias
…=“cd../..”
….=“cd../../..”
…..=“cd../../../..”
……=“cd../../../../..”
AjayKumarTiwari#cd/tmp/very/long/directory/structure/that/is/too/deep
#…..
[Note:use…..(fivedots)togoup4directorylevel]
#pwd
/tmp/very/long/directory/structure/
Method3:Navigateupthedirectoryusingcdfollowedby
consecutivedotsIntheexamplebelow,cd…..(cdfollowedbyfivedots)isusedtogoup4
directorylevel.Makingit5dotstogoup4directorystructureisreallyeasyto
remember,aswhenyoutypethefirsttwodots,youarethinking“goingup
onedirectory”,afterthateveryadditionaldot,istogoonelevelup.So,use
cd….(cdfollowedbyfourdots)togoup3directorylevelandcd…(cd
followedbythreedots)togoup2directorylevel.Addthefollowingaliasto
your~/.bash_profileandre-loginfortheabovecd…..(fivedots)towork
properly.
alias
alias
alias
alias
alias
cd..=“cd..”
cd…=“cd../..”
cd….=“cd../../..”
cd…..=“cd../../../..”
cd……=“cd../../../../..”#cd/tmp/very/long/directory/structure/that/is/too/deep
#cd…..
[Note:usecd…..togoup4directorylevel]
#pwd
/tmp/very/long/directory/structure
12
LinuxHackAjayKumarTiwari
Method5:NavigateupthedirectoryusingcdfollowedbynumberIntheexamplebelow,cd4(cdfollowedbynumber4)isusedtogoup4
directorylevel.
alias
alias
alias
alias
alias
cd1=“cd
cd2=“cd
cd3=“cd
cd4=“cd
cd5=“cd
..”
../..”
../../..”
../../../..”
../../../../..”
Hack3.PerformmkdirandcdusingasinglecommandSometimeswhenyoucreateanewdirectory,youmaycdtothenewdirectory
immediatelytoperformsomeworkasshownbelow.
#mkdir-p/tmp/subdir1/subdir2/subdir3
#cd/tmp/subdir1/subdir2/subdir3
#pwd
/tmp/subdir1/subdir2/subdir3
Wouldn’titbenicetocombinebothmkdirandcdinasinglecommand?Add
thefollowingtothe.bash_profileandre-login.
$vi.bash_profile
functionmkdircd(){mkdir-p“$@”&&evalcd
“\”\$$#\””;}
Now,performbothmkdirandcdatthesametimeusingasinglecommandas
shownbelow:
13
LinuxHack#mkdircd/tmp/subdir1/subdir2/subdir3
AjayKumarTiwari
[Note:Thiscreatesthedirectoryandcdtoit
automatically]
#pwd
/tmp/subdir1/subdir2/subdir3
Hack4.Use“cd-”totogglebetweenthelasttwodirectoriesYoucantogglebetweenthelasttwocurrentdirectoriesusingcd-asshown
below.#cd/tmp/very/long/directory/structure/that/is/too/deep
#cd/tmp/subdir1/subdir2/subdir3
#cd-
#pwd
/tmp/very/long/directory/structure/that/is/too/deep
# cd-
#pwd
/tmp/subdir1/subdir2/subdir3
# cd-
#pwd
/tmp/very/long/directory/structure/that/is/too/deep
Hack5.Usedirs,pushdandpopdtomanipulatedirectorystackYoucanusedirectorystacktopushdirectoriesintoitandlaterpopdirectory
fromthestack.Followingthreecommandsareusedinthisexample.
14
LinuxHacko
o
o
dirs:Displaythedirectorystack
pushd:Pushdirectoryintothestack
AjayKumarTiwari
popd:Popdirectoryfromthestackandcdtoit
Dirswillalwaysprintthecurrentdirectoryfollowedbythecontentofthe
stack.Evenwhenthedirectorystackisempty,dirscommandwillstillprint
onlythecurrentdirectoryasshownbelow.
#popd
-bash:popd:directorystackempty
#dirs
~
#pwd
/home/ramesh
Howtousepushdandpopd?Letusfirstcreatesometemporarydirectories
andpushthemtothedirectorystackasshownbelow.
#
#
#
#
mkdir
mkdir
mkdir
mkdir
/tmp/dir1
/tmp/dir2
/tmp/dir3
/tmp/dir4
#cd/tmp/dir1
#pushd.
#cd/tmp/dir2
#pushd.
#cd/tmp/dir3
#pushd.
#cd/tmp/dir4
#pushd.
15
LinuxHackAjayKumarTiwari
#dirs
/tmp/dir4/tmp/dir4/tmp/dir3/tmp/dir2/tmp/dir1
[Note:Thefirstdirectory(/tmp/dir4)ofthedir
commandoutputisalwaysthecurrentdirectoryandnot
thecontentfromthestack.]
Atthisstage,thedirectorystackcontainsthefollowingdirectories:
/tmp/dir4
/tmp/dir3
/tmp/dir2
/tmp/dir1
Thelastdirectorythatwaspushedtothestackwillbeatthetop.Whenyou
performpopd,itwillcdtothetopdirectoryentryinthestackandremoveit
fromthestack.Asshownabove,thelastdirectorythatwaspushedintothe
stackis/tmp/dir4.So,whenwedoapopd,itwillcdtothe/tmp/dir4and
removeitfromthedirectorystackasshownbelow.
#popd
#pwd
/tmp/dir4
[Note:Aftertheabovepopd,directoryStackContains:
/tmp/dir3
/tmp/dir2
/tmp/dir1]
#popd
#pwd
/tmp/dir3
[Note:Aftertheabovepopd,directoryStackContains:
/tmp/dir2
/tmp/dir1]
#popd
16
LinuxHack#pwd
/tmp/dir2
AjayKumarTiwari
[Note:Aftertheabovepopd,directoryStackContains:
/tmp/dir1]
#popd
#pwd
/tmp/dir1
[Note:Aftertheabovepopd,directoryStackisempty!]
#popd
-bash:popd:directorystackempty
Hack6.Use“shopt-scdspell”toautomaticallycorrectmistypeddirectorynamesoncdUseshopt-scdspelltocorrectthetyposinthecdcommandautomaticallyas
shownbelow.Ifyouarenotgoodattypingandmakelotofmistakes,thiswill
beveryhelpful.
#cd/etc/mall
-bash:cd:/etc/mall:Nosuchfileordirectory
# shopt-scdspell
#cd/etc/mall
#pwd
/etc/mail
[Note:Bymistake,whenItypedmallinsteadofmail,
cdcorrecteditautomatically]
17
LinuxHackAjayKumarTiwari
Chapter2:DateManipulationHack7.SetSystemDateandTimeTochangethesystemdateuse:
#date{mmddhhmiyyyy.ss}
o
o
o
o
o
o
mm–Month
dd–Date
hh–24hourformat
mi–Minutes
yyyy–Year
ss–seconds
Forexample,tosetsystemdatetoJan31st2008,10:19p.m,53seconds
#date013122192009.53
Youcanalsochangesystemdateusingsetargumentasshownbelow.
#date013122192009.53
#date+%Y%m%d-s“20090131”
#date-s“01/31/200922:19:53”
#date-s“31JAN200922:19:53”
#dateset=“31JAN200922:19:53”
Tosetthetimeonly:
#date+%T-s“22:19:53”
18
LinuxHack#date+%T%p-s“10:19:53PM”
AjayKumarTiwari
Hack8.SetHardwareDateandTimeBeforesettingthehardwaredateandtime,makesuretheOSdateandtime
issetappropriatelyasshowninthehack#7.
Setthehardwaredateandtimebasedonthesystemdateasshownbelow:
#hwclock–systohc
#hwclock—systohc–utc
Usehwclockwithoutanyparameter,toviewthecurrenthardwaredateand
time:
#hwclock
ChecktheclockfiletoverifywhetherthesystemissetforUTC:
#cat/etc/sysconfig/clock
ZONE=“America/Los_Angeles”
UTC=false
ARC=false
Hack9.DisplayCurrentDateandTimeinaSpecificFormatFollowingaredifferentwaysofdisplayingthecurrentdateandtimein
variousformats:
19
LinuxHack$date
ThuJan
AjayKumarTiwari
108:19:23PST2009
$date—date=“now”
ThuJan108:20:05PST2009
$date—date=“today”
ThuJan108:20:12PST2009
$date—date=‘1970-01-0100:00:01UTC+5hours’+%s
18001
$date‘+CurrentDate:%m/%d/%y%nCurrentTime:%H:%M:%S’
CurrentDate:01/01/09
CurrentTime:08:21:41
$date+”%d-%m-%Y”
01-01-2009
$date+”%d/%m/%Y”
01/01/2009
$date+”%A,%B%d%Y”
Thursday,January012009
Followingarethedifferentformatoptionsyoucanpasstothedate
command:
o
o
o
o
o
o
%Ddate(mm/dd/yy)
%ddayofmonth(01..31)
%mmonth(01..12)
%ylasttwodigitsofyear(00..99)
%alocale’sabbreviatedweekdayname(Sun..Sat)
%Alocale’sfullweekdayname,variablelength
(Sunday..Saturday)
%blocale’sabbreviatedmonthname(Jan..Dec)
o
20
LinuxHacko
AjayKumarTiwari
%Blocale’sfullmonthname,variablelength
(January..December)
%Hhour(00..23)
%Ihour(01..12)
%Yyear(1970…)
o
o
o
Hack10.DisplayPastDateandTimeFollowingarevariouswaystodisplayapastdateandtime:
$date—date=‘3secondsago’
ThuJan108:27:00PST2009
$date—date=“1dayago”
WedDec3108:27:13PST2008
$date—date=“1daysago”
WedDec3108:27:18PST2008
$date—date=“1monthago”
MonDec108:27:23PST2008
$date—date=“1yearago”
TueJan108:27:28PST2008
$date—date=“yesterday”
WedDec3108:27:34PST2008
$date—date=“10months2dayago”
ThuFeb2808:27:41PST2008
21
LinuxHackAjayKumarTiwari
Hack11.DisplayFutureDateandTimeFollowingexamplesshowshowtodisplayafuturedateandtime.
$date
ThuJan
108:30:07PST2009
$date—date=‘3seconds’
ThuJan108:30:12PST2009
$date—date=‘4hours’
ThuJan112:30:17PST2009
$date—date=‘tomorrow’
FriJan208:30:25PST2009
$date—date=“1day”
FriJan208:30:31PST2009
$date—date=“1days”
FriJan208:30:38PST2009
$date—date=“2days”
SatJan308:30:43PST2009
$date—date=‘1month’
SunFeb108:30:48PST2009
$date—date=‘1week’
ThuJan808:30:53PST2009
$date—date=“2months”
SunMar108:30:58PST2009
$date—date=“2years”
SatJan108:31:03PST2011
$date—date=“nextday”
FriJan208:31:10PST2009
22
LinuxHack$date—date=”-1daysago”
FriJan208:31:15PST2009
$date—date=“thisWednesday”
WedJan700:00:00PST2009
AjayKumarTiwari
23
LinuxHackAjayKumarTiwari
Chapter3:SSHClientCommandsHack12.IdentifySSHClientVersionSometimesitmaybenecessarytoidentifytheSSHclientthatyouare
currentlyrunningandit’scorrespondingversionnumber.Usessh–Vto
identifytheversionnumber.PleasenotethatLinuxcomeswithOpenSSH.
ThefollowingexampleindicatesthatthisparticularsystemisusingOpenSSH:
$ssh-V
OpenSSH_3.9p1,OpenSSL0.9.7aFeb192003
ThefollowingexampleindicatesthatthisparticularsystemisusingSSH2:
$ssh-V
ssh:SSHSecureShell3.2.9.1(non-commercialversion)
oni686-pc-linux-gnu
Hack13.LogintoRemoteHostusingSSHTheFirsttimewhenyoulogintoaremotehostfromalocalhost,itwilldisplay
thehostkeynotfoundmessageandyoucangive“yes”tocontinue.Thehost
keyoftheremotehostwillbeaddedunder.ssh2/hostkeysdirectoryofyour
homedirectory,asshownbelow.
localhost$ ssh-ljsmithremotehost.example.comHostkeynotfoundfromdatabase.
Keyfingerprint:
xabie-dezbc-manud-bartd-satsy-limit-nexiu-jambl-title-jarde-
tuxum
Youcangetapublickey’sfingerprintbyrunning
%ssh-keygen-Fpublickey.pub
24
LinuxHackAjayKumarTiwarionthekeyfile.
Areyousureyouwanttocontinueconnecting(yes/no)? Yes
Hostkeysavedto
/home/jsmith/.ssh2/hostkeys/key_22_remotehost.example.com.pub
hostkeyforremotehost.example.com,acceptedbyjsmithMon
May26200816:06:50-0700
remotehost.example.com$
TheSecondtimewhenyoulogintotheremotehostfromthelocalhost,itwill
promptonlyforthepasswordastheremotehostkeyisalreadyaddedtothe
knownhostslistofthesshclient.
localhost$ ssh-ljsmithremotehost.example.com
remotehost.example.com$
Forsomereason,ifthehostkeyoftheremotehostischangedafteryou
loggedinforthefirsttime,youmaygetawarningmessageasshownbelow.
Thiscouldbebecauseofvariousreasonssuchas:
o
o
Sysadminupgraded/reinstalledtheSSHserverontheremotehost
Someoneisdoingmaliciousactivityetc.,
Thebestpossibleactiontotakebeforesaying“yes”tothemessagebelow,is
tocallyoursysadminandidentifywhyyougotthehostkeychangedmessage
andverifywhetheritisthecorrecthostkeyornot.
localhost$ ssh-ljsmithremotehost.example.com@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@WARNING:HOSTIDENTIFICATIONHASCHANGED!@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
ITISPOSSIBLETHATSOMEONEISDOINGSOMETHINGNASTY!
Someonecouldbeeavesdroppingonyourightnow(man-in-the-
25
LinuxHackAjayKumarTiwarimiddleattack)!
Itisalsopossiblethatthehostkeyhasjustbeenchanged.
Pleasecontactyoursystemadministrator.
Addcorrecthostkeyto
“/home/jsmith/.ssh2/hostkeys/key_22_remotehost.example.com.pu
b”
togetridofthismessage.
Receivedserverkey’sfingerprint:
xabie-dezbc-manud-bartd-satsy-limit-nexiu-jambl-title-arde-
tuxum
Youcangetapublickey’sfingerprintbyrunning
%ssh-keygen-Fpublickey.pub
onthekeyfile.
Agentforwardingisdisabledtoavoidattacksbycorrupted
servers.
Areyousureyouwanttocontinueconnecting(yes/no)? yes
Doyouwanttochangethehostkeyondisk(yes/no)? yes
Agentforwardingre-enabled.
Hostkeysavedto
/home/jsmith/.ssh2/hostkeys/key_22_remotehost.example.com.pub
hostkeyforremotehost.example.com,acceptedbyjsmithMon
May26200816:17:31-0700
[email protected]’spassword:
remotehost$
Hack14.DebugSSHClientSessionSometimesitisnecessarytoviewdebugmessagestotroubleshootanySSH
connectionissues.pass-v(lowercasev)optiontothesshasshownbelowto
viewthesshdebugmessages.
ExamplewithoutSSHclientdebugmessage:localhost$ ssh-ljsmithremotehost.example.com
warning:Connectingtoremotehost.example.comfailed:
Noaddressassociatedtothename
26
LinuxHackAjayKumarTiwari
ExamplewithSSHclientdebugmessage:locaclhost$ ssh-v-ljsmithremotehost.example.com
debug:
SshConfig/sshconfig.c:2838/ssh2_parse_config_ext:
Metaconfigparsingstoppedatline3.
debug:
SshConfig/sshconfig.c:637/ssh_config_set_param_verbose:
Settingvariable‘VerboseMode’to‘FALSE’.
debug:
SshConfig/sshconfig.c:3130/ssh_config_read_file_ext:
Read17paramsfromconfigfile.
debug:Ssh2/ssh2.c:1707/main:Userconfigfilenot
found,usingdefaults.(Lookedfor
‘/home/jsmith/.ssh2/ssh2_config’)
debug:Connectingtoremotehost.example.com,port22…
(SOCKSnotused)
warning:Connectingtoremotehost.example.comfailed:
Noaddressassociatedtothename
Hack15.ToggleSSHSessionusingSSHEscapeCharacterWhenyou’veloggedontotheremotehostusingsshfromthelocalhost,you
maywanttocomebacktothelocalhosttoperformsomeactivityandgoback
toremotehostagain.Inthiscase,youdon’tneedtodisconnectthessh
sessiontotheremotehost.Instead,followthestepsbelow.
1.Logintoremotehostfromlocalhost:
localhost$ssh-ljsmithremotehost
27
LinuxHackAjayKumarTiwari
2.Nowyouareconnectedtotheremotehost:
remotehost$
3.Tocomebacktothelocalhosttemporarily,typetheescapecharacter~
andControl-Z.
Whenyoutype~youwillnotseethatimmediatelyonthescreenuntilyou
press<Control-Z>andpressenter.So,ontheremotehostinanewlineenter
thefollowingkeystrokesforthebelowtowork:~<Control-Z>
remotehost$ ~^Z
[1]+Stoppedssh-ljsmithremotehost
localhost$
4.Nowyouarebacktothelocalhostandthesshremotehostclientsession
runsasatypicalUNIXbackgroundjob,whichyoucancheckasshownbelow:
localhost$ jobs
[1]+Stoppedssh-ljsmithremotehost
5.Youcangobacktotheremotehostsshwithoutenteringthepassword
againbybringingthebackgroundsshremotehostsessionjobtoforegroundon
thelocalhost.
localhost$ fg%1
ssh-ljsmithremotehost
remotehost$
28
LinuxHackAjayKumarTiwari
Hack16.SSHSessionStatisticsusingSSHEscapeCharacterTogetsomeusefulstatisticsaboutthecurrentsshsession,dothefollowing.
ThisworksonlyonSSH2client.
1.Logintoremotehostfromlocalhost.
localhost$ssh-ljsmithremotehost
2.Ontheremotehost,typesshescapecharacter~followedbysasshown
below.ThiswilldisplaylotofusefulstatisticsaboutthecurrentSSH
connection.
remotehost$[Note:The~sisnotvisibleonthe
commandlinewhenyoutype.]
remotehost:remotehost
localhost:localhost
remoteversion:SSH-1.99-OpenSSH_3.9p1
localversion:SSH-2.0-3.2.9.1SSHSecure
Shell(non-commercial)
compressedbytesin:1506
uncompressedbytesin:1622
compressedbytesout:4997
uncompressedbytesout:5118
packetsin:15
packetsout:24
rekeys:0
Algorithms:
Chosenkeyexchangealgorithm:diffie-hellman-
group1-sha1
Chosenhostkeyalgorithm:ssh-dss
Commonhostkeyalgorithms:ssh-dss,ssh-rsa
Algorithmsclienttoserver:
Cipher:aes128-cbc
MAC:hmac-sha1
Compression:zlib
29
LinuxHackAlgorithmsservertoclient:
Cipher:aes128-cbc
MAC:hmac-sha1
Compression:zlib
localhost$
AjayKumarTiwari
AdditionalSSHInfoOnasidenote,tosetupSSHkeybasedauthentication,referopenSSHand
SSH2tutorials.
30
LinuxHackAjayKumarTiwari
Chapter4:EssentialLinuxCommandsHack17.GrepCommandgrepcommandisusedtosearchfilesforaspecifictext.Thisisincredibly
powerfulcommandwithlotofoptions.
Syntax:grep[options]pattern[files]
HowcanIfindalllinesmatchingaspecifickeywordonafile?Inthisexample,greplooksforthetextJohninside/etc/passwdfileand
displaysallthematchinglines.
#grepJohn/etc/passwd
jsmith:x:1082:1082:JohnSmith:/home/jsmith:/bin/bash
jdoe:x:1083:1083:JohnDoe:/home/jdoe:/bin/bash
Option-v,willdisplayallthelinesexceptthematch.Intheexamplebelow,
itdisplaysalltherecordsfrom/etc/passwordthatdoesn’tmatchJohn.
Note: Thereareseverallinesinthe/etc/passwordthatdoesn’tcontainthe
wordJohn.Onlythefirstlineoftheoutputisshownbelow.
#grep-vJohn/etc/passwdjbourne:x:1084:1084:JasonBourne:/home/jbourne:/bin/bash
Howmanylinesmatchedthetextpatterninaparticularfile?Intheexamplebelow,itdisplaysthetotalnumberoflinesthatcontainsthe
textJohnin/etc/passwdfile.
31
LinuxHackAjayKumarTiwari
#grep-cJohn/etc/passwd
2
Youcanalsogetthetotalnumberoflinesthatdidnotmatchthespecific
patternbypassingoption-cv.
#grep-cvJohn/etc/passwd
39
Howtosearchatextbyignoringthecase?Passtheoption-i(ignorecase),whichwillignorethecasewhilesearching.
#grep-ijohn/etc/passwd
jsmith:x:1082:1082:JohnSmith:/home/jsmith:/bin/bash
jdoe:x:1083:1083:JohnDoe:/home/jdoe:/bin/bash
HowdoIsearchallsubdirectoriesforatextmatchingaspecific
pattern?Useoption-r(recursive)forthispurpose.Intheexamplebelow,itwillsearch
forthetext“John”byignoringthecaseinsideallthesubdirectoriesunder
/home/users.
Thiswilldisplaytheoutputintheformatof“filename:linethatmatchingthe
pattern”.Youcanalsopasstheoption-l,whichwilldisplayonlythenameof
thefilethatmatchesthepattern.
#grep-rijohn/home/users
/home/users/subdir1/letter.txt:John,Thanksforyour
contribution.
/home/users/name_list.txt:JohnSmith
32
LinuxHack/home/users/name_list.txt:JohnDoe
#grep-riljohn/root
/home/users/subdir1/letter.txt
/home/users/name_list.txt
AjayKumarTiwari
Hack18.FindCommandfindisfrequentlyusedcommandtofindfilesintheUNIXfilesystembasedon
numerousconditions.Letusreviewsomepracticeexamplesoffindcommand.
Syntax:find[pathnames][conditions]
Howtofindfilescontainingaspecificwordinitsname?Thefollowingcommandlooksforallthefilesunder/etcdirectorywithmail
inthefilename.
#find/etc-name“*mail*”
Howtofindallthefilesgreaterthancertainsize?Thefollowingcommandwilllistallthefilesinthesystemgreaterthan
100MB.
#find/-typef-size+100M
Howtofindfilesthatarenotmodifiedinthelastxnumberofdays?Thefollowingcommandwilllistallthefilesthatweremodifiedmorethan60
daysagounderthecurrentdirectory.
33
LinuxHack#find.-mtime+60
AjayKumarTiwari
Howtofindfilesthataremodifiedinthelastxnumberofdays?Thefollowingcommandwilllistallthefilesthatweremodifiedinthelast
twodaysunderthecurrentdirectory.
#find.–mtime-2
Howtodeleteallthearchivefileswithextension*.tar.gzand
greaterthan100MB?Pleasebecarefulwhileexecutingthefollowingcommandasyoudon’twant
todeletethefilesbymistake.Thebestpracticeistoexecutethesame
commandwithls–ltomakesureyouknowwhichfileswillgetdeletedwhen
youexecutethecommandwithrm.#find/-typef-name*.tar.gz-size+100M-execls-l{}\;
#find/-typef-name*.tar.gz-size+100M-execrm-f{}\;
Howtoarchiveallthefilesthatarenotmodifiedinthelastx
numberofdays?Thefollowingcommandfindsallthefilesnotmodifiedinthelast60days
under/home/jsmithdirectoryandcreatesanarchivefilesunder/tmpinthe
formatofddmmyyyy_archive.tar.
#find/home/jsmith-typef-mtime+60|xargstar-cvf
/tmp/`date‘+%d%m%Y’_archive.tar`
Onasidenote,youcanperformlotoffilerelatedactivities(includingfinding
files)usingmidnightcommanderGUI,apowerfultextbasedfilemanagerfor
Unix.
34
LinuxHackAjayKumarTiwari
Hack19.SuppressStandardOutputandErrorMessageSometimewhiledebuggingashellscript,youmaynotwanttoseeeitherthe
standardoutputorstandarderrormessage.Use/dev/nullasshownbelowfor
suppressingtheoutput.
Suppressstandardoutputusing>/dev/nullThiswillbeveryhelpfulwhenyouaredebuggingshellscripts,whereyou
don’twanttodisplaytheechostatementandinterestedinonlylookingat
theerrormessages.
#catfile.txt>/dev/null
#./shell-script.sh>/dev/null
Suppressstandarderrorusing2>/dev/nullThisisalsohelpfulwhenyouareinterestedinviewingonlythestandard
outputanddon’twanttoviewtheerrormessages.
#catinvalid-file-name.txt2>/dev/null
#./shell-script.sh2>/dev/null
Hack20.JoinCommandJoincommandcombineslinesfromtwofilesbasedonacommonfield.
Intheexamplebelow,wehavetwofiles–employee.txtandsalary.txt.Both
haveemployee-idascommonfield.So,wecanusejoincommandtocombine
35
LinuxHackAjayKumarTiwari
thedatafromthesetwofilesusingemployee-idasshownbelow.
$catemployee.txt
100
200
300
400
JasonSmith
JohnDoe
SanjayGupta
AshokSharma
$catbonus.txt
100
200
300
400
$5,000
$500
$3,000
$1,250
$ joinemployee.txtbonus.txt
100
200
300
400
JasonSmith$5,000
JohnDoe$500
SanjayGupta$3,000
AshokSharma$1,250
Hack21.ChangetheCase
Convertafiletoallupper-case$catemployee.txt
100
200
300
400
JasonSmith
JohnDoe
SanjayGupta
AshokSharma
$ tra-zA-Z<employee.txt
100JASONSMITH
200JOHNDOE
300SANJAYGUPTA
36
LinuxHack400ASHOKSHARMA
AjayKumarTiwari
Convertafiletoalllower-case$catdepartment.txt
100
200
300
400
FINANCE
MARKETING
PRODUCTDEVELOPMENT
SALES
$ trA-Za-z<department.txt
100
200
300
400
finance
marketing
productdevelopment
sales
Hack22.XargsCommandxargsisaverypowerfulcommandthattakesoutputofacommandandpassit
asargumentofanothercommand.Followingaresomepracticalexampleson
howtousexargseffectively.
1.Whenyouaretryingtodeletetoomanyfilesusingrm,youmaygeterror
message:/bin/rmArgumentlisttoolong–Linux.Usexargstoavoidthis
problem.
find~-name‘*.log’-print0|xargs-0rm-f
2.Getalistofallthe*.conffileunder/etc/.Therearedifferentwaystoget
thesameresult.Followingexampleisonlytodemonstratetheuseofxargs.
Theoutputofthefindcommandinthisexampleispassedtothels–loneby
oneusingxargs.
37
LinuxHackAjayKumarTiwari
#find/etc-name“*.conf”|xargsls–l
3.IfyouhaveafilewithlistofURLsthatyouwouldliketodownload,youcan
usexargsasshownbelow.
#caturl-list.txt|xargswget–c
4.Findoutallthejpgimagesandarchiveit.
#find/-name*.jpg-typef-print|xargstar-cvzf
images.tar.gz
5.Copyalltheimagestoanexternalhard-drive.
#ls*.jpg|xargs-n1-icp{}/external-hard-
drive/directory
Hack23.SortCommandSortcommandsortsthelinesofatextfile.Followingareseveralpractical
examplesonhowtousethesortcommandbasedonthefollowingsampletext
filethathasemployeeinformationintheformat:
employee_name:employee_id:department_name.
$ catnames.txt
EmmaThomas:100:Marketing
AlexJason:200:Sales
MadisonRandy:300:ProductDevelopment
SanjayGupta:400:Support
NishaSingh:500:Sales
38
LinuxHackAjayKumarTiwari
Sortatextfileinascendingorder$ sortnames.txt
AlexJason:200:Sales
EmmaThomas:100:Marketing
MadisonRandy:300:ProductDevelopment
NishaSingh:500:Sales
SanjayGupta:400:Support
Sortatextfileindescendingorder$ sort-rnames.txt
SanjayGupta:400:Support
NishaSingh:500:Sales
MadisonRandy:300:ProductDevelopment
EmmaThomas:100:Marketing
AlexJason:200:Sales
Sortacolondelimitedtextfileon2ndfield(employee_id)$ sort-t:-k2names.txt
EmmaThomas:100:Marketing
AlexJason:200:Sales
MadisonRandy:300:ProductDevelopment
SanjayGupta:400:Support
NishaSingh:500:Sales
Sortatabdelimitedtextfileon3rdfield(department_name)and
suppressduplicates$ sort-t:-u-k3names.txt
39
LinuxHackEmmaThomas:100:Marketing
MadisonRandy:300:ProductDevelopment
AlexJason:200:Sales
SanjayGupta:400:Support
AjayKumarTiwari
Sortthepasswdfilebythe3rdfield(numericuserid)$ sort-t:-k3n/etc/passwd|more
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
Sort/etc/hostsfilebyip-addres$ sort-t.-k1,1n-k2,2n-k3,3n-k4,4n/etc/hosts
127.0.0.1localhost.localdomainlocalhost
192.168.100.101dev-db.thegeekstuff.comdev-db
192.168.100.102prod-db.thegeekstuff.comprod-db
192.168.101.20dev-web.thegeekstuff.comdev-web
192.168.101.21prod-web.thegeekstuff.comprod-web
Combinesortwithothercommandso
o
ps–ef|sort :Sorttheoutputofprocesslist
ls-al|sort+4n :Listthefilesintheascendingorderofthefile-
size.i.esortedby5thfiledanddisplayingsmallestfilesfirst.
ls-al|sort+4nr :Listthefilesinthedescendingorderofthe
file-size.i.esortedby5thfiledanddisplayinglargestfilesfirst.
o
40
LinuxHackAjayKumarTiwari
Hack24.UniqCommandUniqcommandismostlyusedincombinationwithsortcommand,asuniq
removesduplicatesonlyfromasortedfile.i.eInorderforuniqtowork,all
theduplicateentriesshouldbeintheadjacentlines.Followingaresome
commonexamples.
1.Whenyouhaveanemployeefilewithduplicateentries,youcandothe
followingtoremoveduplicates.
$sortnamesd.txt|uniq
$sort–unamesd.txt
2.Ifyouwanttoknowhowmanylinesareduplicates,dothefollowing.The
firstfieldinthefollowingexamplesindicateshowmanyduplicateswhere
foundforthatparticularline.So,inthisexamplethelinesbeginningwith
AlexandEmmawerefoundtwiceinthenamesd.txtfile.
$ sortnamesd.txt|uniq–c
2
2
1
1
1
AlexJason:200:Sales
EmmaThomas:100:Marketing
MadisonRandy:300:ProductDevelopment
NishaSingh:500:Sales
SanjayGupta:400:Support
3.Thefollowingdisplaysonlytheentriesthatareduplicates.
$ sortnamesd.txt|uniq–cd
2AlexJason:200:Sales
2EmmaThomas:100:Marketing
41
LinuxHackAjayKumarTiwari
Hack25.CutCommandCutcommandcanbeusedtodisplayonlyspecificcolumnsfromatextfileor
othercommandoutputs.
Followingaresomeoftheexamples.
Displaythe1stfield(employeename)fromacolondelimitedfile$ cut-d:-f1names.txt
EmmaThomas
AlexJason
MadisonRandy
SanjayGupta
NishaSingh
Display1stand3rdfieldfromacolondelimitedfile$ cut-d:-f1,3names.txt
EmmaThomas:Marketing
AlexJason:Sales
MadisonRandy:ProductDevelopment
SanjayGupta:Support
NishaSingh:Sales
Displayonlythefirst8charactersofeverylineinafile$ cut-c1-8names.txt
EmmaTho
AlexJas
Madison
SanjayG
NishaSi
42
LinuxHackAjayKumarTiwari
MiscCutcommandexampleso
cut-d:-f1/etc/passwd Displaystheunixloginnamesforalltheusers
inthesystem.
free|tr-s‘‘|sed‘/^Mem/!d’|cut-d””-f2 Displaysthetotal
memoryavailableonthesystem.
o
Hack26.StatCommandStatcommandcanbeusedeithertocheckthestatus/propertiesofasingle
fileorthefilesystem.
Displaystatisticsofafileordirectory.$ stat/etc/my.cnf
File:
Size:
Device:
Access:
(0/
Access:
Modify:
Change:
`/etc/my.cnf’
346Blocks:16IOBlock:4096regularfile
801h/2049dInode:279856Links:1
(0644/-rw-r—r—)Uid:(0/root)Gid:
root)
2009-01-0102:58:30.000000000-0800
2006-06-0120:42:27.000000000-0700
2007-02-0214:17:27.000000000-0800
$ stat/home/ramesh
File:`/home/ramesh’
Size:4096Blocks:8IOBlock:
4096directory
Device:803h/2051dInode:5521409Links:7
Access:(0755/drwxr-xr-x)Uid:(401/ramesh)Gid:(
401/ramesh)
Access:2009-01-0112:17:42.000000000-0800
Modify:2009-01-0112:07:33.000000000-0800
Change:2009-01-0912:07:33.000000000-0800
43
LinuxHackAjayKumarTiwari
Displaythestatusofthefilesystemusingoption–f$ stat-f/
File:
ID:
Blocks:
1876998
Inodes:
“/”
0Namelen:255Type:ext2/ext3
Total:2579457Free:2008027Available:
Size:4096
Total:1310720Free:1215892
Hack27.DiffCommanddiffcommandcomparestwodifferentfilesandreportsthedifference.The
outputisverycrypticandnotstraightforwardtoread.
Syntax:diff[options]file1file2
Whatwasmodifiedinmynewfilewhencomparetomyoldfile?Theoption-winthediffcommandwillignorethewhitespacewhile
performingthecomparison.
Inthefollowingdiffoutput:
o
Thelinesabove–,indicatesthechangeshappenedinfirstfileinthe
diffcommand(i.ename_list.txt).
Thelinesbelow–,indicatesthechangeshappenedtothesecond
fileinthediffcommand(i.ename_list_new.txt).Thelinesthat
belongtothefirstfilestartswith<andthelinesofsecondfilestarts
with>.
o
# diff-wname_list.txtname_list_new.txt
44
LinuxHack2c2,3
<JohnDoe
–
>JohnMDoe
>JasonBourne
AjayKumarTiwari
Hack28.DisplaytotalconnecttimeofusersAccommandwilldisplaythestatisticsabouttheuser’sconnecttime.
ConnecttimeforthecurrentloggedinuserWiththeoption–d,itwillbreakdowntheoutputfortheindividualdays.In
thisexample,I’vebeenloggedintothesystemformorethan6hourstoday.
OnDec1st,Iwasloggedinforabout1hour.
$ ac–d
Dec1
Dec2
Dec3
Dec4
Today
total
total
total
total
total
1.08
0.99
3.39
4.50
6.10
ConnecttimeforalltheusersTodisplayconnecttimeforalltheusersuse–passhownbelow.Pleasenote
thatthisindicatesthecumulativeconnecttimefortheindividualusers.
$ ac-p
john
madison
sanjay
nisha
3.64
0.06
88.17
105.92
45
LinuxHackramesh
total309.21
AjayKumarTiwari
111.42
ConnecttimeforaspecificuserTogetaconnecttimereportforaspecificuser,executethefollowing:
$ ac-dsanjay
Jul2
Aug25
Sep3
Sep4
Dec24
Dec29
Today
total
total
total
total
total
total
total
12.85
5.05
1.03
5.37
8.15
1.42
2.95
46
LinuxHackAjayKumarTiwari
Chapter5:PS1,PS2,PS3,PS4andPROMPT_COMMANDHack29.PS1-DefaultInteractionPromptThedefaultinteractivepromptonyourLinuxcanbemodifiedasshownbelow
tosomethingusefulandinformative.Inthefollowingexample,thedefault
PS1was“\s-\v\$”,whichdisplaystheshellnameandtheversionnumber.Let
uschangethisdefaultbehaviortodisplaytheusername,hostnameand
currentworkingdirectorynameasshownbelow.
-bash-3.2$
exportPS1=”\u@\h\w>“
ramesh@dev-db~>cd/etc/mail
ramesh@dev-db/etc/mail>
[Note:Promptchangedto“username@hostnamecurrent-
dir>”format]
FollowingPS1codesareusedinthisexample:
o
o
o
\u–Username
\h–Hostname
\w-Fullpathnameofcurrentdirectory.Pleasenotethatwhen
youareinthehomedirectory,thiswilldisplayonly~asshown
above
NotethatthereisaspaceattheendinthevalueofPS1.Personally,Iprefer
aspaceattheendofthepromptforbetterreadability.
MakethissettingpermanentbyaddingexportPS1=”\u@\h\w>”toeither
.bash_profile(or).bashrcasshownbelow.
47
LinuxHackAjayKumarTiwari
ramesh@dev-db~>vi~/.bash_profile
ramesh@dev-db~>vi~/.bashrc
[Note:AddexportPS1=”\u@\h\w>”tooneoftheabove
files]
RefertothenextchapterforseveralpracticalexamplesofPS1usagein
detail.
Hack30.PS2-ContinuationInteractivePromptAverylongcommandcanbebrokendowntomultiplelinesbygiving\atthe
endoftheline.Thedefaultinteractivepromptforamulti-linecommandis
“>“.Letuschangethisdefaultbehaviortodisplay“continue->”byusingPS2
environmentvariableasshownbelow.
ramesh@dev-db~> myisamchk—silent—force—fast—
update-state\
> —key_buffer_size=512M—sort_buffer_size=512M\
> —read_buffer_size=4M—write_buffer_size=4M\
> /var/lib/mysql/bugs/*.MYI
[Note:Thisusesthedefault“>”forcontinuation
prompt]
ramesh@dev-db~> exportPS2=“continue->“
ramesh@dev-db~> myisamchk—silent—force—fast—
update-state\
continue-> —key_buffer_size=512M—
sort_buffer_size=512M\
continue-> —read_buffer_size=4M—write_buffer_size=4M
\
continue-> /var/lib/mysql/bugs/*.MYI
[Note:Thisusesthemodified“continue->”for
48
LinuxHackcontinuationprompt]
AjayKumarTiwari
Ifounditveryhelpfulandeasytoread,whenIbreakmylongcommandsinto
multiplelinesusing.Ihavealsoseenotherswhodon’tliketobreak-uplong
commands.
Hack31.PS3-Promptusedby“select”insideshellscriptYoucandefineacustompromptfortheselectloopinsideashellscript,using
thePS3environmentvariable,asexplainedbelow.
ShellscriptandoutputWITHOUTPS3:ramesh@dev-db~> catps3.sh
selectiinmontuewedexit
do
case$iin
mon)echo“Monday”;;
tue)echo“Tuesday”;;
wed)echo“Wednesday”;;
exit)exit;;
esac
done
ramesh@dev-db~> ./ps3.sh
1)mon
2)tue
3)wed
4)exit
#?1
Monday
#?4
[Note:Thisdisplaysthedefault“#?”forselect
commandprompt]
49
LinuxHackAjayKumarTiwari
ShellscriptandoutputWITHPS3:ramesh@dev-db~> catps3.sh
PS3=“Selectaday(1-4):“
selectiinmontuewedexit
do
case$iin
mon)echo“Monday”;;
tue)echo“Tuesday”;;
wed)echo“Wednesday”;;
exit)exit;;
esac
done
ramesh@dev-db~> ./ps3.sh
1)mon
2)tue
3)wed
4)exit
Selectaday(1-4):1
Monday
Selectaday(1-4):4
[Note:Thisdisplaysthemodified“Selectaday(1-4):”
forselectcommandprompt]
Hack32.PS4-Usedby“set-x”toprefixtracingoutputThePS4shellvariabledefinesthepromptthatgetsdisplayed,whenyou
executeashellscriptindebugmodeasshownbelow.
ShellscriptandoutputWITHOUTPS4:50
LinuxHackramesh@dev-db~> catps4.sh
set-x
echo“PS4demoscript”
ls-l/etc/|wc-l
du-sh~
ramesh@dev-db~> ./ps4.sh
++echo‘PS4demoscript’
PS4demoscript
++ls-l/etc/
++wc-l
243
++du-sh/home/ramesh
48K/home/ramesh
AjayKumarTiwari
[Note:Thisdisplaysthedefault“++”whiletracingthe
outputusingset-x]
ShellscriptandoutputWITHPS4:ThePS4definedbelowintheps4.shhasthefollowingtwocodes:
o
o
$0-indicatesthenameofscript
$LINENO-displaysthecurrentlinenumberwithinthescript
ramesh@dev-db~> catps4.sh
exportPS4=’$0.$LINENO+‘
set-x
echo“PS4demoscript”
ls-l/etc/|wc-l
du-sh~
ramesh@dev-db~> ./ps4.sh
../ps4.sh.3+echo‘PS4demoscript’
PS4demoscript
../ps4.sh.4+ls-l/etc/
51
LinuxHack../ps4.sh.4+wc-l
243
../ps4.sh.5+du-sh/home/ramesh
48K/home/ramesh
AjayKumarTiwari
[Note:Thisdisplaysthemodified“{script-name}.{line-
number}+”whiletracingtheoutputusingset-x]
Hack33.PROMPT_COMMANDBashshellexecutesthecontentofthePROMPT_COMMANDjustbefore
displayingthePS1variable.
ramesh@dev-db~> exportPROMPT_COMMAND=“date+%k:%m:%S”
22:08:42
ramesh@dev-db~>
[Note:ThisdisplaysthePROMPT_COMMANDandPS1output
ondifferentlines]
IfyouwanttodisplaythevalueofPROMPT_COMMANDinthesamelineasthe
PS1,usetheecho-nasshownbelow.
ramesh@dev-db~> exportPROMPT_COMMAND=“echo-n[$(date
+%k:%m:%S)]”
[22:08:51]ramesh@dev-db~>
[Note:ThisdisplaysthePROMPT_COMMANDandPS1output
onthesameline]
52
LinuxHackAjayKumarTiwari
Chapter6:ColorfulandFunctionalShellPromptUsingPS1Hack34.Displayusername,hostnameandbasenameofdirectoryinthepromptThePS1inthisexampledisplaysfollowingthreeinformationintheprompt:
o
o
o
\u–Username
\h–Hostname
\W–Basenameofthecurrentworkingdirectory
-bash-3.2$ exportPS1=”\u@\h\W>“
ramesh@dev-db~>cd/etc/mail
ramesh@dev-dbmail>
Hack35.DisplaycurrenttimeinthepromptInthePS1environmentvariable,youcandirectlyexecuteanyLinux
command,byspecifyingintheformat$(linux_command).Inthefollowing
example,thecommand$(date)isexecutedtodisplaythecurrenttimeinside
theprompt.
ramesh@dev-db~> exportPS1=”\u@\h[\$(date
+%k:%m:%S)]>“
ramesh@dev-db[11:09:56]>
53
LinuxHackAjayKumarTiwari
Youcanalsouse\ttodisplaythecurrenttimeinthehh:mm:ssformatas
shownbelow:
ramesh@dev-db~> exportPS1=”\u@\h[\t]>“
ramesh@dev-db[12:42:55]>
Youcanalsouse\@todisplaythecurrenttimein12-houram/pmformatas
shownbelow:
ramesh@dev-db~> exportPS1=”[\@]\u@\h>“
[04:12PM]ramesh@dev-db>
Hack36.DisplayoutputofanycommandinthepromptYoucandisplayoutputofanyLinuxcommandintheprompt.Thefollowing
exampledisplaysthreeitemsseparatedby|(pipe)inthecommandprompt:
o
o
o
\!:Thehistorynumberofthecommand
\h:hostname
$kernel_version:Theoutputoftheuname-rcommandfrom
$kernel_versionvariable
\$?:Statusofthelastcommand
o
ramesh@dev-db~> kernel_version=$(uname-r)ramesh@dev-db~> exportPS1=”\!|\h|$kernel_version|\$?>“
473|dev-db|2.6.25-14.fc9.i686|0>
54
LinuxHackAjayKumarTiwari
Hack37.ChangeforegroundcolorofthepromptDisplaypromptinbluecolor,alongwithusername,hostandcurrentdirectory
information
$ exportPS1=”\e[0;34m\u@\h\w>\e[m“
[Note:Thisisforlightblueprompt]
$ exportPS1=”\e[1;34m\u@\h\w>\e[m“
[Note:Thisisfordarkblueprompt]
\e[-Indicatesthebeginningofcolorprompt
x;ym-Indicatescolorcode.Usethecolorcodevaluesmentioned
below.
\e[m-indicatestheendofcolorprompt
o
o
o
ColorCodeTable:Black0;30
Blue0;34
Green0;32
Cyan0;36
Red0;31
Purple0;35
Brown0;33
[Note:Replace0with1fordarkcolor]
Makethecolorchangepermanentbyaddingthefollowinglinesyour
~/.bash_profileor~/.bashrc
$vi~/.bash_profile
55
LinuxHackAjayKumarTiwari
STARTCOLOR=’\e[0;34m’;
ENDCOLOR=”\e[0m”
exportPS1=”$STARTCOLOR\u@\h\w>$ENDCOLOR”
Hack38.ChangebackgroundcolorofthepromptChangethebackgroundcolorbyspecifying\e[{code}minthePS1promptas
shownbelow.
$ exportPS1=”\e[47m\u@\h\w>\e[m“
[Note:ThisisforLightGraybackground]
Combinationofbackgroundandforeground.
$ exportPS1=”\e[0;34m\e[47m\u@\h\w>\e[m“
[Note:ThisisforLightBlueforegroundandLightGray
background]
Addthefollowingtoyour~/.bash_profileor~/.bashrctomaketheabove
backgroundandforegroundcolorpermanent.
$vi~/.bash_profile
STARTFGCOLOR=’\e[0;34m’;
STARTBGCOLOR=”\e[47m”
ENDCOLOR=”\e[0m”
exportPS1=”$STARTFGCOLOR$STARTBGCOLOR\u@\h\w>
$ENDCOLOR”
Playaroundbyusingthefollowingbackgroundcolorandchoosetheonethat
matchyourtaste:
o
\e[40m
56
LinuxHacko
o
o
o
o
o
o
\e[41m
\e[42m
\e[43m
\e[44m
\e[45m
\e[46m
\e[47m
AjayKumarTiwari
Hack39.DisplaymultiplecolorsinthepromptYoucanalsodisplaymultiplecolorsinthesameprompt.Addthefollowing
functiontoyour~/.bash_profile
functionprompt{
localBLUE=”\[\033[0;34m\]”
localDARK_BLUE=”\[\033[1;34m\]”
localRED=”\[\033[0;31m\]”
localDARK_RED=”\[\033[1;31m\]”
localNO_COLOR=”\[\033[0m\]”
case$TERMin
xterm*|rxvt*)
TITLEBAR=’\[\033]0;\u@\h:\w\007\]’
;;
*)
TITLEBAR=””
;;
esac
PS1=”\u@\h[\t]>”
PS1=”${TITLEBAR}\
$BLUE\u@\h$RED[\t]>$NO_COLOR”
PS2=’continue->‘
PS4=’$0.$LINENO+‘
}
57
LinuxHackAjayKumarTiwari
Youcanre-loginforthechangestotakeeffectorsourcethe.bash_profileas
shownbelow.
$../.bash_profile
$ prompt
ramesh@dev-db[13:02:13]>
Hack40.ChangethepromptcolorusingtputYoucanalsochangecolorofthePS1promptusingtputasshownbelow:
$exportPS1=”\[$(tputbold)$(tputsetb4)$(tputsetaf
7)\]\u@\h:\w$\[$(tputsgr0)\]“
tputColorCapabilities:
o
o
o
o
tputsetab[1-7]-SetabackgroundcolorusingANSIescape
tputsetb[1-7]-Setabackgroundcolor
tputsetaf[1-7]-SetaforegroundcolorusingANSIescape
tputsetf[1-7]-Setaforegroundcolor
tputTextModeCapabilities:
o
o
o
o
o
tputbold-Setboldmode
tputdim-turnonhalf-brightmode
tputsmul-beginunderlinemode
tputrmul-exitunderlinemode
tputrev-Turnonreversemode
58
LinuxHacko
o
o
AjayKumarTiwari
tputsmso-Enterstandoutmode(boldonrxvt)
tputrmso-Exitstandoutmode
tputsgr0-Turnoffallattributes
ColorCodefortput:
o
o
o
o
o
o
o
o
0–Black
1–Red
2–Green
3–Yellow
4–Blue
5–Magenta
6–Cyan
7-White
Hack41.CreateyourownpromptusingtheavailablecodesforPS1variableUsethefollowingcodesandcreateyourownpersonalPS1Linuxpromptthat
isfunctionalandsuitesyourtaste.
o
o
\aanASCIIbellcharacter(07)
\dthedatein“WeekdayMonthDate”format(e.g.,“TueMay
26″)
\D{format}-theformatispassedtostrftime(3)andtheresultis
insertedintothepromptstring;anemptyformatresultsina
locale-specifictimerepresentation.Thebracesarerequired
\eanASCIIescapecharacter(033)
o
o
59
LinuxHacko
o
o
o
o
o
o
\hthehostnameuptothefirstpart
\Hthehostname
AjayKumarTiwari
\jthenumberofjobscurrentlymanagedbytheshell
\lthebasenameoftheshell’sterminaldevicename
\nnewline
\rcarriagereturn
\sthenameoftheshell,thebasenameof$0(theportion
followingthefinalslash)
\tthecurrenttimein24-hourHH:MM:SSformat
\Tthecurrenttimein12-hourHH:MM:SSformat
\@thecurrenttimein12-houram/pmformat
\Athecurrenttimein24-hourHH:MMformat
\utheusernameofthecurrentuser
\vtheversionofbash(e.g.,2.00)
\Vthereleaseofbash,version+patchlevel(e.g.,2.00.0)
\wthecurrentworkingdirectory,with$HOMEabbreviatedwitha
tilde
\Wthebasenameofthecurrentworkingdirectory,with$HOME
abbreviatedwithatilde
\!thehistorynumberofthiscommand
\#thecommandnumberofthiscommand
\$iftheeffectiveUIDis0,a#,otherwisea$
\nnnthecharactercorrespondingtotheoctalnumbernnn
\abackslash
\[beginasequenceofnon-printingcharacters,whichcouldbe
usedtoembedaterminalcontrolsequenceintotheprompt
60
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
LinuxHacko
AjayKumarTiwari
\]endasequenceofnon-printingcharacter
Hack42.UsebashshellfunctioninsidePS1variableYoucanalsoinvokeabashshellfunctioninthePS1asshownbelow.
ramesh@dev-db~>functionhttpdcount{
>psaux|grephttpd|grep-vgrep|wc-l
>}
ramesh@dev-db~> exportPS1=”\u@\h[`httpdcount`]>“
ramesh@dev-db[12]>
[Note:Thisdisplaysthetotalnumberofrunninghttpd
processes]
Youcanaddthefollowinglinetoyour~/.bash_profileor~/.bashrctomake
thischangepermanent:
$vi.bash_profile
functionhttpdcount{
psaux|grephttpd|grep-vgrep|wc-l
}
exportPS1=’\u@\h[`httpdcount`]>‘
Hack43.UseshellscriptinsidePS1variableYoucanalsoinvokeashellscriptinsidethePS1variable.Intheexample
below,the~/bin/totalfilesize.sh,whichcalculatesthetotalfilesizeofthe
currentdirectory,isinvokedinsidethePS1variable.
ramesh@dev-db~>cat~/bin/totalfilesize.sh
61
LinuxHackAjayKumarTiwari
forfilesizein$(ls-l.|grep“^-”|awk‘{print
$5}’)
do
lettotalsize=$totalsize+$filesize
done
echo-n“$totalsize”
ramesh@dev-db~>exportPATH=$PATH:~/bin
ramesh@dev-db~> exportPS1=”\u@\h
[\$(totalfilesize.sh)bytes]>“
ramesh@dev-db[534bytes]>cd/etc/mail
ramesh@dev-db[167997bytes]>
[Note:Thisexecutesthetotalfilesize.shtodisplay
thetotalfilesizeofthecurrentdirectoryinthePS1
prompt]
62
LinuxHackAjayKumarTiwari
Chapter7:ArchiveandCompressionHack44.ZipcommandbasicsHowtozipmultiplefiles?syntax:zip{.zipfile-name}{file-names}
#zipvar-log-files.zip/var/log/*
adding:var/log/acpid(deflated81%)
adding:var/log/anaconda.log(deflated79%)
adding:var/log/anaconda.syslog(deflated73%)
adding:var/log/anaconda.xlog(deflated82%)
adding:var/log/audit/(stored0%)
adding:var/log/boot.log(stored0%)
adding:var/log/boot.log.1(deflated40%)
adding:var/log/boot.log.2(deflated42%)
adding:var/log/boot.log.3(deflated40%)
adding:var/log/boot.log.4(deflated40%)
Howtozipadirectoryandit’sfilesrecursively?#zip-rvar-log-dir.zip/var/log/
updating:var/log/(stored0%)
adding:var/log/wtmp(deflated78%)
adding:var/log/scrollkeeper.log(deflated94%)
adding:var/log/rpmpkgs.3(deflated68%)
adding:var/log/spooler(stored0%)
adding:var/log/cron.2(deflated90%)
adding:var/log/spooler.1(stored0%)
adding:var/log/spooler.4(stored0%)
adding:var/log/httpd/(stored0%)
adding:var/log/rpmpkgs.1(deflated68%)
adding:var/log/anaconda.log(deflated79%)
adding:var/log/secure.2(deflated93%)
63
LinuxHack
Howtounzipa*.zipcompressedfile?#unzipvar-log.zip
Archive:var-log.zip
inflating:var/log/acpid
inflating:var/log/anaconda.log
inflating:var/log/anaconda.syslog
inflating:var/log/anaconda.xlog
creating:var/log/audit/
AjayKumarTiwari
Toseeadetailedoutputduringunzippassthe–voptionasshownbelow.# unzip-vvar-log.zip
Archive:var-log.zip
LengthMethodSizeRatioDateTime
Name
––—––––-––––-
-
1916Defl:N36981%02-08-0814:27
var/log/acpid
13546Defl:N290079%02-02-0714:25
var/log/anaconda.log
skip..
7680Defl:N411
var/log/wtmp.1
40981Defl:N7395
var/log/Xorg.0.log
–––––
–-
414069912809229
files
95%
82%
–
93%
12-30-0810:55
02-08-0814:28
fe876ee9
6386a95e
–
56
CRC-32
––
e2ffdc0c
34cc03a1
–
Howtolistacontentofzipfilewithuncompressingit?# unzip-lvar-log.zip
Archive:var-log.zip
LengthDateTime
–––––-
191602-08-0814:27
Name
–-
var/log/acpid
64
LinuxHack13546
..skip..
40981
40981
––—
41406991
02-08-0814:28
02-08-0714:56
02-02-0714:25
AjayKumarTiwari
var/log/anaconda.log
var/log/Xorg.0.log
var/log/Xorg.0.log.old
––-
56files
Hack45.Advancedcompressionusingzipcommand.Thereare10levelsofcompressionprovidedbyzipcommand.
o
Level0isthelowestlevel,whereitjustarchivesthefilewithout
anycompression.
Level1willperformlittlecompression.But,willbeveryfast.
Level6isthedefaultlevelofcompression.
Level9isthemaximumcompression.Thiswillbeslowerwhen
comparedtodefaultlevel.Inmyopinion,unlessyouare
compressingahugefile,youshouldalwaysuselevel9.
o
o
o
Intheexamplebelow,IusedLevel0,defaultLevel6,andLevel9
compressiononasamedirectory.Seethecompressedfilesizeyourself.
#zipvar-log-files-default.zip/var/log/*
#zip-0var-log-files-0.zip/var/log/*
#zip-9var-log-files-9.zip/var/log/*
#ls-ltr-rw-r—r—1rootroot
var-log-files-default.zip
-rw-r—r—1rootroot
var-log-files-0.zip
-rw-r—r—1rootroot
var-log-files-9.zip
2817248Jan
41415301Jan
2582610Jan
113:05
113:05
113:06
65
LinuxHackAjayKumarTiwari
Hack46.PasswordProtectionofZipfilesPasstheoption–Ptothezipcommandtoassignapasswordtothezipfile.
#zip-Pmysecurepwdvar-log-protected.zip/var/log/*
Theaboveoptionisgoodifyouareusingthecommandinsideashell-script
forbackgroundjobs.However,whenyouareperformingthecompression
interactivelyonthecommand-line,youdon’twantthepasswordtobevisible
inthehistory.So,usetheoption–easshownbelowtoassignthepassword.
#zip-evar-log-protected.zip/var/log/*
Enterpassword:
Verifypassword:
updating:var/log/acpid(deflated81%)
updating:var/log/anaconda.log(deflated79%)
Whenyouareuncompressingapasswordprotectedfile,itwillaskforthe
passwordasshownbelow.
#unzipvar-log-protected.zip
Archive:var-log-protected.zip
[var-log-protected.zip]var/log/acpidpassword:
Hack47.ValidateaziparchiveSometimeyoumaywanttovalidateaziparchivewithoutextractingit.To
testthevalidityofthezipfile,passoption–tasshownbelow.
# unzip-tvar-log.zip
Archive:var-log.zip
testing:var/log/acpid
testing:var/log/anaconda.log
66
OK
OK
LinuxHacktesting:var/log/anaconda.syslog
skip…
testing:var/log/wtmp
testing:var/log/wtmp.1
testing:var/log/Xorg.0.log
AjayKumarTiwari
OK
OK
OK
OK
Noerrorsdetectedincompresseddataofvar-log.zip.
Hack48.TarCommandBasicstarcommand(tapearchive)isusedtoconvertagroupoffilesintoan
archive.
Syntax:tar[options][tar-archive-name][other-file-
names]
HowcanIcreateasinglebackupfileofallfilesandsubdirectories
undermyhomedirectory?Thefollowingcommandcreatesasinglearchivebackupfilecalled
my_home_directory.tarunder/tmp.Thisarchivewillcontainallthefilesand
subdirectoriesunder/home/jsmith.
o
o
Optionc,standsforcreateanarchive.
Optionvstandsforverbosemode,displaysadditionalinformation
whileexecutingthecommand.
Optionfindicatesthearchivefilenamementionedinthecommand.
o
#tarcvf/tmp/my_home_directory.tar/home/jsmith
67
LinuxHackAjayKumarTiwari
HowdoIviewallthefilesinsidethetararchive?Optiontwilldisplayallthefilesfromthetararchive.
#tartvf/tmp/my_home_directory.tar
HowdoIextractallthefilesfromatararchive?Optionxwillextractthefilesfromthetararchiveasshownbelow.Thiswill
extractthecontenttothecurrentdirectorylocationfromwherethe
commandisexecuted.
#tarxvf/tmp/my_home_directory.tar
HowdoIextracttar.gzfilestoaspecificdirectory?#tarxvfz/tmp/my_home_directory.tar.gz–C
/home/ramesh
Hack49.Combinegzip,bzip2withtarHowtousegzipwithtar?Add optionz tothetarcommandwhendealingwithtar.gzcompressedfile.
#tarcvfz/tmp/my_home_directory.tar.gz/home/jsmith
#tarxvfz/tmp/my_home_directory.tar.gz
#tartvfz/tmp/my_home_directory.tar.gz
Note: Usinggzipisfasterwhencomparedtobzip2.
68
LinuxHackAjayKumarTiwari
Howtousebzip2withtar?Add optionj tothetarcommandwhendealingwithtar.bz2compressedfile.
#tarcvfj/tmp/my_home_directory.tar.bz2/home/jsmith
#tarxvfj/tmp/my_home_directory.tar.bz2
#tartvfj/tmp/my_home_directory.tar.bz2
Note: Usingbizp2giveshigherlevelofcompressionwhencomparedtogzip.
69
LinuxHackAjayKumarTiwari
Chapter8:CommandLineHistoryWhenyouareusingLinuxcommandlinefrequently,usingthehistory
effectivelycanbeamajorproductivityboost.Infact,onceyouhave
masteredthe15examplesthatI’veprovidedhere,you’llfindusingcommand
linemoreenjoyableandfun.
Hack50.DisplayTIMESTAMPinhistoryusingHISTTIMEFORMATTypicallywhenyoutypehistoryfromcommandline,itdisplaysthe
command#andthecommand.Forauditingpurpose,itmaybebeneficialto
displaythetimestampalongwiththecommandasshownbelow.
# exportHISTTIMEFORMAT=’%F%T‘
#history
1
2
3
4
|more
2008-08-05
2008-08-05
2008-08-05
2008-08-05
19:02:39
19:02:39
19:02:39
19:02:39
servicenetworkrestart
exit
id
cat/etc/redhat-release
Note: Youcanalsosetupthefollowingaliastoviewtherecenthistory
commands.
aliash1=‘history10’
aliash2=‘history20’
aliash3=‘history30’
Hack51.SearchthehistoryusingControl+RIstronglybelievethatthismaybeyourmostfrequentlyusedfeatureof
history.Whenyou’vealreadyexecutedaverylongcommand,youcansimply
70
LinuxHackAjayKumarTiwari
searchhistoryusingakeywordandre-executethesamecommandwithout
havingtotypeitfully.PressControl+Randtypethekeyword.
Inthefollowingexample,Isearchedforred,whichdisplayedtheprevious
command“cat/etc/redhat-release”inthehistorythatcontainedtheword
red.
#[Note:PressCtrl+Rfromthecommandprompt,which
willdisplaythereverse-i-searchpromptasshown
below]
(reverse-i-search)`red‘:cat/etc/redhat-release
[Note:Pressenterwhenyouseeyourcommand,which
willexecutethecommandfromthehistory]
# cat/etc/redhat-release
Fedorarelease9(Sulphur)
Sometimesyouwanttoeditacommandfromhistorybeforeexecutingit.For
e.g.youcansearchforhttpd,whichwilldisplayservicehttpdstopfromthe
commandhistory,selectthiscommandandchangethestoptostartandre-
executeitagainasshownbelow.
#[Note:PressCtrl+Rfromthecommandprompt,which
willdisplaythereverse-i-searchprompt]
(reverse-i-search)`httpd‘:servicehttpdstop
[Note:Presseitherleftarroworrightarrowkeywhen
youseeyourcommand,whichwilldisplaythecommand
foryoutoedit,beforeexecutingit]
#servicehttpdstart
71
LinuxHackAjayKumarTiwari
Hack52.Repeatpreviouscommandquicklyusing4differentmethodsSometimeyoumayenduprepeatingthepreviouscommandsforvarious
reasons.Followingarethe4differentwaystorepeatthelastexecuted
command.
1.Usethe uparrow toviewthepreviouscommandandpressenter
toexecuteit.
2. Type!! andpressenterfromthecommandline
3. Type!-1 andpressenterfromthecommandline.
4. PressControl+P willdisplaythepreviouscommand,pressenter
toexecuteit
Hack53.ExecuteaspecificcommandfromhistoryInthefollowingexample,Ifyouwanttorepeatthecommand#4,execute!4
asshownbelow.
#history
1
2
3
4
|more
servicenetworkrestart
exit
id
cat/etc/redhat-release
# !4
cat/etc/redhat-release
Fedorarelease9(Sulphur)
72
LinuxHackAjayKumarTiwari
Hack54.ExecutepreviouscommandthatstartswithaspecificwordType!followedbythestartingfewlettersofthecommandthatyouwould
liketore-execute.Inthefollowingexample,typing!psandenter,executed
thepreviouscommandstartingwithps,whichis‘psaux|grepyp’.
# !ps
psaux|grepyp
root169470.0
Sl13:100:00ypbind
root175030.0
S+19:190:00grepyp
0.1
0.0
36516
4124
1264?
740pts/0
Hack55.ControlthetotalnumberoflinesinthehistoryusingHISTSIZEAppendthefollowingtwolinestothe.bash_profileandrelogintothebash
shellagaintoseethechange.Inthisexample,only450commandwillbe
storedinthebashhistory.
#vi~/.bash_profile
HISTSIZE=450
HISTFILESIZE=450
Hack56.ChangethehistoryfilenameusingHISTFILEBydefault,historyisstoredin~/.bash_historyfile.Addthefollowinglineto
the.bash_profileandrelogintothebashshell,tostorethehistorycommand
in.commandline_warriorfileinsteadof.bash_historyfile.I’myettofigure
outapracticaluseforthis.Icanseethisgettingusedwhenyouwanttotrack
commandsexecutedfromdifferentterminalsusingdifferenthistoryfile
name.
73
LinuxHackAjayKumarTiwari
#vi~/.bash_profile
HISTFILE=/root/.commandline_warrior
Hack57.EliminatethecontinuousrepeatedentryfromhistoryusingHISTCONTROLInthefollowingexamplepwdwastypedthreetimes,whenyoudohistory,
youcanseeallthe3continuousoccurrencesofit.Toeliminateduplicates,
setHISTCONTROLtoignoredupsasshownbelow.
#pwd
#pwd
#pwd
#history|tail-4
44pwd
45pwd
46pwd
47history|tail-4
[Note:Therearethreepwdcommandsinhistory,after
executingpwd3timesasshownabove]
# exportHISTCONTROL=ignoredups
#pwd
#pwd
#pwd
#history|tail-3
56exportHISTCONTROL=ignoredups
57pwd
58history|tail-4
74
LinuxHackAjayKumarTiwari
[Note:Thereisonlyonepwdcommandinthehistory,
evenafterexecutingpwd3timesasshownabove]
Hack58.EraseduplicatesacrossthewholehistoryusingHISTCONTROLTheignoredupsshownaboveremovesduplicatesonlyiftheyareconsecutive
commands.Toeliminateduplicatesacrossthewholehistory,setthe
HISTCONTROLtoerasedupsasshownbelow.
# exportHISTCONTROL=erasedups
#pwd
#servicehttpdstop
#history|tail-3
38pwd
39servicehttpdstop
40history|tail-3
#ls-ltr
#servicehttpdstop
#history|tail-6
35exportHISTCONTROL=erasedups
36pwd
37history|tail-3
38ls–ltr
39servicehttpdstop
40history|tail-6
[Note:Thepreviousservicehttpdstopafterpwdgot
erased]
75
LinuxHackAjayKumarTiwari
Hack59.ForcehistorynottorememberaparticularcommandusingHISTCONTROLWhenyouexecuteacommand,youcaninstructhistorytoignorethe
commandbysettingHISTCONTROLtoignorespaceANDtypingaspaceinfront
ofthecommandasshownbelow.Icanseelotofjuniorsysadminsgetting
excitedaboutthis,astheycanhideacommandfromthehistory.
Itisgoodtounderstandhowignorespaceworks.But,asabestpractice,don’t
hidepurposefullyanythingfromhistory.
# exportHISTCONTROL=ignorespace
#ls–ltr
#pwd
#
servicehttpdstop
[Note:Thereisaspaceatthebeginningofservice,
toignorethiscommandfromhistory]
#history|tail-3
67ls–ltr
68pwd
69history|tail-3
Hack60.Clearalltheprevioushistoryusingoption-cSometimeyoumaywanttoclearalltheprevioushistory.Howeveryoumay
stillwanttokeepthehistorymovingforward.
# history-c
76
LinuxHackAjayKumarTiwari
Hack61.SubstitutewordsfromhistorycommandsWhenyouaresearchingthroughhistory,youmaywanttoexecuteadifferent
commandbutusethesameparameterfromthecommandthatyou’vejust
searched.
Intheexamplebelow,the!!:$nexttothevicommandgetstheargument
fromthepreviouscommandtothecurrentcommand.
#lsanaconda-ks.cfg
anaconda-ks.cfg
#vi!!:$
vianaconda-ks.cfg
Intheexamplebelow,the!^nexttothevicommandgetsthefirstargument
fromthepreviouscommand(i.ecpcommand)tothecurrentcommand(i.evi
command).
#cpanaconda-ks.cfganaconda-ks.cfg.bak
anaconda-ks.cfg
#vi!^
vianaconda-ks.cfg
Hack62.SubstituteaspecificargumentforaspecificcommandIntheexamplebelow,!cp:2searchesforthepreviouscommandinhistory
thatstartswithcpandtakesthesecondargumentofcpandsubstitutesitfor
thels-lcommandasshownbelow.
77
LinuxHackAjayKumarTiwari
#cp~/longname.txt/really/a/very/long/path/long-
filename.txt
#ls-l!cp:2
ls-l/really/a/very/long/path/long-filename.txt
Intheexamplebelow,!cp:$searchesforthepreviouscommandinhistory
thatstartswithcpandtakesthelastargument(inthiscase,whichisalsothe
secondargumentasshownabove)ofcpandsubstitutesitforthels-l
commandasshownbelow.
#ls-l!cp:$
ls-l/really/a/very/long/path/long-filename.txt
Hack63.DisabletheusageofhistoryusingHISTSIZEIfyouwanttodisablehistoryalltogetheranddon’twantbashshellto
rememberthecommandsyou’vetyped,settheHISTSIZEto0asshownbelow.
# exportHISTSIZE=0
#history
#[Note:
Historydidnotdisplayanything]
Hack64.IgnorespecificcommandsfromthehistoryusingHISTIGNORESometimesyoumaynotwanttoclutteryourhistorywithbasiccommands
suchaspwdandls.UseHISTIGNOREtospecifyallthecommandsthatyou
wanttoignorefromthehistory.
78
LinuxHackAjayKumarTiwari
PleasenotethataddinglstotheHISTIGNOREignoresonlylsandnotls-l.So,
youhavetoprovidetheexactcommandthatyouwouldliketoignorefrom
thehistory.
# exportHISTIGNORE=”pwd:ls:ls–ltr:”
#pwd
#ls
#ls-ltr
#servicehttpdstop
#history|tail-3
79exportHISTIGNORE=”pwd:ls:ls-ltr:”
80servicehttpdstop
81history
[Note:Historydidnotdisplaypwdandls]
79
LinuxHackAjayKumarTiwari
Chapter9:SystemAdministrationTasksHack65.PartitionusingfdiskAfteryou’veinstalledbrandnewdisksonyourserver,youhavetousetools
likefdisktopartitionitaccordingly.
Followingarethe5typicalactions(commands)thatyoucanexecuteinside
fdisk.
o
o
o
o
o
n–NewPartitioncreation
d–Deleteanexistingpartition
p-PrintPartitionTable
w–Writethechangestothepartitiontable.i.esave.
q–Quitthefdiskutility
CreateapartitionInthefollowingexample,Icreateda/dev/sda1primarypartition.
# fdisk/dev/sda
DevicecontainsneitheravalidDOSpartitiontable,
norSun,SGIorOSFdisklabelBuildinganewDOS
disklabel.Changeswillremaininmemoryonly,
untilyoudecidetowritethem.Afterthat,ofcourse,
thepreviouscontentwon’tberecoverable.
Thenumberofcylindersforthisdiskissetto34893.
Thereisnothingwrongwiththat,butthisislarger
than1024,andcouldincertainsetupscauseproblems
with:
80
LinuxHackAjayKumarTiwari
1)softwarethatrunsatboottime(e.g.,oldversions
ofLILO)
2)bootingandpartitioningsoftwarefromotherOSs
(e.g.,DOSFDISK,OS/2FDISK)
Warning:invalidflag0x0000ofpartitiontable4will
becorrectedbyw(rite)
Command(mforhelp): p
Disk/dev/sda:287.0GB,287005343744bytes
255heads,63sectors/track,34893cylinders
Units=cylindersof16065*512=8225280bytes
DeviceBoot
Start
End
Blocks
Id
System
Command(mforhelp): n
Commandaction
eextended
pprimarypartition(1-4)
p
Partitionnumber(1-4): 1
Firstcylinder(1-34893,default1):
Usingdefaultvalue1
Lastcylinderor+sizeor+sizeMor+sizeK(1-34893,
default34893):
Usingdefaultvalue34893
Command(mforhelp): w
Thepartitiontablehasbeenaltered!
Callingioctl()tore-readpartitiontable.
Syncingdisks.
Verifythatthepartitiongotcreatedsuccessfully# fdisk/dev/sda
Thenumberofcylindersforthisdiskissetto34893.
Thereisnothingwrongwiththat,butthisislarger
than1024,andcouldincertainsetupscauseproblems
with:
81
LinuxHackAjayKumarTiwari
1)softwarethatrunsatboottime(e.g.,oldversions
ofLILO)
2)bootingandpartitioningsoftwarefromotherOSs
(e.g.,DOSFDISK,OS/2FDISK)
Command(mforhelp):p
Disk/dev/sda:287.0GB,287005343744bytes
255heads,63sectors/track,34893cylinders
Units=cylindersof16065*512=8225280bytes
DeviceBoot
/dev/sda1
Start
1
End
34893
Blocks
280277991
Id
83
System
Linux
Command(mforhelp): q
Hack66.Formatapartitionusingmke2fskAfterpartitioningthedisks,itisstillnotreadyforusage,asweneedto
formatthedisk.Atthisstage,ifyoutrytoviewthediskinformation,itwill
givethefollowingerrormessageindicatingthatnovalidsuperblockis
present.
# tune2fs-l/dev/sda1
tune2fs1.35(28-Feb-2004)
tune2fs:Badmagicnumberinsuper-blockwhiletrying
toopen/dev/sda1
Couldn’tfindvalidfilesystemsuperblock.
Toformatthedisk,usemke2fsasshownbelow.
# mke2fs/dev/sda1
Youcanalsopassthefollowingoptionalparametertothemke2fs.
82
LinuxHacko
AjayKumarTiwari
-m0:reserved-blocks-percentage–Thisindicatesthe
percentageofthefilesystemblocksreservedfortherootuser.
Defaultis5%.Inthefollowingexample,itissetto0.
-b4096:block-sizespecifiedinbytes.Validvaluesare1024,
2048and4096bytesperblock.
o
# mke2fs-m0-b4096/dev/sda1
mke2fs1.35(28-Feb-2004)
Filesystemlabel=
OStype:Linux
Blocksize=4096(log=2)
Fragmentsize=4096(log=2)
205344inodes,70069497blocks
0blocks(0.00%)reservedforthesuperuser
Firstdatablock=0
Maximumfilesystemblocks=71303168
2139blockgroups
32768blockspergroup,32768fragmentspergroup
96inodespergroup
Superblockbackupsstoredonblocks:
32768,98304,163840,229376,294912,819200,884736,
1605632,2654208,4096000,7962624,11239424,20480000,
23887872
Writinginodetables:done
Writingsuperblocksandfilesystemaccounting
information:done
Thisfilesystemwillbeautomaticallycheckedevery32
mountsor180days,whichevercomesfirst.Usetune2fs
-cor-itooverride.
Theabovecommandwillcreateanext2filesystem.Tocreateanext3file
systemdothefollowing:
# mkfs.ext3/dev/sda1
# mke2fs–j/dev/sda1
83
LinuxHackAjayKumarTiwari
Hack67.MountthepartitionAftercreatingapartitionandformatting,youcanmountittoamountpoint.
Firstcreateadirectorywherethepartitionshouldbemounted.
#mkdir/home/database
Mountthefilesystem.
# mount/dev/sda1/home/database
Toautomaticallymountthefilesystemafterthereboot,addthefollowing
entrytothe/etc/fstab
/dev/sdaa/home/databaseext3defaults02
Hack68.Finetunethepartitionusingtune2fsUsethetune2fs–l/dev/sda1toviewthefilesysteminformationasshown
below.
# tune2fs-l/dev/sda1
tune2fs1.35(28-Feb-2004)
Filesystemvolumename:/home/database
Lastmountedon:<notavailable>
FilesystemUUID:f1234556-e123-1234-abcd-
bbbbaaaaae11
Filesystemmagicnumber:0xEF44
Filesystemrevision#:1(dynamic)
Filesystemfeatures:resize_inodefiletype
sparse_super
Defaultmountoptions:(none)
Filesystemstate:notclean
84
LinuxHackErrorsbehavior:
FilesystemOStype:
Inodecount:
Blockcount:
Reservedblockcount:
Freeblocks:
Freeinodes:
Firstblock:
Blocksize:
Fragmentsize:
ReservedGDTblocks:
Blockspergroup:
Fragmentspergroup:
Inodespergroup:
Inodeblockspergroup:
Filesystemcreated:
Lastmounttime:
Lastwritetime:
Mountcount:
Maximummountcount:
Lastchecked:
Checkinterval:
Nextcheckafter:
Reservedblocksuid:
Reservedblocksgid:
Firstinode:
Inodesize:
Defaultdirectoryhash:
DirectoryHashSeed:
ccccc123292b
AjayKumarTiwari
Continue
Linux
1094912
140138994
0
16848481
1014969
0
2048
2048
512
16384
16384
128
8
TueJul100:06:032008
ThuAug2105:58:252008
FriJan215:40:362009
2
20
TueJul100:06:032008
15552000(6months)
SatDec2723:06:032008
0(userroot)
0(grouproot)
11
128
tea
12345829-1236-4123-9aaa-
Youcanalsousethetune2fstotunetheex2/ext3filesystemparameter.For
example,ifyouwanttochangetheFilesystemvolumename,youcandoitas
shownbelow.
# tune2fs-l/dev/sda1|grepvolume
Filesystemvolumename:/home/database
# tune2fs-Ldatabase-home/dev/emcpowera1
tune2fs1.35(28-Feb-2004)
85
LinuxHackAjayKumarTiwari
# tune2fs-l/dev/sda1|grepvolume
Filesystemvolumename:database-home
Hack69.Createaswapfilesystem.Createafileforswapusageasshownbelow.
# ddif=/dev/zeroof=/home/swap-fsbs=1Mcount=512
512+0recordsin
512+0recordsout
#ls-l/home/swap-fs
-rw-r—r—1rootroot536870912Jan
/home/swap-fs
223:13
UsemkswaptosetupaLinuxswapareainthe/home/swap-fsfilethatwas
createdabove.
# mkswap/home/swap-fs
Settingupswapspaceversion1,size=536866kB
OncethefileiscreatedandhasbeensetupforLinuxswaparea,itistimeto
enabletheswapusingswaponasshownbelow.
# swapon/home/swap-fs
Addthefollowinglineto/etc/fstabandrebootthesystemfortheswapto
takeintoeffect.
/home/swap-fsswapswapdefaults00
86
LinuxHackAjayKumarTiwari
Hack70.CreateanewuserAddanewuser–BasicmethodSpecifyonlytheusername.
#useraddjsmith
AddanewuserwithadditionalParameterYoucanalsospecifythefollowingparametertotheuseradd
o
o
-c:Descriptionabouttheuser.
-e:expirydateoftheuserinmm/dd/yyformat
# adduser-c“JohnSmith-OracleDeveloper”-e
12/31/09jsmith
Verifythattheusergotaddedsuccessfully.
#grepjsmith/etc/passwd
jsmith:x:510:510:JohnSmith-Oracle
Developer:/home/jsmith:/bin/bash
Changetheuserpassword.# passwdjsmith
Changingpasswordforuserjsmith.
NewUNIXpassword:
BADPASSWORD:itisbasedonadictionaryword
RetypenewUNIXpassword:
passwd:allauthenticationtokensupdatedsuccessfully.
87
LinuxHackAjayKumarTiwari
Note: Makesuretofollowthesebestpracticestocreateastrongpassword
fortheuser.
Howtoidentifythedefaultvaluesusedbyuseradd?Followingarethedefaultvaluesthatwillbeusedwhenanuseriscreated.
# useradd–D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
Hack71.CreateanewgroupandassigntoanuserCreateanewdevelopergroup.#groupadddevelopers
Validatethatthegroupwascreatedsuccessfully.#grepdeveloper/etc/group
developers:x:511:
Addanusertoanexistinggroup.Youcannotuseuseraddtomodifyanexistinguser,asyou’llgetthefollowing
errormessage.
88
LinuxHack#useradd-Gdevelopersjsmith
useradd:userjsmithexists
#usermod-gdevelopersjsmith
AjayKumarTiwari
Validatetheusersgroupwasmodifiedsuccessfully.#grepjsmith/etc/passwd
jsmith:x:510:511:Oracle
Developer:/home/jsmith:/bin/bash
# idjsmith
uid=510(jsmith)gid=511(developers)
groups=511(developers)
#grepjsmith/etc/group
jsmith:x:510:
developers:x:511:jsmith
Hack72.SetupSSHpasswordlesslogininOpenSSHYoucanlogintoaremoteLinuxserverwithoutenteringpasswordin3simple
stepsusingssky-keygenandssh-copy-idasexplainedinthisexample.
ssh-keygencreatesthepublicandprivatekeys.ssh-copy-idcopiesthelocal-
host’spublickeytotheremote-host’sauthorized_keysfile.ssh-copy-idalso
assignsproperpermissiontotheremote-host’shome,~/.ssh,and
~/.ssh/authorized_keys.
Step1:Createpublicandprivatekeysusingssh-key-genonlocal-
hostjsmith@local-host$ ssh-keygen
Generatingpublic/privatersakeypair.
89
LinuxHackAjayKumarTiwari
Enterfileinwhichtosavethekey
(/home/jsmith/.ssh/id_rsa):[Enterkey]
Enterpassphrase(emptyfornopassphrase):[Press
enterkey]
Entersamepassphraseagain:[Pessenterkey]
Youridentificationhasbeensavedin
/home/jsmith/.ssh/id_rsa.
Yourpublickeyhasbeensavedin
/home/jsmith/.ssh/id_rsa.pub.
Thekeyfingerprintis:
33:b3:fe:af:95:95:18:11:31:d5:de:96:2f:f2:35:f9
jsmith@local-host
Step2:Copythepublickeytoremote-hostusingssh-copy-idjsmith@local-host$ ssh-copy-id-i~/.ssh/id_rsa.pub
remote-host
jsmith@remote-host’spassword:
Nowtryloggingintothemachine,with“ssh‘remote-
host’”,andcheckin:
.ssh/authorized_keystomakesurewehaven’tadded
extrakeysthatyouweren’texpecting.
Note: ssh-copy-idappendsthekeystotheremote-host’s
.ssh/authorized_key.
Step3:Logintoremote-hostwithoutenteringthepasswordjsmith@local-host$ sshremote-host
Lastlogin:SunNov1617:22:332008from192.168.1.2
[Note:SSHdidnotaskforpassword.]
jsmith@remote-host$[Note:Youareonremote-hosthere]
90
LinuxHackAjayKumarTiwari
Hack73.Usessh-copy-idalongwithssh-agentUsingssh-copy-idalongwiththessh-add/ssh-agentWhennovalueispassedfortheoption-iandIf~/.ssh/identity.pubisnot
available,ssh-copy-idwilldisplaythefollowingerrormessage.
jsmith@local-host$ssh-copy-id-iremote-host
/usr/bin/ssh-copy-id:ERROR:Noidentitiesfound
Ifyouhaveloadedkeystothessh-agentusingthessh-add,thenssh-copy-id
willgetthekeysfromthessh-agenttocopytotheremote-host.i.e,itcopies
thekeysprovidedbyssh-add-Lcommandtotheremote-host,whenyoudon’t
passoption-itothessh-copy-id.
jsmith@local-host$ssh-agent$SHELL
jsmith@local-host$ssh-add-L
Theagenthasnoidentities.
jsmith@local-host$ssh-add
Identityadded:/home/jsmith/.ssh/id_rsa
(/home/jsmith/.ssh/id_rsa)
jsmith@local-host$ssh-add-L
ssh-rsa
AAAAB3NzaC1yc2EAAAABIwAAAQEAsJIEILxftj8aSxMa3d8t6JvM79D
aHrtPhTYpq7kIEMUNzApnyxsHpH1tQ/Ow==
/home/jsmith/.ssh/id_rsa
jsmith@local-host$ssh-copy-id-iremote-host
jsmith@remote-host’spassword:
Nowtryloggingintothemachine,with“ssh‘remote-
host’”,andcheckin:.ssh/authorized_keystomakesure
wehaven’taddedextrakeysthatyouweren’texpecting.
[Note:Thishasaddedthekeydisplayedbyssh-add-L]
91
LinuxHack
ThreeMinorAnnoyancesofssh-copy-idAjayKumarTiwari
Followingarefewminorannoyancesofthessh-copy-id.
1.Defaultpublickey:ssh-copy-iduses~/.ssh/identity.pubasthe
defaultpublickeyfile(i.ewhennovalueispassedtooption-i).
Instead,Iwishitusesid_dsa.pub,orid_rsa.pub,oridentity.pub
asdefaultkeys.i.eIfanyoneofthemexist,itshouldcopythat
totheremote-host.Iftwoorthreeofthemexist,itshouldcopy
identity.pubasdefault.
2.Theagenthasnoidentities:Whenthessh-agentisrunningand
thessh-add-Lreturns“Theagenthasnoidentities”(i.enokeys
areaddedtothessh-agent),thessh-copy-idwillstillcopythe
message“Theagenthasnoidentities”totheremote-host’s
authorized_keysentry.
3.Duplicateentryinauthorized_keys:Iwishssh-copy-idvalidates
duplicateentryontheremote-host’sauthorized_keys.Ifyou
executessh-copy-idmultipletimesonthelocal-host,itwillkeep
appendingthesamekeyontheremote-host’sauthorized_keys
filewithoutcheckingforduplicates.Evenwithduplicateentries
everythingworksasexpected.But,Iwouldliketohavemy
authorized_keysfileclutterfree.
Hack74.CrontabUsingcronyoucanexecuteashell-scriptorLinuxcommandsataspecific
timeanddate.Forexampleasysadmincanscheduleabackupjobthatcan
runeveryday.
Howtoaddajobtothecron?#crontab–e
05***/root/bin/backup.sh
92
LinuxHackAjayKumarTiwari
Thiswillexecute/root/bin/backup.shat5a.meveryday.
DescriptionofCronfields.Followingistheformatofthecrontabfile.{minute}{hour}{day-of-month}{month}{day-of-week}{full-path-to-shell-script}
o
o
o
o
o
minute:Allowedrange0–59
hour:Allowedrange0–23
day-of-month:Allowedrange0–31
month:Allowedrange1–12.1=January.12=December.
Day-of-week:Allowedrange0–7.Sundayiseither0or7.
Crontabexamples1.Runat12:01a.m.1minuteaftermidnighteveryday.Thisisagoodtimeto
runbackupwhenthesystemisnotunderload.
10***/root/bin/backup.sh
2.Runbackupeveryweekday(Mon–Fri)at11:59p.m.
5911**1,2,3,4,5/root/bin/backup.sh
Followingwillalsodothesame.
5911**1-5/root/bin/backup.sh
93
LinuxHackAjayKumarTiwari
3.Executethecommandevery5minutes.
*/5****/root/bin/check-status.sh
4.Executeat1:10p.mon1stofeverymonth
10131**/root/bin/full-backup.sh
5.Execute11p.monweekdays.
023**1-5/root/bin/incremental-backup.sh
CrontabOptionsFollowingaretheavailableoptionswithcrontab:
o
crontab–e:Editthecrontabfile.Thiswillcreateacrontab,ifit
doesn’texist
crontab–l:Displaythecrontabfile.
crontab-r:Removethecrontabfile.
crontab-ir:Thiswillpromptuserbeforedeletingacrontab.
o
o
o
Hack75.SafeRebootOfLinuxUsingMagicSysRqKeyThemagicSysRqkeyisakeycombinationintheLinuxkernelwhichallows
theusertoperformvariouslowlevelcommandsregardlessofthesystem’s
state.
Itisoftenusedtorecoverfromfreezes,ortorebootacomputerwithout
corruptingthefilesystem.Thekeycombinationconsistsof
94
LinuxHackAjayKumarTiwari
Alt+SysRq+commandkey.InmanysystemstheSysRqkeyistheprintscreen
key.
First,youneedtoenabletheSysRqkey,asshownbelow.
echo“1”>/proc/sys/kernel/sysrq
ListofSysRqCommandKeysFollowingarethecommandkeysavailableforAlt+SysRq+commandkey.
o
o
o
‘k’–Killsalltheprocessrunningonthecurrentvirtualconsole.
’s’–Thiswillattempttosyncallthemountedfilesystem.
‘b’-Immediatelyrebootthesystem,withoutunmountingpartitions
orsyncing.
‘e’–SendsSIGTERMtoallprocessexceptinit.
‘m’–Outputcurrentmemoryinformationtotheconsole.
‘i’-SendtheSIGKILLsignaltoallprocessesexceptinit
‘r’-Switchthekeyboardfromrawmode(themodeusedbyprograms
suchasX11),toXLATEmode.
’s’–syncallmountedfilesystem.
‘t’-Outputalistofcurrenttasksandtheirinformationtothe
console.
‘u’-Remountallmountedfilesystemsinreadonlymode.
‘o’–Shutdownthesystemimmediately.
‘p’–Printthecurrentregistersandflagstotheconsole.
‘0-9′-Setstheconsoleloglevel,controllingwhichkernelmessages
willbeprintedtoyourconsole.
o
o
o
o
o
o
o
o
o
o
95
LinuxHacko
o
AjayKumarTiwari
‘f’-Willcalloom_killtokillprocesswhichtakesmorememory.
‘h’–Usedtodisplaythehelp.Butanyotherkeysthantheabove
listedwillprinthelp.
Wecanalsodothisbyechoingthekeystothe/proc/sysrq-triggerfile.For
example,tore-bootasystemyoucanperformthefollowing.
echo“b”>/proc/sysrq-trigger
PerformaSaferebootofLinuxusingMagicSysRqKeyToperformasaferebootofaLinuxcomputerwhichhangsup,dothe
following.Thiswillavoidthefsckduringthenextre-booting.i.ePress
Alt+SysRq+letterhighlightedbelow.
o
o
unRaw(takecontrolofkeyboardbackfromX11,
tErminate(sendSIGTERMtoallprocesses,allowingthemtoterminate
gracefully),
kIll (sendSIGILLtoallprocesses,forcingthemtoterminate
immediately),
Sync (flushdatatodisk),
Unmount (remountallfilesystemsread-only),
reBoot.
o
o
o
o
96
LinuxHackAjayKumarTiwari
Chapter10:ApachectlandHttpdExamplesAfteryouhaveinstalledApache2,ifyouwanttouseapachectlandhttpdto
it’smaximumpotential,youshouldgobeyondusingstart,stopandrestart.
The9practicalexamplesprovidedinthischapterwillhelpyoutouse
apachectlandhttpdveryeffectively.
ApachectlactsasSysVinitscript,takingargumentslikestart,stop,restart
andstatus.Italsoactsasfront-endtohttpdcommand,bysimplypassingthe
commandlineargumentstohttpd.So,allthecommandsyouexecuteusing
apachectl,canalsobeexecuteddirectlybycallinghttpd.
Ifyoudon’thaveApache,refertothetutorials:installapachefromsourceor
installLAMPstackusingyum.
Hack76.Passdifferenthttpd.conffilenametoapachectlTypicallyyou’llmodifytheoriginalhttpd.conftotryoutdifferentApache
directives.Ifsomethingdoesn’tworkout,you’llrevertbackthechanges.
Insteadofplayingaroundwiththeoriginalhttpd.conf,copyittoanew
httpd.conf.debugandusethisnewhttpd.conf.debugfilewithApachefor
testingpurposeasshownbelowusingoption-f.
# apachectl-fconf/httpd.conf.debug
# httpd-kstart-fconf/httpd.conf.debug
[Note:youcanuseeitherapachectlorhttpdasshown
above]
#ps-ef|grephttp
root250801023:2600:00:00/usr/sbin/httpd-f
97
LinuxHackAjayKumarTiwari
conf/httpd.conf.debug
apache2509925080023:2800:00:00/usr/sbin/httpd-f
conf/httpd.conf.debug
[Note:psshowsthehttpdrunningwithhttpd.conf.debug
file]
OnceyouaresatisfiedwiththechangesandApacherunswithoutanyproblem
withhttpd.conf.debug,youcancopythechangestohttpd.confandstartthe
Apachenormallyasshownbelow.
#cphttpd.conf.debughttpd.conf
#apachectlstop
#apachectlstart
#ps-ef|grephttpd
root251141023:2800:00:00/usr/sbin/httpd
-kstart
daemon2511525114023:2800:00:00/usr/sbin/httpd
-kstart
[Note:psindicatesthatthehttpdisrunningusingthe
defaultconfigfile]
Hack77.UseatemporaryDocumentRootwithoutmodifyinghttpd.confThisisveryhelpful,whenyouaretryingoutdifferentlayoutforyourwebsite
anddon’twanttomodifytheoriginalfilesunderthedefaultDocumentRoot.
TakeacopyofyouroriginalDocumentRootdirectory(/var/www/html)toa
newtemporaryDocumentRootdirectory(/var/www/html_debug).Makeall
yourchangesunderthistemporaryDocumentRootdirectory
(/var/www/html_debug)andstarttheApachewiththistemporarydirectory
asshownbelowusingoption-c.
98
LinuxHackAjayKumarTiwari
# httpd-kstart-c“DocumentRoot/var/www/html_debug/”
Ifyouwanttogobacktooriginalconfigurationusingthedefault
DocumentRoot(/var/www/html),simplyrestarttheApacheasshownbelow.
#httpd-kstop
#apachectlstart
Hack78.IncreasetheLogLeveltemporarilyWhileyouaredebugginganissue,youcanchangetheLogLeveloftheApache
temporarily,withoutmodifyingtheLogLeveldirectiveinthehttpd.confas
shownbelowusingoption-e.Inthisexample,theLogLevelissettodebug.
# httpd-kstart-edebug
[SunAug1713:53:062008][debug]mod_so.c(246):
loadedmoduleauth_basic_module
[SunAug1713:53:062008][debug]mod_so.c(246):
loadedmoduleauth_digest_module
Possiblevaluesyoucanpasstooption-eare:
o
o
o
o
o
o
o
o
debug
info
notice
warn
error
crit
alert
emerg
99
LinuxHackAjayKumarTiwari
Hack79.DisplaythemodulesinsideApacheDisplaythemodulescompiledinsideApache# httpd-l
Compiledinmodules:
core.c
prefork.c
http_core.c
mod_so.c
DisplaybothstaticanddynamicmoduleloadedbyApacheWhenyoupassoption-l,tohttpd,itwilldisplayonlythestaticmodules.
Passingoption-M,willdisplaybothstaticandsharedmodulesasshown
below.
# httpd–M
LoadedModules:
core_module(static)
mpm_prefork_module(static)
http_module(static)
so_module(static)
auth_basic_module(shared)
auth_digest_module(shared)
authn_file_module(shared)
authn_alias_module(shared)
SyntaxOK
100
LinuxHackAjayKumarTiwari
Hack80.Showallaccepteddirectivesinsidehttpd.confThisislikeanextendedhelpforhttpd,whichwilldisplayallthehttpd.conf
directivesandtheplaceswheretheyarevalid.Foraspecificdirective,it
tellsallthepossiblevaluesandwhereitcanbeusedinsidethehttpd.conf.
Thiscanbeveryhelpful,whenyouwanttoquicklyknowaboutaparticular
Apachedirective.
# httpd–L
HostnameLookups(core.c)
“on”toenable,“off”todisablereverseDNSlookups,
or“double”toenabledouble-reverseDNSlookups
Allowedin*.confanywhere
ServerLimit(prefork.c)
MaximumvalueofMaxClientsforthisrunofApache
Allowedin*.confonlyoutside<Directory>,<Files>or
<Location>
KeepAlive(http_core.c)
WhetherpersistentconnectionsshouldbeOnorOff
Allowedin*.confonlyoutside<Directory>,<Files>or
<Location>
LoadModule(mod_so.c)
amodulenameandthenameofasharedobjectfileto
loaditfrom
Allowedin*.confonlyoutside<Directory>,<Files>or
<Location>
Hack81.Validatethehttpd.confaftermakingchangesUseoption-ttovalidatewhetherthereareanyissueswithaspecificApache
configurationfile.Intheexampleshownbelow,itdisplaysthatthereisa
101
LinuxHackAjayKumarTiwari
problematline148inthehttpd.conf.debug.mod_auth_basicsoismissinga.
(period)beforetheso.
# httpd-t-fconf/httpd.conf.debug
httpd:Syntaxerroronline148of
/etc/httpd/conf/httpd.conf.debug:
Cannotload/etc/httpd/modules/mod_auth_basicsointo
server:
/etc/httpd/modules/mod_auth_basicso:cannotopenshared
objectfile:Nosuchfileordirectory
Onceyoufixtheissue,itwilldisplaySyntaxOK.
# httpd-t-fconf/httpd.conf.debug
SyntaxOK
Hack82.DisplaythehttpdbuildparametersUseoption-V(upper-caseV),todisplayApacheversionnumberandallthe
parametersthatareusedwhilebuildingtheApache.
# httpd–V
Serverversion:Apache/2.2.9(Unix)
Serverbuilt:Jul14200815:36:56
Server’sModuleMagicNumber:20051115:15
Serverloaded:APR1.2.12,APR-Util1.2.12
Compiledusing:APR1.2.12,APR-Util1.2.12
Architecture:32-bit
ServerMPM:Prefork
threaded:no
forked:yes(variableprocesscount)
Servercompiledwith….
-DAPACHE_MPM_DIR=”server/mpm/prefork”
-DAPR_HAS_SENDFILE
-DAPR_HAS_MMAP
102
LinuxHack-D
-D
-D
-D
-D
-D
-D
-D
-D
-D
-D
-D
-D
-D
-D
AjayKumarTiwari
APR_HAVE_IPV6(IPv4-mappedaddressesenabled)
APR_USE_SYSVSEM_SERIALIZE
APR_USE_PTHREAD_SERIALIZE
SINGLE_LISTEN_UNSERIALIZED_ACCEPT
APR_HAS_OTHER_CHILD
AP_HAVE_RELIABLE_PIPED_LOGS
DYNAMIC_MODULE_LIMIT=128
HTTPD_ROOT=”/etc/httpd”
SUEXEC_BIN=”/usr/sbin/suexec”
DEFAULT_PIDLOG=”logs/httpd.pid”
DEFAULT_SCOREBOARD=”logs/apache_runtime_status”
DEFAULT_LOCKFILE=”logs/accept.lock”
DEFAULT_ERRORLOG=”logs/error_log”
AP_TYPES_CONFIG_FILE=”conf/mime.types”
SERVER_CONFIG_FILE=”conf/httpd.conf”
IfyouwantdisplayonlytheApacheversionnumber,usetheoption-v(lower-
casev)asshownbelow.
# httpd-v
Serverversion:Apache/2.2.9(Unix)
Serverbuilt:Jul14200815:36:56
Hack83.LoadaspecificmoduleonlyondemandSometimesyoumaynotwanttoloadallthemodulesintheApache.Fore.g.
YoumaywanttoloadldaprelatedmodulestoApache,onlywhenyouare
testingLDAP.Thiscanbeachievedasshownbelow.
Modifythehttpd.confandaddIfDefinedirectivecalledload-ldap(youcan
namethisanythingyouwant).
<IfDefineload-ldap>
LoadModuleldap_modulemodules/mod_ldap.so
LoadModuleauthnz_ldap_module
103
LinuxHackmodules/mod_authnz_ldap.so
</IfDefine>
AjayKumarTiwari
WhenyouaretestingldapandwouldliketoLoadtheldaprelatedmodules,
passtheload-ldaptoOption-D,asshownbelow:
#httpd-kstart-edebug-Dload-ldap-f
/etc/httpd/conf/httpd.conf.debug
[SunAug1714:14:582008][debug]mod_so.c(246):
loadedmoduleldap_module
[SunAug1714:14:582008][debug]mod_so.c(246):
loadedmoduleauthnz_ldap_module
[Note:Pass-Dload-ldap,toloadtheldapmodulesinto
Apache]
#apachectlstart
[Note:StarttheApachenormally,ifyoudon’twantto
loadtheldapmodules.
104
LinuxHackAjayKumarTiwari
Chapter11:BashScriptingHack84.ExecutionSequenceof.bash_*filesWhatisthesequenceinwhichthefollowingfilesareexecuted?
o
o
o
o
o
o
/etc/profile
~/.bash_profile
~/.bashrc
~/.bash_login
~/.profile
~/.bash_logout
ExecutionsequenceforinteractiveloginshellFollowingpseudocodeexplainsthesequenceofexecutionofthesefiles.
execute/etc/profile
IF~/.bash_profileexistsTHEN
execute~/.bash_profile
ELSE
IF~/.bash_loginexistTHEN
execute~/.bash_login
ELSE
IF~/.profileexistTHEN
execute~/.profile
ENDIF
ENDIF
ENDIF
105
LinuxHackAjayKumarTiwari
Whenyoulogoutoftheinteractiveshell,followingisthesequenceof
execution:
IF~/.bash_logoutexistsTHEN
execute~/.bash_logout
ENDIF
Pleasenotethat/etc/bashrcisexecutedby~/.bashrcasshownbelow:
#cat~/.bashrc
if[-f/etc/bashrc];then
./etc/bashrc
Fi
Executionsequenceforinteractivenon-loginshellWhilelaunchinganon-logininteractiveshell,followingisthesequenceof
execution:
IF~/.bashrcexistsTHEN
execute~/.bashrc
ENDIF
Note: Whenanon-interactiveshellstartsup,itlooksforENVenvironment
variable,andexecutesthefile-namevaluementionedintheENVvariable.
Hack85.HowtogeneraterandomnumberinbashshellUsethe$RANDOMbashbuilt-infunctiontogeneraterandomnumberbetween
0–32767asshownbelow.
$echo$RANDOM
106
LinuxHack22543
$echo$RANDOM
25387
$echo$RANDOM
647
AjayKumarTiwari
Hack86.DebugashellscriptTodebugashellscriptuseset–xvinsidetheshellscriptatthetop.
Shellscriptwithnodebugcommand:$catfilesize.sh
#!/bin/bash
forfilesizein$(ls-l.|grep“^-”|awk‘{print
$5}’)
do
lettotalsize=$totalsize+$filesize
done
echo“Totalfilesizeincurrentdirectory:$totalsize”
OutputofShellscriptwithnodebugcommand:$./filesize.sh
Totalfilesizeincurrentdirectory:652
ShellscriptwithDebugcommandinside:Addset–xvinsidetheshellscriptnowtodebugtheoutputasshownbelow.
$catfilesize.sh
#!/bin/bash
set-xv
forfilesizein$(ls-l.|grep“^-”|awk‘{print
107
LinuxHackAjayKumarTiwari
$5}’)
do
lettotalsize=$totalsize+$filesize
done
echo“Totalfilesizeincurrentdirectory:$totalsize”
OutputofShellscriptwithDebugcommandinside:$./fs.sh
++ls-l.
++grep‘^-‘
++awk‘{print$5}’
+forfilesizein‘$(ls-l
‘'’{print$5}’'’)’
+lettotalsize=+178
+forfilesizein‘$(ls-l
‘'’{print$5}’'’)’
+lettotalsize=178+285
+forfilesizein‘$(ls-l
‘'’{print$5}’'’)’
+lettotalsize=463+189
+echo‘Totalfilesizein
Totalfilesizeincurrent
.|grep“^-”|awk
.|grep“^-”|awk
.|grep“^-”|awk
currentdirectory:652’
directory:652
ExecuteShellscriptwithdebugoption:Insteadofgivingtheset–xvinsidetheshellscript,youcanalsoprovidethat
whileexecutingtheshellscriptasshownbelow.
$bash-xvfilesize.sh
Hack87.Quotingechostatementwithoutanyspecialcharacter.
$echoTheGeekStuff
108
LinuxHackTheGeekStuff
AjayKumarTiwari
Echostatementwithaspecialcharacter;.semi-colonisacommand
terminatorinbash.Inthefollowingexample,“TheGeek”worksfortheecho
and“Stuff”istreatedasaseparateLinuxcommandandgivescommandnot
found.
$echoTheGeek;Stuff
TheGeek
-bash:Stuff:commandnotfound
Toavoidthisyoucanadda\infrontofsemi-colon,whichwillremovethe
specialmeaningofsemi-colonandjustprintitasshownbelow.
$echoTheGeek\;Stuff
TheGeek;Stuff
SingleQuoteUsesinglequotewhenyouwanttoliterallyprinteverythinginsidethesingle
quote.Eventhespecialvariablessuchas$HOSTNAMEwillbeprintas
$HOSTNAMEinsteadofprintingthenameoftheLinuxhost.
$echo‘Hostname=$HOSTNAME;
Message=\$isUSD’
Hostname=$HOSTNAME;
Message=\$isUSD
CurrentUser=`whoami`;
CurrentUser=`whoami`;
DoubleQuoteUsedoublequoteswhenyouwanttodisplaytherealmeaningofspecial
variables.
$echo“Hostname=$HOSTNAME;
Message=\$isUSD”
CurrentUser=`whoami`;
109
LinuxHackAjayKumarTiwari
Hostname=dev-db;CurrentUser=ramesh;Message=$is
USD
Doublequoteswillremovethespecialmeaningofallcharactersexceptthe
following:
o
o
o
o
o
o
$ParameterSubstitution.
`Backquotes
\$LiteralDollarSign.
\´LiteralBackquote.
\”EmbeddedDoublequote.
\EmbeddedBackslashes.
Hack88.ReaddatafilefieldsinsideashellscriptThisexampleshowshowtoreadaparticularfieldfromadata-fileand
manipulateitinsideashell-script.Forexample,letusassumethe
employees.txtfileisintheformatof{employee-name}:{employee-
id}:{department-name},withcolondelimitedfileasshownbelow.
$catemployees.txt
EmmaThomas:100:Marketing
AlexJason:200:Sales
MadisonRandy:300:ProductDevelopment
SanjayGupta:400:Support
NishaSingh:500:Sales
Thefollowingshellscriptexplainshowtoreadspecificfieldsfromthis
employee.txtfile.
$viread-employees.sh
#!/bin/bash
IFS=:
echo“EmployeeNames:”
echo“–––––”
whilereadnameempiddept
110
LinuxHackAjayKumarTiwari
do
echo“$nameispartof$deptdepartment”
done<~/employees.txt
Assignexecuteprivilegetotheshellscriptandexecuteit.
$chmodu+xread-employees.sh
$./read-employees.sh
EmployeeNames:
–––––
EmmaThomasispartofMarketingdepartment
AlexJasonispartofSalesdepartment
MadisonRandyispartofProductDevelopmentdepartment
SanjayGuptaispartofSupportdepartment
NishaSinghispartofSalesdepartment
111
LinuxHackAjayKumarTiwari
Chapter12:SystemMonitoringandPerformanceHack89.Freecommandfreecommanddisplaysallthenecessaryinformationaboutsystemphysical
(RAM)andswapmemory.
Syntax:free[options]
WhatisthetotalRAMonmysystem?Intheexamplebelow,thetotalphysicalmemoryonthissystemis1GB.The
valuesdisplayedbelowareinKB.
#free
totalused
Mem:10346241006696
-/+buffers/cache:
Swap:2031608
freesharedbuffers
279280174136
216668817956
02031608
cached
615892
WhatisthetotalmemoryonmysystemincludingRAMandSwap?Inthefollowingcommand:
o
o
optionmdisplaysthevaluesinMB
optiontdisplaysthe“Total”line,whichissumofphysicalandswap
memoryvalues
optionoistohidethebuffers/cachelinefromtheaboveexample.
o
# free–mto
112
LinuxHacktotal
1010
1983
2994
used
983
0
983
free
27
1983
2011
shared
0
AjayKumarTiwari
buffers
170
cached
601
Mem:
Swap:
Total:
Hack90.TopCommandtopcommanddisplaysrealtimeinformationaboutvariousperformance
metricsofthesystemsuchasCPULoad,MemoryUsage,Processeslistetc.
Syntax:top[options]
HowtoviewmycurrentsystemstatusincludingCPUusage?Executetopwithoutanyoptionfromthecommandline,whichwilldisplay
theoutputshownbelow.Thetopcommandoutputwillkeepdisplayingthe
real-timevalues,untilyoupress“Control+c”orqtoexitfromthecommand
output.
# top
top-13:10:13up171days,20:21,3users,loadaverage:0.01,0.05,0.00
Tasks:194total,1running,193sleeping,0stopped,0zombie
Cpu(s):0.6%us,0.7%sy,0.0%ni,98.7%id,0.0%wa,0.0%hi,0.0%si
Mem:1034624ktotal,1007420kused,27204kfree,174540kbuffers
Swap:2031608ktotal,0kused,2031608kfree,615904kcached
PIDUSERPRNIVIRTRES
11912apache15031828
19299oracle190279m
11398jsmith160107m
SHRS%CPU%MEMTIME+COMMAND
13m3916S10.20:46.35httpd
18m17mS10.20:00.03oracle
28m6404S00.40:03.07perl
113
LinuxHackAjayKumarTiwari
Howtoreadtheoutputofthetopcommandshownabove?o
Line1“top”,indicatesthatthesystemhasbeenupandrunning
for171days.
Line2“Tasks”,displaysthetotalnumberofprocessesalongwith
abreakdownofrunning,sleeping,stoppedandzombieprocesses
count.
Line3“Cpu(s)”displaysthecurrentCPUutilizationofthe
system.Inthisexample,CPUis98.7%idle
Line4“Mem”andline5“Swap”providesthememory
information.Thisisthesameinformationfromthefree
command.
Therestofthelinesdisplayalltheactiveprocessesonthe
system,sorteddefaultbyCPUusage(%CPUcolumn).i.ethemost
CPUintensiveprocesseswillbedisplayedonthetopbydefault.
o
o
o
o
Thereareseveralcommandlineoptionsandinteractiveoptionsavailablefor
topcommands.Letusreviewcoupleofessentialoptionsfortopcommand.
Howtoidentifythemostmemoryintensiveprocesses?Whiletheoutputofthetopcommanddisplayed,pressF,whichwilldisplay
thefollowingmessageandshowallfieldsavailableforsorting,pressn(which
isforsortingtheprocessesbyMemory)andpressenter.Thiswilldisplaythe
processesinthetopoutputsortedbymemoryusage.
CurrentSortField:Kforwindow1:Def
Selectsortfieldviafieldletter,typeanyotherkeytoreturn
Howtoaddadditionalfields(fore.g.CPUTime)tothetopoutput?
114
LinuxHackAjayKumarTiwari
Whilethetopcommandisrunning,pressf,whichwilldisplaythefollowing
messageandshowallfieldsavailablefordisplay,pressl,whichwilladdthe
CPUTimetothedisplaycolumnsinthetopoutput.
CurrentFields:AEHIOQTWKNMbcdfgjplrsuvyzXforwindow1:Def
Togglefieldsviafieldletter,typeanyotherkeytoreturn
Howtogetthefullpathnameandparametersoftherunning
processes?Whilethetopcommandisrunning,pressc,whichwilldisplayfullpathname
ofrunningprocessesasshownbelowinthecommandcolumn.i.eInsteadof
httpd,itdisplays/usr/local/apache2/bin/httpd.
PIDUSER
PRNIVIRTRESSHRS%CPU%MEM
1
TIME+COMMAND
0.20:46.35
11912apache1503182813m3916S
/usr/local/apache2/bin/httpd
HowtoviewtheindividualCPUsinthetopcommand?Whilethetopcommandisrunning,press1(numberone),whichwilldisplay
theperformancedataoftheindividualCPUsonthatmachineasshown
below.
top-13:10:13up171days,20:21,3users,loadaverage:0.01,0.05,0.00
Tasks:194total,1running,193sleeping,0stopped,0zombie
Cpu0:10.2%us,2.6%sy,0.0%ni,86.8%id,0.3%wa,0.0%hi,0.0%si
Cpu1:9.6%us,8.0%sy,0.0%ni,82.4%id,0.0%wa,0.0%hi,0.0%si
Cpu2:1.3%us,1.3%sy,0.0%ni,95.0%id,2.3%wa,0.0%hi,0.0%si
Cpu3:0.0%us,0.0%sy,0.0%ni,100.0%id,0.0%wa,0.0%hi,0.0%si
115
LinuxHackAjayKumarTiwari
Mem:1034624ktotal,1007420kused,27204kfree,174540kbuffers
Swap:2031608ktotal,0kused,2031608kfree,615904kcached
Hack91.PsCommandpscommand(processstatus)willdisplaysnapshotinformationofallactive
processes.
Syntax:ps[options]
Howtodisplayalltheprocessesrunninginthesystem?Use“psaux”,asshownbelow.
# psaux|more
USERPID%CPU%MEMVSZRSSTTYSTATSTARTTIMECOMMAND
root10.00.02044588?SsJun27
0:00init[5]
apache311860.01.62373617556?SJul26
0:40/usr/local/apache2/bin/httpd
apache311870.01.32064014444?SJul26
0:37/usr/local/apache2/bin/httpd
Youcanalsouse“ps-ef|more”,togetasimilaroutput
PrinttheProcessTreeYoucanuseeither psaxuf or ps–ejH todisplayprocessesinatreeformat.
Thetreestructurewillhelptovisualizetheprocessandit’sparentprocess
immediately.Forclaritypurpose,fewcolumnshavebeencut-offinthe
outputbelow.# psaxuf
116
LinuxHackAjayKumarTiwariroot
root
root
root
root
root
root
root
root
511
511
Oct14
Oct14
Oct14
Oct14
Oct14
Oct14
Dec03
Dec22
23:35
23:35
0:00/opt/VRTSralus/bin/beremote
0:00\_/opt/VRTSralus/bin/beremote
0:00\_/opt/VRTSralus/bin/beremote
0:00\_/opt/VRTSralus/bin/beremote
0:01\_/opt/VRTSralus/bin/beremote
0:00\_/opt/VRTSralus/bin/beremote
0:01/usr/local/sbin/sshd
1:08/usr/local/sbin/sshd
0:00\_/usr/local/sbin/sshd
0:00\_-bash
\_psaxuf
Note:Youcanalsousepstreecommandtodisplayprocessintreestructure.
ViewProcessesOwnedbyaParticularUser
ThefollowingcommanddisplaysalltheprocessownedbyLinuxuser-name:
oracle.
$ psUoracle
PIDTTY
5014?
7124?
8206?
8852?
8854?
8911?
STAT
Ss
Ss
Ss
Ss
Ss
Ss
TIMECOMMAND
0:01/oracle/bin/tnslsnr
0:00ora_q002_med
0:00ora_cjq0_med
0:01ora_pmon_med
0:00ora_psp0_med
0:02oraclemed(LOCAL=NO)
ViewProcessesOwnedbyCurrentUserFollowingcommanddisplaysalltheprocessownedbythecurrentuser.
$ psU$USER
PIDTTY
10329?
10330pts/1
STAT
S
Ss
TIMECOMMAND
0:00sshd:ramesh@pts/1,pts/2
0:00-bash
117
LinuxHack10354pts/2
10530pts/1
Ss+
R+
0:00-bash
0:00psUramesh
AjayKumarTiwari
Hack92.DfCommanddfcommand(diskfree)displaystheamountoftotalandfreediskspace
availableonthemountedfilesystems.
Syntax:df[options][name]
HowmuchGBofdiskspaceisfreeonmysystem?Usedf-hasshownbelow.Option-hdisplaysthevaluesinhumanreadable
format(forexample:KforKb,MforMbandGforGb).Inthesampleoutput
below,/filesystemhas17GBofdiskspaceavailableand/home/user
filesystemhas70GBavailable.
# df–h
Filesystem
/dev/sda1
/dev/sdb1
Size
64G
137G
UsedAvailUse%Mountedon
44G17G73%/
67G70G49%/home/user
WhattypeoffilesystemdoIhaveonmysystem?Option-TwilldisplaytheinformationaboutthefilesystemType.Inthis
example/and/home/userfilesystemsareext2.Option-awilldisplayallthe
filesystems,includingthe0sizespecialfilesystemusedbythesystem.
# df-Tha
Filesystem
Type
SizeUsedAvailUse%Mountedon
118
LinuxHackAjayKumarTiwari
/dev/sda1ext264G44G17G73%/
/dev/sdb1ext2137G67G70G49%/home/user
noneproc000-/proc
nonesysfs000-/sys
nonedevpts000-/dev/pts
nonetmpfs2.0G02.0G0%/dev/shm
Hack93.KillCommandkillcommandcanbeusedtoterminatearunningprocess.Typicallythis
commandisusedtokillprocessesthatarehangingandnotresponding.
Syntax:kill[options][pids|commands]
Howtokillahangingprocess?First,identifytheprocessidoftheparticularprocessthatyouwouldliketo
killusingthepscommand.Onceyouknowtheprocessid,passitasa
parametertothekillcommand.Theexamplebelowshowshowtokillthe
hangingapachehttpdprocess.Pleasenotethattypicallyyoushoulduse
“apachectlstop”tostopapache.
# psaux|grephttpd
USERPID%CPU%MEMVSZRSSTTYSTATSTARTTIMECOMMAND
apache311860.01.62373617556?SJul26
0:40/usr/local/apache2/bin/httpd
apache311870.01.32064014444?SJul26
0:37/usr/local/apache2/bin/httpd
# kill3118631187
119
LinuxHackAjayKumarTiwari
Pleasenotethattheabovecommandtriestoterminatetheprocessgraciously
bysendingasignalcalledSIGTERM.Iftheprocessdoesnotgetterminated,
youcanforcefullyterminatetheprocessbypassingasignalcalledSIGKILL,
usingtheoption-9asshownbelow.Youshouldeitherbetheownerofthe
processoraprivilegedusertokillaprocess.
# kill-93118631187
Anotherwaytokillmultipleprocesseseasilyisbyaddingthefollowingtwo
functionstothe.bash_profile.functionpsgrep()
{
psaux|grep“$1”|grep-v‘grep’
}
functionpsterm()
{
[${#}-eq0]&&echo“usage:$FUNCNAMESTRING”&&return0
localpid
pid=$(psax|grep“$1”|grep-vgrep|awk‘{print$1}’)
echo-e“terminating‘$1’/process(es):\n$pid”
kill-SIGTERM$pid
}
Nowdothefollowing,toidentifyandkillallhttpdprocesses.# psgrephttp
USER
COMMAND
apache
Jul26
apache
Jul26
PID%CPU%MEM
31186
0:40
31187
0:37
VSZ
RSSTTY
STATSTART
TIME
S
S
0.01.62373617556?
/usr/local/apache2/bin/httpd
0.01.32064014444?
/usr/local/apache2/bin/httpd
# pstermhttpd
terminating‘httpd’/process(es):
31186
120
LinuxHack31187
AjayKumarTiwari
Hack94.DuCommandducommand(diskusage)willprintthefilespaceusageforaparticular
directoryanditssubdirectories.
Howmuchspaceistakenbymyhomedirectoryandallits
subdirectories?Inthefollowingexample,option-sstandsforsummaryonly.i.eitdisplays
onlythetotalsizeof/home/jsmithandnottheindividualsizesofallthe
subdirectoriesinsidethe/home/jsmith.Option-hdisplaystheinformationin
ahumanreadableformat.i.eKforKB,MforMBandGforGB.The~
indicatestheuserhomedirectory.Thiscommandissameas“du-sh
/home/jsmith”
# du-sh~
320M/home/jsmith
Togetthesubdirectoriesunder/home/jsmithlisted,executetheabove
commandwithoutthesoption.
Hack95.lsofcommands.Lsofstandsforlsopenfiles,whichwilllistalltheopenfilesinthesystem.
Theopenfilesincludenetworkconnection,devicesanddirectories.The
outputofthelsofcommandwillhavethefollowingcolumns:
o
o
o
COMMANDprocessname.
PIDprocessID
USERUsername
121
LinuxHacko
o
o
o
o
o
FDfiledescriptor
TYPEnodetypeofthefile
DEVICEdevicenumber
SIZEfilesize
NODEnodenumber
NAMEfullpathofthefilename.
AjayKumarTiwari
ViewallopenfilesofthesystemExecutethelsofcommandwithoutanyparameterasshownbelow.
# lsof|more
COMMANDPIDUSERFDTYPEDEVICESIZENODE
NAME
init1rootcwdDIR8,140962/
init1rootrtdDIR8,140962/
init1roottxtREG8,132684983101/sbin/init
init1rootmemREG8,1106397166798/lib/ld-
2.3.4.so
init1rootmemREG8,11454802166799
/lib/tls/libc-2.3.4.so
init1rootmemREG8,153736163964
/lib/libsepol.so.1
init1rootmemREG8,156328166811
/lib/libselinux.so.1
init1root10uFIFO0,13972/dev/initctl
migration2rootcwdDIR8,140962/
skipped…
Thelsofcommandbyitselfwithoutmayreturnlotofrecordsasoutput,
whichmaynotbeverymeaningfulexcepttogiveyouaroughideaabouthow
122
LinuxHackAjayKumarTiwari
manyfilesareopeninthesystematanygivenpointofviewasshownbelow.
# lsof|wc-l
3093
ViewopenfilesbyaspecificuserUselsof–uoptiontodisplayallthefilesopenedbyaspecificuser.
# lsof–uramesh
vi7190ramesh
475196/bin/vi
txt
REG
8,1
474608
sshd7163ramesh3uIPv615088263
TCPdev-db:ssh->abc-12-12-12-12.socal.res.rr.com:2631
(ESTABLISHED)
Asystemadministratorcanusethiscommandtogetsomeideaonwhatusers
areexecutingonthesystem.
ListUsersofaparticularfileIfyouliketoviewalltheuserswhoareusingaparticularfile,uselsofas
shownbelow.Inthisexample,itdisplaysalluserswhoarecurrentlyusingvi.#lsof/bin/vi
COMMANDPID
vi7258
vi7300
USERFD
roottxt
rameshtxt
TYPEDEVICESIZENODENAME
REG8,1474608475196/bin/vi
REG8,1474608475196/bin/vi
123
LinuxHackAjayKumarTiwari
Hack96.SarCommandSarcommandscomeswiththesysstatpackage.Makesuresysstatisinstalled.
Ifyoudon’thavesarinstalledonyoursystem,getitfromSysstatproject.
Sarisanexcellentmonitoringtoolthatdisplaysperformancedataofpretty
mucheveryresourceofthesystemincludingCPU,memory,IO,paging,
networking,interruptsetc.,
SarCollects,Reports(displays)andSavestheperformancedata.Letuslook
atallthethreeaspectsseparately
Sadc-Systemactivitydatacollector/usr/lib/sadc(Systemactivitydatacollector)commandcollectsthesystem
dataataspecifiedtimeinterval.Thisusesthedailyactivitydatafilethatis
locatedunder/va/log/sa/sa[dd],whereddisthecurrentday.
Sa1shell-script/usr/lib/sa1in-turncallsthe/usr/lib/sadcs.sa1isinvokedfromthecrontab
asshownbelow.Runthisevery5minutesor15minutesdependingonyour
need.Iprefertoscheduleitforevery5minutesinthecrontabasshown
below.
*/5****root/usr/lib/sa/sa111
Sa2shell-script/usr/lib/sa2isashellscriptthatwillwriteadailyreportinthe
/var/log/sa/sa[dd]file,whereddisthecurrentday.Invokethesa2fromthe
crontabonceadayatmidnight.
#5923***root/usr/lib/sa/sa2–A
124
LinuxHackAjayKumarTiwari
Note: /etc/cron.d/sysstatfilescomeswiththesysstatpackagethatincludes
somedefaultvalueforthesa1andsa2,whichyoucanchangeaccordingly.
DisplayCPUStatisticsusingSarCommand# sar–u
Linux2.6.9-42.ELsmp(dev-db)
12:00:01AMCPU%user%nice
12:05:01AMall3.700.00
12:10:01AMall4.590.00
12:15:01AMall3.900.00
12:20:01AMall4.060.00
12:25:01AMall3.890.00
12:30:01AMall3.890.00
Skipped..
Average:all
4.56
0.00
1.00
0.15
94.29
01/01/2009
%system%iowait
0.850.00
1.190.06
0.950.04
1.000.01
0.870.00
0.870.00
%idle
95.45
94.16
95.11
94.93
95.23
95.23
Note: Ifyouneedabreakdownoftheperformancedatafortheindividual
CPU’s,executethefollowingcommand.
#sar-u-PALL
DisplayDiskIOStatisticsusingsarcommand# sar–d
Linux2.6.9-42.ELsmp(dev-db)
12:00:01AMDEV
12:05:01AMdev2-0
12:10:01AMdev8-1
Skipped..
Average:
Average:
dev2-0
dev8-1
4.66
1.89
120.77
3.17
69.45
8.02
01/01/2009
tpsrd_sec/s
1.651.28
4.088.11
wr_sec/s
45.43
21.81
125
LinuxHackAjayKumarTiwari
DisplaynetworkingStatisticsusingsarcommand# sar-nDEV|more
Linux2.6.9-42.ELsmp(dev-db)
12:00:01AMIFACErxpck/s
rxcmp/stxcmp/
srxmcst/s
12:05:01AMlo0.17
0.000.0
00.00
12:10:01AMeth052.92
0.000.0
00.00
01/01/2009
txpck/srxbyt/s
txbyt/s
0.16
25.31
23.33
53.64
10169.74
12178.57
# sar-nSOCK|more
Linux2.6.9-42.ELsmp(dev-db)
12:00:01AMtotscktcpsck
12:05:01AM5013
12:10:01AM5013
12:15:01AM5313
01/01/2009
udpsckrawsck
30
40
50
ip-frag
0
0
0
Hack97.vmstatCommandForatypicalperformancemonitoringallyouneedisonlyvmstatcommand.
Thisdisplaymemory,swap,IO,systemandcpuperformanceinformation.
Thefollowingcommandexecutesvmstatevery1secondfor100times.
# vmstat1100
procs–––—memory–––-–swap—–—io–-—system—–-cpu–-
rbswpdfreebuffcachesiso
00
00
02821201341085797012
02821201341085797012
126
0
0
bi
0
0
boin
0
0
2
0
csussyidwa
0001000
01007359001000
LinuxHack00
00
02821201341085797012
02821201341085797012
0
0
0
0
0
0
AjayKumarTiwari
01117577001000
01007366001000
VmstatprocsSectiono
o
rfield:Totalnumberofrunnableprocess
bfield:Totalnumberofblockedprocess
Memorysectiono
o
o
o
Swpdfield:Usedswapspace
Freefield:AvailablefreeRAM
Bufffield:RAMusedforbuffers
Cachefield:RAMusedforfilesystemcache
SwapSectiono
o
Sifield:Amountofmemoryswappedfromdiskpersecond
Sofield:Amountofmemoryswappedtodiskpersecond
IOSectiono
o
Bifield:Blocksreceivedfromdisk
Bofield:Blockssenttodisk.
SystemSectiono
o
Infield:Numberofinterruptspersecond.
Csfield:Numberofcontextswitchespersecond.
127
LinuxHackAjayKumarTiwari
CPUSectiono
o
o
o
Usfield:Timespendrunningusercode.(non-kernelcode)
Syfield:Timespentrunningkernelcode.
Idfield:Idletime.
Wafield:TimespentwaitingfortheIO
Hack98.NetstatCommandNetstatcommanddisplaysthenetworkrelatedinformationsuchasnetwork
connections,routingtables,interfacestatistics.Followingarefewexamples
onhowtousenetstatcommand.
DisplayActiveInternetConnectionsanddomainsocketsusing
netstat# netstat–an
ActiveInternetconnections(serversandestablished)
ProtoRecv-QSend-QLocalAddressForeign
AddressState
tcp000.0.0.0:56660.0.0.0:*
LISTEN
tcp000.0.0.0:1110.0.0.0:*
LISTEN
tcp000.0.0.0:40860.0.0.0:*
LISTEN
skipped..
ActiveUNIXdomainsockets(serversandestablished)
ProtoRefCntFlagsTypeStateI-NodePath
unix2[ACC]STREAMLISTENING7894
/tmp/.font-unix/fs7100
unix2[ACC]STREAMLISTENING9662
/tmp/.gdm_socket
unix2[ACC]STREAMLISTENING10897
@/tmp/fam-root-
128
LinuxHackAjayKumarTiwari
DisplayActiveConnectionswithProcessIDandProgramNameThiscouldbeveryhelpfultoidentifywhichprogramhasinitiatedaspecific
networkconnection.
# netstat-tap
ActiveInternetconnections(serversandestablished)
ProtoRecv-QSend-QLocalAddressForeign
AddressStatePID/Programname
tcp00*:nrpe*:*
LISTEN16277/xinetd
tcp00localhost.localdomain:smtp*:*
LISTEN7263/sendmail:acce
tcp340localhost.localdomain:54221
localhost.localdomain:4089CLOSE_WAIT29881/httpd
tcp03216dev-db:sshcpe-76-
94-215-154.soca:4682ESTABLISHED11717/sshd:ramesh
DisplayRoutingTable# netstat–-route
KernelIProutingtable
DestinationGateway
WindowirttIface
192.168.1.0*
0eth0
162.244.0.0*
0eth0
default192.168.1.1
0eth0
Genmask
255.255.255.0
255.255.0.0
0.0.0.0
U
Flags
MSS
00
U
UG
00
00
DisplayRAWnetworkstatistics# netstat—statistics—raw
Ip:
129
LinuxHackAjayKumarTiwari
11080343totalpacketsreceived
0forwarded
1withunknownprotocol
0incomingpacketsdiscarded
11037744incomingpacketsdelivered
11199763requestssentout
Icmp:
577135ICMPmessagesreceived
64inputICMPmessagefailed.
ICMPinputhistogram:
destinationunreachable:537
timeoutintransit:65
sourcequenches:2
echorequests:576476
echoreplies:12
timestamprequest:3
addressmaskrequest:3
581558ICMPmessagessent
0ICMPmessagesfailed
ICMPoutputhistogram:
destinationunreachable:5079
echoreplies:576476
timestampreplies:3
MiscNetstatCommandso
#netstat–-tcp–-numeric ListofTCPconnectiontoandfromthe
machine.
#netstat—tcp—listening–-programs DisplayTCPportthatthe
serverislisteningonalongwiththeprogramthatislisteningon
thatparticularport.
#netstat–rnC Displaytheroutingcache
o
o
Hack99.SysctlCommandLinuxkernelparametercanbechangedontheflyusingsysctlcommand.
130
LinuxHackAjayKumarTiwari
SysctlhelpstoconfiguretheLinuxkernelparametersduringruntime.
# sysctl–a
dev.cdrom.autoclose=1
fs.quota.writes=0
kernel.ctrl-alt-del=0
kernel.domainname=(none)
kernel.exec-shield=1
net.core.somaxconn=128
net.ipv4.tcp_window_scaling=1
net.ipv4.tcp_wmem=409616384
net.ipv6.route.mtu_expires=600
sunrpc.udp_slot_table_entries=16
vm.block_dump=0
131072
ModifyKernelparameterin/etc/sysctl.confforpermanentchangeAftermodifyingthekernelparameterinthe/etc/sysctl.conf,executesysctl–
ptocommitthechanges.Thechangeswillstillbethereafterthereboot.
#vi/etc/sysctl.conf
# sysctl–p
ModifykernelparametertemporarilyTotemporarilymodifyakernelparameter,executethefollowingcommand.
Pleasenotethatafterrebootthesechangeswillbelost.
#sysctl–w{variable-name=value}
131
LinuxHackAjayKumarTiwari
Hack100.NiceCommandKerneldecideshowmuchprocessortimeisrequiredforaprocessbasedon
thenicevalue.Possiblenicevaluerangeis:-20to20.Aprocessthathasa
nicevalueof-20isveryhighpriority.Theprocessthathasanicevalueof20
isverylowpriority.
Usepsaxltodisplaythenicevalueofallrunningprocessasshownbelow.# psaxl
FUIDPIDPPIDPRINIVSZRSSWCHANSTATTTY
TIMECOMMAND
40101602172552-S?
0:17init[5]
1031341900ksoftiSN?
3:18[ksoftirqd/0]
101015-1000workerS<?
0:01[events/0]
405145125103212418592-SNs?
0:08/usr/bin/python/usr/bin/rhn-applet-gui—sm-client-id
default4
40514751421603528604-S?
0:00/sbin/pam_timestamp_check-droot
1503175524180160142083920-S?
0:01/home/www/apache2/bin/httpd-f
/home/www/apache2/conf/httpd.conf-kstart
Howtoassignalowprioritytoashell-script?(highernicevalue)Intheexamplebelow,whenIstartedthenice-test.shscriptinthe
background,ittookthenicevalueof0.
$./nice-test.sh&
[3]13009
$psaxl|grepnice-test
05091300912863170
4652
972wait
S
132
LinuxHackpts/1
AjayKumarTiwari
0:00/bin/bash./nice-test.sh
[Note:6thcolumnwithvalue0isthenice.]
Now,letusexecutethesameshellscriptwithadifferentnicevalueasshown
below.
$ nice-10./nice-test.sh&
[1]13016
$psaxl|grepnice-test
0509130161286330104236968wait
pts/10:00/bin/bash./nice-test.sh
SN
[Note:6thcolumnwithvalue10isthenicevaluefor
theshell-script.]
Howtoassignahighprioritytoashell-script?(Lowernicevalue)Inthefollowingexample,letusassignanicevalueof-10(minus10)tothe
nice-test.shshellscript.
$ nice—10./nice-test.sh&
[1]13021
$nice:cannotsetpriority:Permissiondenied
Note: Onlyrootusercansetanegativenicevalue.Loginasrootandtrythe
same.Pleasenotethatthereisadoubledashbeforethe10inthenice
commandbelow.
# nice—10./nice-test.sh&
[1]13060
#psaxl|grepnice-test
40130601302410-105388964wait
pts/10:00/bin/bash./nice-test.sh
133
S<
LinuxHackAjayKumarTiwari
[Note:6thcolumnwithvalue-10isthenicevalueof
theshell-script.]
Hack101.ReniceCommandRenicealterstheschedulingpriorityofarunningprocess.
Howtodecreasethepriorityofarunningprocess?(Increasenice)Intheexamplebelow,anexistingshell-scriptisrunningatnicevalueof10.
(6thcolumninthepsoutput)
$psaxl|grepnice-test
0509132451321630105244968wait
pts/10:00/bin/bash./nice-test.sh
SN
Toincreasethenicevalue(thusreducingthepriority),executetherenice
commandasshownbelow.
$ renice16-p13245
13245:oldpriority10,newpriority16
$psaxl|grepnice-test
0509132451321636165244968wait
pts/10:00/bin/bash./nice-test.sh
SN
[Note:Now,the6thcolumnofthenice-test.sh(PID
13245)showsthenewnicevalueof16.]
Howtoincreasethepriorityofarunningprocess?(Decreasenice)Intheexamplebelow,anexistingshell-scriptisrunningatanicevalueof10.
134
LinuxHack(6thcolumninthepsoutput)
AjayKumarTiwari
$psaxl|grepnice-test
0509132541321630104412968wait
pts/10:00/bin/bash./nice-test.sh
SN
Inincreasethepriority,givealowernicevalueasshownbelow.However,
onlyrootcanincreasethepriorityofarunningprocess,elseyou’llgetthe
followingerrormessage.
$ renice5-p13254
renice:13254:setpriority:Permissiondenied
Loginasroottoincreasethepriorityofarunning
process
$su-
# renice5-p13254
13254:oldpriority10,newpriority5
#psaxl|grepnice-test
050913254132162554412968wait
pts/10:00/bin/bash./nice-test.sh
SN
[Note:The6thcolumnnowshowsalowernicevalueof5
(increasedpriority)]
135
LinuxHackAjayKumarTiwa
LinuxHack