📖 Scenario: You are a network technician who needs to check which ports are open on a local server to ensure the services are running correctly.
🎯 Goal: Build a simple Bash script that scans a range of ports on a given IP address and reports which ports are open.
📋 What You'll Learn
Create a variable holding the target IP address
Create a variable holding the start and end port numbers
Use a loop to scan each port in the range
Check if the port is open using Bash built-in tools
Print the list of open ports
💡 Why This Matters
🌍 Real World
Network administrators often need to check which ports are open on servers to troubleshoot connectivity or security issues.
💼 Career
Basic port scanning skills help in network monitoring, security auditing, and system administration roles.
Progress0 / 4 steps
1
Set the target IP address
Create a variable called target_ip and set it to the string "127.0.0.1".
Bash Scripting
Hint
Use variable_name="value" syntax to create a variable in Bash.
2
Set the port range to scan
Create two variables called start_port and end_port and set them to 75 and 85 respectively.
Bash Scripting
Hint
Assign numbers to variables without quotes in Bash.
3
Scan ports in the range
Use a for loop with variable port to iterate from start_port to end_port. Inside the loop, use timeout 1 bash -c " to try connecting to $target_ip on $port with /dev/tcp. If the connection succeeds, add the port number to a variable called open_ports separated by spaces.
Bash Scripting
Hint
Use seq to generate numbers and timeout 1 bash -c "echo > /dev/tcp/$target_ip/$port" to test ports.
4
Print the open ports
Print the text "Open ports:" followed by the value of the variable open_ports.
Bash Scripting
Hint
Use printf or echo to display the open ports.
Practice
(1/5)
1. What is the main purpose of port scanning in network security?
easy
A. To install software remotely
B. To delete files on a remote server
C. To speed up internet connection
D. To find open ports on a computer
Solution
Step 1: Understand port scanning basics
Port scanning is used to check which network ports on a computer are open and accepting connections.
Step 2: Identify the correct purpose
Among the options, only finding open ports matches the purpose of port scanning.
Final Answer:
To find open ports on a computer -> Option D
Quick Check:
Port scanning = find open ports [OK]
Hint: Port scanning checks open ports, not files or speed [OK]
Common Mistakes:
Confusing port scanning with file operations
Thinking it improves internet speed
Assuming it installs software
2. Which of the following bash commands correctly scans if port 80 is open on host 192.168.1.1?
easy
A. nc -zv 192.168.1.1 80
B. nc -xv 192.168.1.1 80
C. nc -z 192.168.1.1 -p 80
D. nc -v 192.168.1.1
Solution
Step 1: Recall correct netcat syntax for port scanning
The option '-z' tells nc to scan without sending data, and '-v' enables verbose output. The host and port follow these flags.
Step 2: Check each option
Only nc -zv 192.168.1.1 80 uses the correct flags '-z' for scanning and '-v' for verbose, followed by host and port. Other options either lack necessary flags, use incorrect flags like -xv or misuse -p for source port, or omit the port specification.
Final Answer:
nc -zv 192.168.1.1 80 -> Option A
Quick Check:
Correct nc flags = -zv [OK]
Hint: Use nc -zv host port to scan a port [OK]
Common Mistakes:
Using wrong flags like -xv
Misplacing port with -p flag
Omitting port number
3. What will be the output of this bash snippet scanning ports 22 and 80 on localhost?
for port in 22 80; do
nc -zv localhost $port
done
medium
A. It will produce a syntax error
B. It will show if ports 22 and 80 are open or closed on localhost
C. It will scan ports 22 and 80 on a remote host
D. It will scan all ports from 22 to 80
Solution
Step 1: Analyze the for loop and command
The loop iterates over ports 22 and 80, running 'nc -zv localhost $port' for each port.
Step 2: Understand the command effect
Netcat checks if each specified port on localhost is open, printing the result.
Final Answer:
It will show if ports 22 and 80 are open or closed on localhost -> Option B
Quick Check:
Loop scans specified ports on localhost [OK]
Hint: Loop scans listed ports on localhost, not a range [OK]
Common Mistakes:
Thinking it scans a range of ports
Assuming remote host scanning
Expecting syntax errors
4. Identify the error in this bash script intended to scan ports 20 to 25 on 127.0.0.1:
for port in {20..25} do
nc -zv 127.0.0.1 $port
done
medium
A. The loop syntax is incorrect; it should use parentheses
B. The loop variable $port is not referenced correctly
C. The script is missing a semicolon after the for statement
D. The loop block is missing a 'do' keyword
Solution
Step 1: Check for correct bash for-loop syntax
Bash requires a semicolon or newline after the for statement before 'do'. Here, 'for port in {20..25}' is not followed by a semicolon or newline before 'do'.
Step 2: Verify other syntax elements
The loop variable and block are correct, and 'do' is present. The missing semicolon causes a syntax error.
Final Answer:
The script is missing a semicolon after the for statement -> Option C
Quick Check:
Missing semicolon after for statement causes error [OK]
Hint: Add semicolon or newline after for statement before do [OK]
Common Mistakes:
Omitting semicolon after for line
Misplacing 'do' keyword
Incorrect variable usage
5. You want to scan all ports from 80 to 85 on host 10.0.0.5 and save only open ports to a file named open_ports.txt. Which bash script snippet achieves this?
hard
A. for port in {80..85}; do nc -zv 10.0.0.5 $port 2>&1 | grep 'succeeded' >> open_ports.txt; done
B. for port in 80 81 82 83 84 85; do nc -zv 10.0.0.5 $port > open_ports.txt; done
C. nc -zv 10.0.0.5 80-85 > open_ports.txt
D. for port in {80..85}; do nc -zv 10.0.0.5 $port | grep 'failed' >> open_ports.txt; done
Solution
Step 1: Understand the scanning and filtering requirements
The script must scan ports 80 to 85, detect open ports, and save only those results to a file.
Step 2: Analyze each option
for port in {80..85}; do nc -zv 10.0.0.5 $port 2>&1 | grep 'succeeded' >> open_ports.txt; done loops over ports 80 to 85, runs nc with verbose and zero-I/O flags, redirects stderr to stdout, filters lines containing 'succeeded' (indicating open ports), and appends to open_ports.txt. for port in 80 81 82 83 84 85; do nc -zv 10.0.0.5 $port > open_ports.txt; done overwrites the file each time and does not filter open ports. nc -zv 10.0.0.5 80-85 > open_ports.txt uses invalid port range syntax. for port in {80..85}; do nc -zv 10.0.0.5 $port | grep 'failed' >> open_ports.txt; done filters 'failed' ports, opposite of requirement.
Final Answer:
for port in {80..85}; do nc -zv 10.0.0.5 $port 2>&1 | grep 'succeeded' >> open_ports.txt; done -> Option A