Table Of Contentherubyracer”, “~> 0.11.4” group :development, :test do gem “rspec-rails”, “~> 2.13.0” $ gem install bundler $ gem install rails --version=3.2.12 $ rbenv rehash $ r
todolist --skip-test-unit respond_to do |format| if @task.update_attributes(params[:task]) format.html { redirect_to @task, notice: ‘...’ } format.json { head :no_content } else
t.html { render action: “edit” } format.json { render json: @task.errors, status: :unprocessable_entity } $ bundle exec rails generate migration add_priority_to_tasks
priority:integer $ bundle exec rake db:migrate $ bundle exec rake db:migrate $ bundle exec rails server validate :due_at_is_in_the_past def due_at_is_in_the_past err
add(:due_at, ‘is in the past!’) if due_at < Time.zone.now #!/usr/bin/en python import pygame from random import randrange MAX_STARS = 100 pygame.init() screen =
ame.display.set_mode((640, 480)) clock = pygame.time.Clock() stars = for i in range(MAX_STARS): star = [randrange(0, 639), randrange(0, 479), randrange(1, 16)] star
append(star) while True: clock.tick(30) for event in pygame.event.get(): if event.type == pygame.QUIT: exit(0) #!/usr/bin/perl $numstars = 100; use Time::HiRes qw(usleep);
urses; $screen = new Curses; noecho; curs_set(0); for ($i = 0; $i < $numstars ; $i++) { $star_x[$i] = rand(80); $star_y[$i] = rand(24); $star_s[$i] = rand(4) + 1; } while (1) {
een->clear; for ($i = 0; $i < $numstars ; $i++) { $star_x[$i] -= $star_s[$i]; if ($star_x[$i] < 0) { $star_x[$i] = 80; } $screen->addch($star_y[$i], $star_x[$i], “.”); } $screen->refr
eep 50000; gem “therubyracer”, “~> 0.11.4” group :development, :test do gem “rspec-rails”, “~> 2.13.0” $ gem install bundler $ gem install rails --version=3.2.12 $ rben
ehash $ rails new todolist --skip-test-unit respond_to do |format| if @task.update_attributes(params[:task]) format.html { redirect_to @task, notice: ‘...’ } format.json { head
tent } else format.html { render action: “edit” } format.json { render json: @task.errors, status: :unprocessable_entity } $ bundle exec rails generate migration add_
priority_to_tasks priority:integer $ bundle exec rake db:migrate $ bundle exec rake db:migrate $ bundle exec rails server validate :due_at_is_in_the_past def due_at_is_in_
he_past errors.add(:due_at, ‘is in the past!’) if due_at < Time.zone.now #!/usr/bin/en python import pygame from random import randrange MAX_STARS = 100 pygame.
init() screen = pygame.display.set_mode((640, 480)) clock = pygame.time.Clock() stars = for i in range(MAX_STARS): star = [randrange(0, 639), randrange(0, 479), randrang
16)] stars.append(star) while True: clock.tick(30) for event in pygame.event.get(): if event.type == pygame.QUIT: exit(0) #!/usr/bin/perl $numstars = 100; use Time::HiR
eep); use Curses; $screen = new Curses; noecho; curs_set(0); for ($i = 0; $i < $numstars ; $i++) { $star_x[$i] = rand(80); $star_y[$i] = rand(24); $star_s[$i] = rand(4) + 1;
e (1) { $screen->clear; for ($i = 0; $i < $numstars ; $i++) { $star_x[$i] -= $star_s[$i]; if ($star_x[$i] < 0) { $star_x[$i] = 80; } $screen->addch($star_y[$i], $star_x[$i], “.”); }
een->refresh; usleep 50000; gem “therubyracer”, “~> 0.11.4” group :development, :test do gem “rspec-rails”, “~> 2.13.0” $ gem install bundler $ gem install r
sion=3.2.12 $ rbenv rehash $ rails new todolist --skip-test-unit respond_to do |format| if @task.update_attributes(params[:task]) format.html { redirect_to @task, notice:
ormat.json { head :no_content } else format.html { render action: “edit” } format.json { render json: @task.errors, status: :unprocessable_entity } $ bundle exec r
2022
te migration add_priority_to_tasks priority:integer $ bundle exec rake db:migrate $ bundle exec rake db:migrate $ bundle exec rails server validate :due_at_is_in_t
past def due_at_is_in_the_past errors.add(:due_at, ‘is in the past!’) if due_at < Time.zone.now #!/usr/bin/en python import pygame from random import randrange MAX_
ARS = 100 pygame.init() screen = pygame.display.set_mode((640, 480)) clock = pygame.time.Clock() stars = for i in range(MAX_STARS): star = [randrange(0, 639),
ange(0, 479), randrange(1, 16)] stars.append(star) while True: clock.tick(30) for event in pygame.event.get(): if event.type == pygame.QUIT: exit(0) #!/usr/bin/perl
umstars = 100; use Time::HiRes qw(usleep); use Curses; $screen = new Curses; noecho; curs_set(0); for ($i = 0; $i < $numstars ; $i++) { $star_x[$i] = rand(80); $star_y[$i]
and(24); $star_s[$Fi] U= raLndL(4 ) O+ 1F; } while (1) { $screen->clear; for ($i = 0; $i < $numstars ; $i++) { $star_x[$i] -= $star_s[$i]; if ($star_x[$i] < 0) { $star_x[$i] = 80; } $scr
>addch($star_y[$i], $star_x[$i], “.”); } $screen->refresh; usleep 50000; gem “therubyracer”, “~> 0.11.4” group :development, :test do gem “rspec-rails”, “~> 2.13.0” $ gem install
EXPERT
er $ gem install rails --version=3.2.12 $ rbenv rehash $ rails new todolist --skip-test-unit respond_to do |format| if @task.update_attributes(params[:task]) format.html {
ect_to @task, noticTe:I ‘.P..’ S} fo r&mat .json { head :no_content } else format.html { render action: “edit” } format.json { render json: @task.errors, status: :unprocessable_en
bundle exec rails geAneDrateV mIiCgraEtio n add_priority_to_tasks priority:integer $ bundle exec rake db:migrate $ bundle exec rake db:migrate $ bundle exec rails server valida
t_is_in_the_past def due_at_is_in_the_past errors.add(:due_at, ‘is in the past!’) if due_at < Time.zone.now #!/usr/bin/en python import pygame from random impor
ange MAX_STARS = 100 pygame.init() screen = pygame.display.set_mode((640, 480)) clock = pygame.time.Clock() stars = for i in range(MAX_STARS): star =
ange(0, 639), randrange(0, 479), randrange(1, 16)] stars.append(star) while True: clock.tick(30) for event in pygame.event.get(): if event.type == pygame.QUIT: exit(0)
#!/usr/bin/perl $numstars = 100; use Time::HiRes qw(usleep); use Curses; $screen = new Curses; noecho; curs_set(0); for ($i = 0; $i < $numstars ; $i++) { $star_x[$i] = rand(80);
$star_y[$i] = rand(24); $star_s[$iA] = raDnd(4)V + 1; A} whiNle (1) {C $scrEeen-> clYear; O for ($Ui = 0; R$i < $ nuLmstIarsN ; $i+U+) { $sXtar_x [$Si] -= $Kstar_Is[$Li]; ifL ($stSar_x[ $i] < 0) { $star_x[$i] = 80; }
een->addch($star_y[$i], $star_x[$i], “.”); } $screen->refresh; usleep 50000; gem “therubyracer”, “~> 0.11.4” group :development, :test do gem “rspec-rails”, “~> 2.13.0” $
em install bundler $ gem install rails --version=3.2.12 $ rbenv rehash $ rails new todolist --skip-test-unit respond_to do |format| if @task.update_attributes(params[:task])
• THE KERNEL • NETWORKS
t.html { redirect_to @task, notice: ‘...’ } format.json { head :no_content } else format.html { render action: “edit” } format.json { render json: @task.errors, sta
ocessable_entity } $ bundle exec rails generate migration add_priority_to_tasks priority:integer $ bundle exec rake db:migrate $ bundle exec rake db:migrate $ bundl
ails server validate :due_at_is_in_the_past def due_at_is_in_the_past errors.add(:due_at, ‘is in the past!’) if due_at < Time.zone.now #!/usr/bin/en python impor
• SERVERS • HARDWARE • SECURITY
ame from random import randrange MAX_STARS = 100 pygame.init() screen = pygame.display.set_mode((640, 480)) clock = pygame.time.Clock() stars = for i in
e(MAX_STARS): star = [randrange(0, 639), randrange(0, 479), randrange(1, 16)] stars.append(star) while True: clock.tick(30) for event in pygame.event.get(): if event.type
ame.QUIT: exit(0) #!/usr/bin/perl $numstars = 100; use Time::HiRes qw(usleep); use Curses; $screen = new Curses; noecho; curs_set(0); for ($i = 0; $i < $numstar
$i++) { $star_x[$i] = rand(80); $star_y[$i] = rand(24); $star_s[$i] = rand(4) + 1; } while (1) { $screen->clear; for ($i = 0; $i < $numstars ; $i++) { $star_x[$i] -= $star_s[$i]; if
($star_x[$i] < 0) { $star_x[$i] = 80; } $screen->addch($star_y[$i], $star_x[$i], “.”); } $screen->refresh; usleep 50000; gem “therubyracer”, “~> 0.11.4” group :development, :t
em “rspec-rails”, “~> 2.13.0” $ gem install bundler $ gem install rails --version=3.2.12 $ rbenv rehash $ rails new todolist --skip-test-unit respond_to do |format| if @task.
e_attributes(params[:task]) format.html { redirect_to @task, notice: ‘...’ } format.json { head :no_content } else format.html { render action: “edit” } format.json { render
json: @task.errors, status: :unprocessable_entity } $ bundle exec rails generate migration add_priority_to_tasks priority:integer $ bundle exec rake db:migrate $ bundle ex
e db:migrate $ bundle exec rails server1 va6lidate4 :du e_Pat_isA_in_Gthe_pEast dSef du eO_at_isF_in_ thTe_paUst erTrors.Oadd(:dRue_aIt, A‘is inL theS past!’) if due_at < Time.zone.now #!/usr/
python import pygame from random import randrange MAX_STARS = 100 pygame.init() screen = pygame.display.set_mode((640, 480)) clock = pygame.time.Clock()
s = for i in range(MAX_STARS): star = [randrange(0, 639), randrange(0, 479), randrange(1, 16)] stars.append(star) while True: clock.tick(30) for event in pygame.ev
ENHANCE YOUR KNOWLEDGE
et(): if event.type == pygame.QUIT: exit(0) #!/usr/bin/perl $numstars = 100; use Time::HiRes qw(usleep); use Curses; $screen = new Curses; noecho; curs_set(0); for ($i
umstars ; $i++) { $star_x[$i] = rand(80); $star_y[$i] = rand(24); $star_s[$i] = rand(4) + 1; } while (1) { $screen->clear; for ($i = 0; $i < $numstars ; $i++) { $star_x[$i] -=
WITH IN-DEPTH PROJECTS
$star_s[$i]; if ($star_x[$i] < 0) { $star_x[$i] = 80; } $screen->addch($star_y[$i], $star_x[$i], “.”); } $screen->refresh; usleep 50000; gem “therubyracer”, “~> 0.11.4” gr
elopment, :telst don gem “rspec-rails”, “~> 2.13.0” $ gem install bundler $ gem install rails --version=3.2.12 $ rbenv rehash $ rails new todolist --skip-test-unit respond_to
a
ormat| if @task.uopdate_attributes(params[:task]) format.html A{ rediNrect_tDo @ta skG, notUice: ‘..I.’ D} formEat.jsSon { head :no_content } else format.html { render action: “edit” }
t.json { rentder json: @task.errors, status: :unprocessable_entity } $ bundle exec rails generate migration add_priority_to_tasks priority:integer $ bundle exec
i
it
db:migrate $ bungdle exec rake db:migrate $ bundle exec rails server validate :due_at_is_in_the_past def due_at_is_in_the_past errors.add(:due_at, ‘is in the past!’) if due_a
i
ime.zone.nowi #!/udsr/bin/en python import pygame from random import randrange MAX_STARS = 100 pygame.init() screen = pygame.display.set_mode((640, 480)) clock
D
ame.time.ClockE() stars = for i in range(MAX_STARS): star = [randrange(0, 639), randrange(0, 479), randrange(1, 16)] stars.append(star) while True: clock.tick(30) f
t in pygame.event.get(): if event.type == pygame.QUIT: exit(0) #!/usr/bin/perl $numstars = 100; use Time::HiRes qw(usleep); use Curses; $screen = new Curses; noecho;
s_set(0); for ($i = 0; $i < $numstars ; $i++) { $star_x[$i] = rand(80); $star_y[$i] = rand(24); $star_s[$i] = rand(4) + 1; } while (1) { $screen->clear; for ($i = 0; $i < $numstar
$i++) { $star_x[$i] -= $staH r_s[$i]; if ($star_x[$i] < 0) { $star_x[$i] = 80; } $screen->addch($star_y[$i], $star_x[$i], “.”); } $screen->refresh; usleep 50000; gem “therubyracer”, “~>
0.11.4” group :developmENTeNnt, :test do gem “rspec-rails”, “~> 2.13.0” $ gem install bundler $ gem install rails --version=3.2.12 $ rbenv rehash $ rails new todolist --skip-test-unit
espond_to do |format| ifHIRTE @DITIOtask.update_attributes(params[:task]) format.html { redirect_to @task, notice: ‘...’ } format.json { head :no_content } else format.html { render action:
TE
“edit” } format.json { render json: @task.errors, status: :unprocessable_entity } $ bundle exec rails generate migration add_priority_to_tasks priority:integer $ bundle ex
db:migrate $ bundle exec rake db:migrate $ bundle exec rails server validate :due_at_is_in_the_past def due_at_is_in_the_past errors.add(:due_at, ‘is in the past!’)
2022
Welcome to the 2022 edition of the Hacker’s Manual! You hold in your hands
164 pages of Linux hacking tutorials, guides and features from the experts at
Linux Format magazine – the home of open source software. In this edition
we’ve gone in hard for security. You’ll find guides to securing servers, getting
a grounding in hacking, using security tools such as Kali and Fedora Security
Lab, alongside solid features explaining how to protect your privacy online
using established tools like Tails. But we shouldn’t live in fear! Hacking is
monumental fun. Never mind setting up and playing with Linux, we take a
look at hacking tablets, media servers, virtual machines, cloud servers,
multi-booting with Grub and much more. If you’re a little timid when it comes
to the Terminal we even have a meaty reference section at the back.
So dive in and enjoy!
2022
Future PLC Quay House, The Ambury, Bath, BA1 1UA
Editorial
Editor Aiden Dalby
Designer Steve Dacombe
Compiled by April Madden & Adam Markiewicz
Senior Art Editor Andy Downes
Head of Art & Design Greg Whitaker
Editorial Director Jon White
Photography
All copyrights and trademarks are recognised and respected
Advertising
Media packs are available on request
Commercial Director Clare Dove
International
Head of Print Licensing Rachel Shaw
[email protected]
www.futurecontenthub.com
Circulation
Head of Newstrade Tim Mathers
Production
Head of Production Mark Constance
Production Project Manager Matthew Eglinton
Advertising Production Manager Joanne Crosby
Digital Editions Controller Jason Hudson
Production Managers Keely Miller, Nola Cokely,
Vivienne Calvert, Fran Twentyman
Printed in the UK
Distributed by Marketforce, 5 Churchill Place, Canary Wharf, London, E14 5HU
www.marketforce.co.uk Tel: 0203 787 9001
Hacker’s Manual 2022 Thirteenth Edition (TCB4558)
© 2022 Future Publishing Limited
We are committed to only using magazine paper which is derived from
responsibly managed, certified forestry and chlorine-free manufacture. The paper in
this bookazine was sourced and produced from sustainable managed forests,
conforming to strict environmental and socioeconomic standards.
All contents © 2022 Future Publishing Limited or published under licence. All rights reserved.
No part of this magazine may be used, stored, transmitted or reproduced in any way without
the prior written permission of the publisher. Future Publishing Limited (company number
2008885) is registered in England and Wales. Registered office: Quay House, The Ambury,
Bath BA1 1UA. All information contained in this publication is for information only and is, as far
as we are aware, correct at the time of going to press. Future cannot accept any responsibility
for errors or inaccuracies in such information. You are advised to contact manufacturers and
retailers directly with regard to the price of products/services referred to in this publication. Apps
and websites mentioned in this publication are not under our control. We are not responsible for
their contents or any other changes or updates to them. This magazine is fully independent
and not affiliated in any way with the companies mentioned herein.
Future plc is a public Chief executive Zillah Byng-Thorne
company quoted on the Non-executive chairman Richard Huntingford
London Stock Exchange Chief financial officer Penny Ladkin-Brand
(symbol: FUTR)
www.futureplc.com Tel +44 (0)1225 442 244
add_priority_to_tasks priority:integer $ bundle exec rake db:migrate $ bundle exec rake db:migrate $ bundle exec rails server validate :due_at_is_in_the_past def
due_at_is_in_the_past errors.add(:due_at, ‘is in the past!’) if due_at < Time.zone.now #!/usr/bin/en python import pygame from random import randrange MAX_
STARS = 100 pygame.init() screen = pygame.display.set_mode((640, 480)) clock = pygame.time.Clock() stars = for i in range(MAX_STARS): star = [randrange(0, 639),
Contents
randrange(0, 479), randrange(1, 16)] stars.append(star) while True: clock.tick(30) for event in pygame.event.get(): if event.type == pygame.QUIT: exit(0) #!/usr/bin/perl
$numstars = 100; use Time::HiRes qw(usleep); use Curses; $screen = new Curses; noecho; curs_set(0); for ($i = 0; $i < $numstars ; $i++) { $star_x[$i] = rand(80);
$star_y[$i] = rand(24); $star_s[$i] = rand(4) + 1; } while (1) { $screen->clear; for ($i = 0; $i < $numstars ; $i++) { $star_x[$i] -= $star_s[$i]; if ($star_x[$i] < 0) { $star_x[$i]
= 80; } $screen->addch($star_y[$i], $star_x[$i], “.”); } $screen->refresh; usleep 50000; gem “therubyracer”, “~> 0.11.4” group :development, :test do gem “rspec-rails”,
“~> 2.13.0” $ gem install bundler $ gem install rails --version=3.2.12 $ rbenv rehash $ rails new todolist --skip-test-unit respond_to do |format| if @task.update_
attributes(params[:task]) format.html { redirect_to @task, notice: ‘...’ } format.json { head :no_content } else format.html { render action: “edit” } format.json { render
json: @task.errors, status: :unprocessable_entity } $ bundle exec rails generate migration add_priority_to_tasks priority:integer $ bundle exec rake db:migrate $ bundle
exec rake db:migrate $ bundle exec rails server validate :due_at_is_in_the_past def due_at_is_in_the_past errors.add(:due_at, ‘is in the past!’) if due_at < Time.zone.
now #!/usr/bin/en python import pygame from random import randrange MAX_STARS = 100 pygame.init() screen = pyg ame .display.set_mode((640, 480)) clock =
pygame.time.Clock() stars = for i in range(MAX_STARS): star = [randrange(0, 639), randrange(0, 479), randrange(1, 16)] stars.append(star) while True: clock.tick(30)
for event in pygame.event.get(): if event.type == pygame.QUIT: exit(0) #!/usr/bin/perl $numstars = 100; use Time::HiRes qw(usleep); use Curses; $screen = new
Curses; noecho; curs_set(0); for ($i = 0; $i < $numstars ; $i++) { $star_x[$i] = rand(80); $star_y[$i] = rand(24); $star_s[$i] = rand(4) + 1; } while (1) { $screen->clear; for
($i = 0; $i < $numstars ; $i++) { $star_x[$i] -= $star_s[$i]; if ($star_x[$i] < 0) { $star_x[$i] = 80; } $screen->addch($star_y[$i], $star_x[$i], “.”); } $screen->refresh; usleep
50000; gem “therubyracer”, “~> 0.11.4” group :development, :test do gem “rspec-rails”, “~> 2.13.0” $ gem install bundler $ gem install rails --version=3.2.12 $ rbenv
rehash $ rails new todolist --skip-test-unit respond_to do2 |format| if @0task.update_2attributes(pa2rams[:task]) format.html { redirect_to @task, notice: ‘...’ } format.json {
head :no_content } else format.html { render action: “edit” } format.json { render json: @task.errors, status: :unprocessable_entity } $ bundle exec rails generate
migration add_priority_to_tasks priority:integer $ bundle exec rake db:migrate $ bundle exec rake db:migrate $ bundle exec rails server validate :due_at_is_in_the_
past def due_at_is_in_the_past errors.add(:due_at, ‘is in the past!’) if due_at < Time.zone.now #!/usr/bin/en python import pygame from random import randrange
MAX_STARS = 100 pygame.init() screen = pygame.display.set_mode((640, 480)) clock = pygame.time.Clock() stars = for i in range(MAX_STARS): star = [randrange(0,
639), randrange(0, 479), randrange(1, 16)] stars.append(star) while True: clock.tick(30) for event in pygame.event.get(): if event.type == pygame.QUIT: exit(0) #!/usr/
bin/perl $numstars = 100; use Time::HiRes qw(usleep); use Curses; $screen = new Curses; noecho; curs_set(0); for ($i = 0; $i < $numstars ; $i++) { $star_x[$i] =
rand(80); $star_y[$i] = rand(24); $star_s[$i] = rand(4) + 1; } while (1) { $screen->clear; for ($i = 0; $i < $numstars ; $i++) { $star_x[$i] -= $star_s[$i]; if ($star_x[$i] < 0) {
$star_x[$i] = 80; } $screen->addch($star_y[$i], $star_x[$i], “.”); } $screen->refresh; usleep 50000; gem “therubyracer”, “~> 0.11.4” group :development, :test do gem
“rspec-rails”, “~> 2.13.0” $ gem install bundler $ gem install rails --version=3.2.12 $ rbenv rehash $ rails new todolist --skip-test-unit respond_to do |format| if @task.
Distros Security
The distro is the core of Linux, so make The best defence is a good offence, but
sure you get the right one. also a good defence.
10 Ubuntu 21.04 54 Fortress Linux
Get the lowdown on the latest Ubuntu release Discover what threats are out there and what
and discover its secrets. you can do to protect your devices.
18 30 years of Linux 62 Kali Linux
How a 21-year-old’s bedroom coding project We take you inside the ultimate hacking
took over the world. toolkit and explain how to use it in anger.
24 Inside the Linux kernel 66 Secure chat clients
How did Linux come to be? What makes it Chat online without anyone snooping in on
tick? We answer all this and more. what you have to say.
32 Compile the kernel 72 Lock down Linux
It’s the ultimate nerd credential, compile your We outline the essentials of locking down
own custom kernel, here’s how… your Linux boxes for secure networking.
36 The ultimate home server 76 Fedora security lab
We guide you through building, configuring There’s more than one way to skin a cat, so
and using an all-singing home server. try out the Fedora hacking lab.
44 FireIP firewall 80 Key management
Build a wall, not of tacos, but of fire! Keep out Learn how to create a good GnuPG key and
hackers with a dedicated firewall. keep it safe from online thieves.
48 Rescatux repair
Explore one of the most famous rescue and
repair systems powered by Linux.
6 | The Hacker’s Manual
Contents
Software Hacking
Discover the most powerful Linux Take your Linux skills to
software and get using it. the next level and beyond.
86 OpenELEC 112 Hacker’s manual
Get to grips with the media system for Discover the tricks used by hackers
desktops and embedded systems. to help keep your systems safe.
90 Virtual Box 120 Linux on a Linx tablet
Ensure you get the best out of your virtual Get Linux up and running on a low-cost
systems with our essential guide. Windows tablet without the hassle.
94 NextCloud 124 Multi-boot Linux
The break away, all new cloud storage and Discover the inner workings of Grub and boot
document system is live for all. lots of OSes from one PC.
98 NagiOS 128 Build your own custom Ubuntu distro
Industry-level system monitoring so you Why settle for what the existing distrubutions
can track all your Linux PCs. have to offer?
102 Octave 132 LTTng monitoring
Get to grips with the high-end scientific Get to know what all your programs are up to
and mathematical language. by tracing Linux app activity.
106 Inside KDE 5 136 USB multi-boot
Discover the building blocks that help build We explain how you can carry multiple distros
the prettiest desktop and apps around. on a single USB drive.
The terminal
Feel like a l337 hacker and get to grips
with the powerful terminal.
142 Get started 150 Drive partitions
The best way to use the terminal is to dive in Control, edit and create hard drive partitions
with both feet and start using it. and permissions.
144 Files and folders 152 Remote X access
We explain how you can navigate the file Set up and access remote GUI applications
system and start manipulating things. using X11.
146 Edit config files 154 Display control
Discover how you can edit configuration files Sticking with the world of X11 we take some
from within the text terminal. randr for resolution control.
148 System information 156 Core commands
Interrogate the local system to discover all of 20 essential terminal commands that all Linux
its dirty little secrets. web server admins should know.
The Hacker’s Manual | 7
herubyracer”, “~> 0.11.4” group :development, :test do gem “rspec-rails”, “~> 2.13.0” $ gem install bundler $ gem install rails --version=3.2.12 $ rbenv rehash $ rails ne
task.update_attributes(params[:task]) format.html { redirect_to @task, notice: ‘...’ } format.json { head :no_content } else format.html { render action: “edit” } format.json { render json: @task.err
e exec rails generate migration add_priority_to_tasks priority:integer $ bundle exec rake db:migrate $ bundle exec rake db:migrate $ bundle exec rails server validate :due_a
add(:due_at, ‘is in the past!’) if due_at < Time.zone.now #!/usr/bin/en python import pygame from random import randrange MAX_STARS = 100 pygame.init() screen = pyg
Clock() stars = for i in range(MAX_STARS): star = [randrange(0, 639), randrange(0, 479), randrange(1, 16)] stars.append(star) while True: clock.tick(30) for event in pygame.e
bin/perl $numstars = 100; use Time::HiRes qw(usleep); use Curses; $screen = new Curses; noecho; curs_set(0); for ($i = 0; $i < $numstars ; $i++) { $star_x[$i] = rand(80); $star_y[$i] = r
een->clear; for ($i = 0; $i < $numstars ; $i++) { $star_x[$i] -= $star_s[$i]; if ($star_x[$i] < 0) { $star_x[$i] = 80; } $screen->addch($star_y[$i], $star_x[$i], “.”); } $screen->refresh; usl
elopment, :test do gem “rspec-rails”, “~> 2.13.0” $ gem install bundler $ gem install rails --version=3.2.12 $ rbenv rehash $ rails new todolist --skip-test-unit respond_to do |f
t.html { redirect_to @task, notice: ‘...’ } format.json { head :no_content } else format.html { render action: “edit” } format.json { render json: @task.errors, status: :unprocessabl
add_priority_to_tasks priority:integer $ bundle exec rake db:migrate $ bundle exec rake db:migrate $ bundle exec rails server validate :due_at_is_in_the_past def due_at_is_in_t
ime.zone.now #!/usr/bin/en python import pygame from random import randrange MAX_STARS = 100 pygame.init() screen = pygame.display.set_mode((640, 480)) clock = p
ARS): star = [randrange(0, 639), randrange(0, 479), randrange(1, 16)] stars.append(star) while True: clock.tick(30) for event in pygame.event.get(): if event.type == pygame.QUIT: exit(0) #!/usr/bin/perl $n
ime::HiRes qw(usleep); use Curses; $screen = new Curses; noecho; curs_set(0); for ($i = 0; $i < $numstars ; $i++) { $star_x[$i] = rand(80); $star_y[$i] = rand(24); $star_s[$i] = r
umstars ; $i++) { $star_x[$i] -= $star_s[$i]; if ($star_x[$i] < 0) { $star_x[$i] = 80; } $screen->addch($star_y[$i], $star_x[$i], “.”); } $screen->refresh; usleep 50000; gem “therub
ails”, “~> 2.13.0” $ gem install bundler $ gem install rails --version=3.2.12 $ rbenv rehash $ rails new todolist --skip-test-unit respond_to do |format| if @task.update_a
notice: ‘...’ } format.json { head :no_content } else format.html { render action: “edit” } format.json { render json: @task.errors, status: :unprocessable_entity } $ bundle exec rails g
e exec rake db:migrate $ bundle exec rake db:migrate $ bundle exec rails server validate :due_at_is_in_the_past def due_at_is_in_the_past errors.add(:due_at, ‘is in the
t pygame from random import randrange MAX_STARS = 100 pygame.init() screen = pygame.display.set_mode((640, 480)) clock = pygame.time.Clock() stars = for i in r
ange(0, 479), randrange(1, 16)] stars.append(star) while True: clock.tick(30) for event in pygame.event.get(): if event.type == pygame.QUIT: exit(0) #!/usr/bin/perl $numstar
een = new Curses; noecho; curs_set(0); for ($i = 0; $i < $numstars ; $i++) { $star_x[$i] = rand(80); $star_y[$i] = rand(24); $star_s[$i] = rand(4) + 1; } while (1) { $screen->cl
$star_s[$i]; if ($star_x[$i] < 0) { $star_x[$i] = 80; } $screen->addch($star_y[$i], $star_x[$i], “.”); } $screen->refresh; usleep 50000; gem “therubyracer”, “~> 0.11.4” group :developmen
install bundler $ gem install rails --version=3.2.12 $ rbenv rehash $ rails new todolist --skip-test-unit respond_to do |format| if @task.update_attributes(params[:task]) format.html { r
tent } else format.html { render action: “edit” } format.json { render json: @task.errors, status: :unprocessable_entity } $ bundle exec rails generate migration add_priority_to_tasks priority:in
e exec rake db:migrate $ bundle exec rails server validate :due_at_is_in_the_past def due_at_is_in_the_past errors.add(:due_at, ‘is in the past!’) if due_at < Time.zone.no
t randrange MAX_STARS = 100 pygame.init() screen = pygame.display.set_mode((640, 480)) clock = pygame.time.Clock() stars = for i in range(MAX_STARS): star = [r
s.append(star) while True: clock.tick(30) for event in pygame.event.get(): if event.type == pygame.QUIT: exit(0) #!/usr/bin/perl $numstars = 100; use Time::HiRes qw(usl
or ($i = 0; $i < $numstars ; $i++) { $star_x[$i] = rand(80); $star_y[$i] = rand(24); $star_s[$i] = rand(4) + 1; } while (1) { $screen->clear; for ($ i = 0; $i < $numstars ; $i++) { $star_x[$i] -= $star_s[$i]; if ($star_x[$i] < 0) { $star_x[$i]
= 80; } $screen->addch($star_y[$i], $star_x[$i], “.”); } $screen->refresh; usleep 50000; gem “therubyracer”, “~> 0.11.4” group :development, :test do gem “rspec-rails”, “~> 2.13.0” $ g
v rehash $ rails new todolist --skip-test-unit respond_to do |format| if @task.update_attributes(params[:task]) format.html { redirect_to @task, notice: ‘...’ } format.json { head :no_con
t.json { render json: @task.errors, status: :unprocessable_entity } $ bundle exec rails generate migration add_priority_to_tasks priority:integer $ bundle exec rake db:migr
alidate :due_at_is_in_the_past def due_at_is_in_the_past errors.add(:due_at, ‘is in the past!’) if due_at < Time.zone.now #!/usr/bin/en python import pygame from r
init() screen = pygame.display.set_mode((640, 480)) clock = pygame.time.Clock() stars = for i in range(MAX_STARS): star = [randrange(0, 639), randrange(0, 479), randrange(1, 16)] star
t in pygame.event.get(): if event.type == pygame.QUIT: exit(0) #!/usr/bin/perl $numstars = 100; use Time::HiRes qw(usleep); use Curses; $screen = new Curses; noecho; cur
and(80); $star_y[$i] = rand(24); $star_s[$i] = rand(4) + 1; } while (1) { $screen->clear; for ($i = 0; $i < $numstars ; $i++) { $star_x[$i] -= $star_s[$i]; if ($star_x[$i] < 0) { $star_x[$i] = 80; } $scr
een->refresh; usleep 50000; gem “therubyrace2r”, “~> 0.11.4” g0roup :developmen2t, :test do gem “r2spec-rails”, “~> 2.13.0” $ gem install bundler $ gem install rails --version=3.2.12 $ rben
espond_to do |format| if @task.update_attributes(params[:task]) format.html { redirect_to @task, notice: ‘...’ } format.json { head :no_content } else format.html { render action: “edit” } f
tus: :unprocessable_entity } $ bundle exec rails generate migration add_priority_to_tasks priority:integer $ bundle exec rake db:migrate $ bundle exec rake db:migrate $ bundl
def due_at_is_in_the_past errors.add(:due_at, ‘is in the past!’) if due_at < Time.zone.now #!/usr/bin/en python import pygame from random import randrange MAX_STARS = 100 p
mode((640, 480)) clock = pygame.time.Clock() stars = for i in range(MAX_STARS): star = [randrange(0, 639), randrange(0, 479), randrange(1, 16)] stars.append(star) while True: clock.tick(30) f
type == pygame.QUIT: exit(0) #!/usr/bin/perl $numstars = 100; use Time::HiRes qw(usleep); use Curses; $screen = new Curses; noecho; curs_set(0); for ($i = 0; $i < $numstar
$star_s[$i] = rand(4) + 1; } while (1) { $screen->clear; for ($i = 0; $i < $numstars ; $i++) { $star_x[$i] -= $star_s[$i]; if ($star_x[$i] < 0) { $star_x[$i] = 80; } $screen->addch($star_y[$i], $star_x[$i], “.”); } $scr
herubyracer”, “~> 0.11.4” group :development, :test do gem “rspec-rails”, “~> 2.13.0” $ gem install bundler $ gem install rails --version=3.2.12 $ rbenv rehash $ rails ne
task.update_attributes(params[:task]) format.html { redirect_to @task, notice: ‘...’ } format.json { head :no_content } else format.html { render action: “edit” } format.json { render json: @task.err
e exec rails generate migration add_priority_to_tasks priority:integer $ bundle exec rake db:migrate $ bundle exec rake db:migrate $ bundle exec rails server validate :due_a
add(:due_at, ‘is in the past!’) if due_at < Time.zone.now #!/usr/bin/en python import pygame from random import randrange MAX_STARS = 100 pygame.init() screen = pyg
Clock() stars = for i in range(MAX_STARS): star = [randrange(0, 639), randrange(0, 479), randrange(1, 16)] stars.append(star) while True: clock.tick(30) for event in pygame.e
bin/perl $numstars = 100; use Time::HiRes qw(usleep); use Curses; $screen = new Curses; noecho; curs_set(0); for ($i = 0; $i < $numstars ; $i++) { $star_x[$i] = rand(80); $star_y[$i] = r
een->clear; for ($i = 0; $i < $numstars ; $i++) { $star_x[$i] -= $star_s[$i]; if ($star_x[$i] < 0) { $star_x[$i] = 80; } $screen->addch($star_y[$i], $star_x[$i], “.”); } $screen->refresh; usl
elopment, :test do gem “rspec-rails”, “~> 2.13.0” $ gem install bundler $ gem install rails --version=3.2.12 $ rbenv rehash $ rails new todolist --skip-test-unit respond_to do |f
t.html { redirect_to @task, notice: ‘...’ } format.json { head :no_content } else format.html { render action: “edit” } format.json { render json: @task.errors, status: :unprocessabl
add_priority_to_tasks priority:integer $ bundle exec rake db:migrate $ bundle exec rake db:migrate $ bundle exec rails server validate :due_at_is_in_the_past def due_at_is_in_t
ime.zone.now #!/usr/bin/en python import pygame from random import randrange MAX_STARS = 100 pygame.init() screen = pygame.display.set_mode((640, 480)) clock = p
ARS): star = [randrange(0, 639), randrange(0, 479), randrange(1, 16)] stars.append(star) while True: clock.tick(30) for event in pygame.event.get(): if event.type == pygame.QUIT: exit(0) #!/usr/bin/perl $n
ime::HiRes qw(usleep); use Curses; $screen = new Curses; noecho; curs_set(0); for ($i = 0; $i < $numstars ; $i++) { $star_x[$i] = rand(80); $star_y[$i] = rand(24); $star_s[$i] = r
umstars ; $i++) { $star_x[$i] -= $star_s[$i]; if ($star_x[$i] < 0) { $star_x[$i] = 80; } $screen->addch($star_y[$i], $star_x[$i], “.”); } $screen->refresh; usleep 50000; gem “therub
ails”, “~> 2.13.0” $ gem install bundler $ gem install rails --version=3.2.12 $ rbenv rehash $ rails new todolist --skip-test-unit respond_to do |format| if @task.update_a
notice: ‘...’ } format.json { head :no_content } else format.html { render action: “edit” } format.json { render json: @task.errors, status: :unprocessable_entity } $ bundle exec rails g
e exec rake db:migrate $ bundle exec rake db:migrate $ bundle exec rails server validate :due_at_is_in_the_past def due_at_is_in_the_past errors.add(:due_at, ‘is in the
t pygame from random import randrange MAX_STARS = 100 pygame.init() screen = pygame.display.set_mode((640, 480)) clock = pygame.time.Clock() stars = for i in r
ange(0, 479), randrange(1, 16)] stars.append(star) while True: clock.tick(30) for event in pygame.event.get(): if event.type == pygame.QUIT: exit(0) #!/usr/bin/perl $numstar
een = new Curses; noecho; curs_set(0); for ($i = 0; $i < $numstars ; $i++) { $star_x[$i] = rand(80); $star_y[$i] = rand(24); $star_s[$i] = rand(4) + 1; } while (1) { $screen->cl
$star_s[$i]; if ($star_x[$i] < 0) { $star_x[$i] = 80; } $screen->addch($star_y[$i], $star_x[$i], “.”); } $screen->refresh; usleep 50000; gem “therubyracer”, “~> 0.11.4” group :developmen
install bundler $ gem install rails --version=3.2.12 $ rbenv rehash $ rails new todolist --skip-test-unit respond_to do |format| if @task.update_attributes(params[:task]) format.html { r
tent } else format.html { render action: “edit” } format.json { render json: @task.errors, status: :unprocessable_entity } $ bundle exec rails generate migration add_priority_to_tasks priority:in
e exec rake db:migrate $ bundle exec rails server validate :due_at_is_in_the_past def due_at_is_in_the_past errors.add(:due_at, ‘is in the past!’) if due_at < Time.zone.no
t randrange MAX_STARS = 100 pygame.init() screen = pygame.display.set_mode((640, 480)) clock = pygame.time.Clock() stars = for i in range(MAX_STARS): star = [r
s.append(star) while True: clock.tick(30) for event in pygame.event.get(): if event.type == pygame.QUIT: exit(0) #!/usr/bin/perl $numstars = 100; use Time::HiRes qw(usl
or ($i = 0; $i < $numstars ; $i++) { $star_x[$i] = rand(80); $star_y[$i] = rand(24); $star_s[$i] = rand(4) + 1; } while (1) { $screen->clear; for ($i = 0; $i < $numstars ; $i++) { $star_x[$i] -= $star_s[$i]; if ($star_x[$i] < 0) { $star_x[$i]
= 80; } $screen->addch($star_y[$i], $star_x[$i], “.”); } $screen->refresh; usleep 50000; gem “therubyracer”, “~> 0.11.4” group :development, :test do gem “rspec-rails”, “~> 2.13.0” $ g
v rehash $ rails new todolist --skip-test-unit respond_to do |format| if @task.update_attributes(params[:task]) format.html { redirect_to @task, notice: ‘...’ } format.json { head :no_con
ails new todolist --skip-test-unit respond_to do |format| if @
ender json: @task.errors, status: :unprocessable_entity } $
e :due_at_is_in_the_past def due_at_is_in_the_past errors.
ygame.display.set_mode((640, 480)) clock = pygame.time.
ame.event.get(): if event.type == pygame.QUIT: exit(0) #!/usr/
and(80); $star_y[$i] = rand(24); $star_s[$i] = rand(4) + 1; } while (1) {
efresh; usleep 50000; gem “therubyracer”, “~> 0.11.4” group
2022
espond_to do |format| if @task.update_attributes(params[:task])
tus: :unprocessable_entity } $ bundle exec rails generate migration
t_is_in_the_past errors.add(:due_at, ‘is in the past!’) if due_at
.set_mode((640, 480)) clock = pygame.time.Clock() stars = for i in range(MAX_ Distros
ygame.QUIT: exit(0) #!/usr/bin/perl $numstars = 100; use
and(24); $star_s[$i] = rand(4) + 1; } while (1) { $screen->clear; for ($i = 0; $i <
herubyracer”, “~> 0.11.4” group :development, :test do gem
e_attributes(params[:task]) format.html { redirect_to @task,
ails generate migration add_priority_to_tasks priority:integer
Because if there was only one
t, ‘is in the past!’) if due_at < Time.zone.now #!/usr/bin/en python
s = for i in range(MAX_STARS): star = [randrange(0, 639), form of Linux, we’d be bored
ame.QUIT: exit(0) #!/usr/bin/perl $numstars = 100; use Time::HiRes qw(usleep); use Curses;
een->clear; for ($i = 0; $i < $numstars ; $i++) { $star_x[$i] -=
oup :development, :test do gem “rspec-rails”, “~> 2.13.0” $ gem
10 Ubuntu 21.04
ormat.html { redirect_to @task, notice: ‘...’ } format.json { head
Get the lowdown on the latest Ubuntu
tion add_priority_to_tasks priority:integer $ bundle exec rake db:migrate
release and discover its secrets.
ime.zone.now #!/usr/bin/en python import pygame from random
ARS): star = [randrange(0, 639), randrange(0, 479), randrange(1, 16)]
18 30 years of Linux
es qw(usleep); use Curses; $screen = new Curses; noecho; curs_
How a 21-year-old’s bedroom coding
s ; $i++) { $star_x[$i] -= $star_s[$i]; if ($star_x[$i] < 0) { $star_x[$i] project took over the world.
ails”, “~> 2.13.0” $ gem install bundler $ gem install rails --version=3.2.12
t.json { head :no_content } else format.html { render action: “edit” 24 Inside the Linux kernel
e db:migrate $ bundle exec rake db:migrate $ bundle exec rails How did Linux come to be? What makes it
om random import randrange MAX_STARS = 100 pygame. tick? We answer all this and more.
ange(1, 16)] stars.append(star) while True: clock.tick(30) for
32 Compile the kernel
ses; noecho; curs_set(0); for ($i = 0; $i < $numstars ; $i++) { $star_x[$i]
It’s the ultimate nerd credential, compile
s ; $i++) { $star_x[$i] -= $star_s[$i]; if ($star_x[$i] < 0) { $star_x[$i] = 80; } $screen->addch($star_y[$i], $star_x[$i], “.”); }
your own custom kernel, here’s how…
sion=3.2.12 $ rbenv rehash $ rails new todolist --skip-test-
ender action: “edit” } format.json { render json: @task.errors,
36 The ultimate home server
e $ bundle exec rails server validate :due_at_is_in_the_past
We guide you through building, configuring
e MAX_STARS = 100 pygame.init() screen = pygame.display.set_ and using an all-singing home server.
rue: clock.tick(30) for event in pygame.event.get(): if event.
umstars ; $i++) { $star_x[$i] = rand(80); $star_y[$i] = rand(24); 44 FireIP firewall
een->addch($star_y[$i], $star_x[$i], “.”); } $screen->refresh; usleep 50000; Build a wall, not of tacos, but of fire! Keep
ails new todolist --skip-test-unit respond_to do |format| if @ out hackers with a dedicated firewall.
ender json: @task.errors, status: :unprocessable_entity } $
48 Rescatux repair
e :due_at_is_in_the_past def due_at_is_in_the_past errors.
Explore one of the most famous rescue
ygame.display.set_mode((640, 480)) clock = pygame.time.
and repair systems powered by Linux.
ame.event.get(): if event.type == pygame.QUIT: exit(0) #!/usr/
and(80); $star_y[$i] = rand(24); $star_s[$i] = rand(4) + 1; } while (1) {
efresh; usleep 50000; gem “therubyracer”, “~> 0.11.4” group
espond_to do |format| if @task.update_attributes(params[:task])
tus: :unprocessable_entity } $ bundle exec rails generate migration
t_is_in_the_past errors.add(:due_at, ‘is in the past!’) if due_at
.set_mode((640, 480)) clock = pygame.time.Clock() stars = for i in range(MAX_
ygame.QUIT: exit(0) #!/usr/bin/perl $numstars = 100; use
and(24); $star_s[$i] = rand(4) + 1; } while (1) { $screen->clear; for ($i = 0; $i <
herubyracer”, “~> 0.11.4” group :development, :test do gem
e_attributes(params[:task]) format.html { redirect_to @task,
ails generate migration add_priority_to_tasks priority:integer
t, ‘is in the past!’) if due_at < Time.zone.now #!/usr/bin/en python
s = for i in range(MAX_STARS): star = [randrange(0, 639),
ame.QUIT: exit(0) #!/usr/bin/perl $numstars = 100; use Time::HiRes qw(usleep); use Curses;
een->clear; for ($i = 0; $i < $numstars ; $i++) { $star_x[$i] -=
oup :development, :test do gem “rspec-rails”, “~> 2.13.0” $ gem
ormat.html { redirect_to @task, notice: ‘...’ } format.json { head
tion add_priority_to_tasks priority:integer $ bundle exec rake db:migrate
ime.zone.now #!/usr/bin/en python import pygame from random
ARS): star = [randrange(0, 639), randrange(0, 479), randrange(1, 16)]
es qw(usleep); use Curses; $screen = new Curses; noecho; curs_
The Hacker’s Manual | 9
s ; $i++) { $star_x[$i] -= $star_s[$i]; if ($star_x[$i] < 0) { $star_x[$i]
ails”, “~> 2.13.0” $ gem install bundler $ gem install rails --version=3.2.12
t.json { head :no_content } else format.html { render action: “edit”
DDiissttrrooss
Get into
Ubuntu
The latest version of Ubuntu has landed, and
Nick Peers is on hand to show you how to
install it and find out what’s new.
U
buntu 21.04 – known to its mates as Whatever camp you fall into, this feature is for But what of Ubuntu 21.04 itself? We’ve also
Hirsute Hippo – is here and you. We’ll kick off by looking at how you can test- explored the new and improved features to give
demanding your immediate attention. drive the latest version of Ubuntu without you a full rundown of what to look for. The big
If you’re running Ubuntu 20.10 then you’ve committing to a full-blown install on your talking point is a new default windowing system
probably already had the update reminder, system. All you need is a blank DVD or spare called Wayland – we’ll reveal what this is, what it
while those running Ubuntu 20.04 LTS may be USB stick, which enables you to run a ‘live install’ means and whether it’s a change that will finally
getting itchy feet and wondering if now is the that doesn’t touch your existing system. Want to stick after one previous failed attempt. We’ll also
time to switch to the six-monthly release cycle, try the full version, but not quite ready to reveal what else to look for in an update that,
at least for the next year. commit? Discover how easy it is to install in while not revolutionary, has lots of useful tweaks
And what if you’re thinking of switching to VirtualBox. And when you’re ready to give it a and improvements to make your computing life
Ubuntu for the first time? Perhaps you’re fed up permanent home on your PC, we’ll reveal how to that bit easier. We’ll finish by asking the big
with broken Windows updates and constant install it alongside your existing operating question: do you need to upgrade, particularly if
privacy creep as it tries to trick you into system, making it possible to switch between you’re currently on the LTS (long-term support)
surrendering more of your personal data. the two as you see fit. channel? Read on to find out…
1100 || TThhee HHaacckkeerr’’ss MMaannuuaall