【TryHackMeウォークスルー】Linux Shells

 

Introduction to Linux Shells


普段、私たちがパソコンやスマートフォンを操作するとき、多くの場合は グラフィカルユーザーインターフェース(GUI) を使っています。アイコンやメニューをクリックすれば、簡単に作業が完了します。

しかし、実はGUIを使わなくても、コマンドライン(CLI)に命令を入力することで、ほとんどの操作を実行することができます。シェルはCLIで入力したコマンドを解釈して実行してくれる仕組みであり、これにより効率的で軽量な操作が可能になります。


レストランの例え

Linuxシステムを理解するために、レストランを例に考えてみましょう。

  • GUIを使う場合 → メニューを見て料理を注文し、店員さんが持ってきてくれる。

  • CLIを使う場合 → 自分で厨房(OS)に入って料理を作る。

このときシェルは、料理を作るときの「レシピ」を教えてくれる存在です。CLIを通して操作すると、より自由度が高く、細かいコントロールができるようになります。


映画のハッカーシーンとの関係

映画やドラマで、黒い画面にコマンドが次々と流れる「ハッキングシーン」を見たことがあるかもしれません。これは多くのLinuxユーザーが、GUIよりもシェルを使ったCLI操作を好んで行っているためです。

このルームでは、実際にLinuxシェルと対話する方法を学び、利用可能なシェルの種類を知り、最後には簡単なシェルスクリプトを書けるようになることを目指します。


学習目標

  • Linuxシェルとの対話方法を学ぶ

  • 基本的なシェルコマンドを使えるようになる

  • Linuxで利用できるシェルの種類を知る

  • 簡単なシェルスクリプトを書けるようになる

Answer the questions below

Who is the facilitator between the user and the OS?

Shell


How To Interact With a Shell?


実習用マシンの起動

このルーム用に、演習で利用する仮想マシン(VM)が用意されています。
まずは下にある 「Start Machine」ボタン を押して、仮想マシンを起動しましょう。マシンは画面分割(split view)で表示されます。

もしマシンが表示されない場合は、画面上部にある青い 「Show Split View」ボタン を押してください。GUI付きの環境が開きます。
また、AttackBoxや自分のVPN接続済み端末から、以下のSSH認証情報を使って接続することも可能です。

THM 接続情報

  • ユーザー名: user

  • パスワード: user@Tryhackme

  • IP: MACHINE_IP

仮想マシンが起動すると、以下のようにシェルのプロンプトが表示され、コマンドを入力できる状態になります。

LinuxShell
user@tryhackme:~$ 

多くのLinuxディストリビューションでは、デフォルトのシェルとして Bash (Bourne Again Shell) が使われています。ただし、実際に起動するシェルはディストリビューションによって異なる場合があります。

※次のタスクでは、Linuxで利用できるさまざまなシェルについて詳しく見ていきます。


基本的なLinuxコマンド

このルームの前提知識として紹介されている Linux Fundamentalsモジュール では、すでに基本的なコマンドを学んでいるはずです。ここでは、その中でも特によく使うコマンドを簡単におさらいしましょう。

1. 現在の作業ディレクトリを確認する (pwd)

シェルで作業する際は、「どのディレクトリで操作するか」が重要です。
ほとんどのLinuxディストリビューションでは、シェルを開くとデフォルトで自分のホームディレクトリに入ります。

現在の作業ディレクトリを確認するには、pwd(Print Working Directory)を実行します。

Check Current Working Directory
user@tryhackme:~$ pwd
/home/user

この例では、現在のディレクトリが /home/user であることが分かります。


2. ディレクトリを移動する (cd)

別のディレクトリに移動するには、cd(Change Directory)を使います。

Change Directory
user@tryhackme:~$ cd Desktop
user@tryhackme:~$/Desktop$

3. ディレクトリの中身を確認する (ls)

GUIではフォルダを開けば中身が見えますが、シェルでは ls コマンドを使います。

List Directory Contents
user@tryhackme:~$ ls
Desktop  Documents  Downloads  Music  Pictures  Public  Templates  Videos

4. ファイルの内容を表示する (cat)

テキストファイルの中身を確認するには cat を使います。

Displaying File Contents
user@tryhackme:~$ cat filename.txt
this is a sample file
this is the second line of the file

5. ファイル内の特定の文字列を検索する (grep)

Linuxユーザーに非常に人気があるコマンドが grep です。ファイルの中から特定の単語やパターンを探し出すことができます。

例えば、大きなテキストファイルの中から「THM」という単語を検索する場合は以下のようにします。

Searching a Word In File
user@tryhackme:~$ grep THM dictionary.txt
The flag is THM

出力結果には、その単語を含む行が表示されます。


Answer the questions below

What is the default shell in most Linux distributions?

bash

Which command utility is used to list down the contents of a directory?

ls

Which command utility can help you search for anything in a file?

grep


Types of Linux Shells


Linuxのシェルの種類

Windows OSに「コマンドプロンプト」や「PowerShell」があるように、Linuxにも複数のシェルが存在し、それぞれ異なる機能や特徴を持っています。


現在使用中のシェルを確認する

Linuxディストリビューションには複数のシェルがインストールされています。
自分が今どのシェルを使っているか確認するには、次のコマンドを実行します。

Current Shell
user@tryhackme:~$ echo $SHELL
/bin/bash

利用可能なシェルを確認する

Linuxにインストールされているシェルは /etc/shells ファイルに一覧として記録されています。
以下のコマンドで確認できます。

Available Shells
user@tryhackme:~$ cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/bash
/usr/bin/bash
/bin/rbash
/usr/bin/rbash
/bin/dash
/usr/bin/dash
/usr/bin/tmux
/usr/bin/screen
/bin/zsh
/usr/bin/zsh

シェルを切り替える

利用可能なシェルは、名前を入力することで切り替えることができます。

Switch Shell
user@tryhackme:~$ zsh
tryhackme% 

デフォルトのシェルを恒久的に変更したい場合は、以下のコマンドを使用します。

chsh -s /usr/bin/zsh

これで次回以降、端末を開いたときに zsh が標準のシェルとして起動します。


主なLinuxシェルと特徴

Linuxには多くの種類のシェルがありますが、ここでは代表的な3つを紹介します。


1. Bourne Again Shell (Bash)

ほとんどのLinuxディストリビューションでデフォルトとして使われているシェルです。
古い shkshcsh などの機能を引き継ぎつつ改良され、多くの機能を備えています。

主な特徴

  • スクリプトの互換性が高く、豊富なドキュメントが存在する

  • タブ補完機能(Tabキーでコマンドを補完)

  • コマンド履歴機能(↑↓キーで過去のコマンドを呼び出し可能)

  • history コマンドで入力履歴を一覧表示できる


2. Friendly Interactive Shell (Fish)

多くのディストリビューションでは標準搭載されていませんが、名前の通りユーザーフレンドリーなシェルです。

主な特徴

  • シンプルな構文で初心者に分かりやすい

  • コマンドの自動スペル修正機能

  • カスタムテーマでプロンプトを自由に変更可能

  • 構文ハイライト機能により、コマンドの役割ごとに色分けされ、エラーも見つけやすい

  • Bashと同様にスクリプト、タブ補完、履歴機能をサポート


3. Z Shell (Zsh)

標準ではインストールされていない場合が多いですが、モダンなシェルとして人気があります。

主な特徴

  • 高度なタブ補完とスクリプト機能

  • Fishと同様のスペル修正機能

  • 豊富なカスタマイズ性(例:oh-my-zshフレームワーク)

  • コマンド履歴や補完など多彩な機能


Bash / Fish / Zsh の比較表

機能BashFishZsh
正式名称Bourne Again ShellFriendly Interactive ShellZ Shell
スクリプト機能高い互換性、豊富なドキュメント機能は制限ありBash機能に加え追加要素
タブ補完基本的な補完過去コマンドに基づく高度な補完プラグインで大幅拡張可能
カスタマイズ基本的なカスタマイズのみインタラクティブツールで簡単に変更可能oh-my-zshなどで高度に可能
ユーザーフレンドリー標準的で慣れやすい最も初心者向けカスタマイズ次第で使いやすさ向上
構文ハイライトなし標準で搭載プラグイン導入で利用可能

まとめ

どのシェルを選ぶかは利用目的や好みによって異なります。
今回紹介した Bash / Fish / Zsh は、Linuxユーザーに特に人気の高いシェルです。
それぞれの特徴を理解し、自分の作業スタイルに合ったものを選びましょう。


Answer the questions below

Which shell comes with syntax highlighting as an out-of-the-box feature?

Fish

Which shell does not have auto spell correction?

Bash

Which command displays all the previously executed commands of the current session?

history


Shell Scripting and Components


シェルスクリプト入門

シェルスクリプトとは?

シェルスクリプトとは、複数のコマンドをまとめて記述したファイル のことです。
例えば、同じ処理を繰り返し行う場合、毎回コマンドを1つずつ入力すると時間がかかります。そこで、必要なコマンドをスクリプトとして保存しておけば、スクリプトを1回実行するだけでまとめて処理を行えます。

前のタスクで紹介したすべてのシェルにはスクリプト機能があります。スクリプトを使うことで、タスクの自動化が可能になります。


スクリプトの作成手順

まずはターミナルを開き、シェルを選択します。ここでは最も一般的な bash を使います。

通常のコマンドとは違い、スクリプトは テキストエディタでファイルを作成 します。拡張子は .sh を付けるのが慣例です。

Create Script File
user@tryhackme:~$ nano first_script.sh

シバン (Shebang)

すべてのスクリプトは シバン (shebang) から始める必要があります。
シバンは #! で始まり、続けてスクリプトを実行するインタプリタを指定します。

例:bashを使う場合

first_script.sh
#!/bin/bash

変数と入力

次の例は、ユーザーに名前を聞いて挨拶する簡単なスクリプトです。

# Defining the Interpreter 
#!/bin/bash
echo "Hey, what’s your name?"
read name
echo "Welcome, $name"
  • read name でユーザー入力を受け取り、変数 name に格納

  • echo で変数を展開し、メッセージを表示

保存は CTRL+X → Y → ENTER で行います。


実行権限の付与と実行

作成したスクリプトには、実行権限を与える必要があります。

Execution Permission to Script
user@tryhackme:~$ chmod +x first_script.sh

実行は ./ を付けて行います。

Script Execution
user@ubuntu:~$ ./first_script.sh
Hey, What's your name?
John
Welcome, John

./ を付けるのは、カレントディレクトリから実行することを明示するためです。


ループ (Loops)

ループとは「繰り返し処理」のことです。例えば、1から10までの数字を順に表示するスクリプトは以下のようになります。

# Defining the Interpreter 
#!/bin/bash
for i in {1..10};
do
echo $i
done
  • for i in {1..10} → 変数 i に1〜10を順に代入

  • do ... done → ループ内で実行する処理を囲む

実行すると以下のように出力されます。

Script Execution
user@tryhackme:~$ ./loop_script.sh
1
2
3

条件分岐 (Conditional Statements)

条件分岐は「特定の条件を満たす場合のみ処理を実行」する仕組みです。
以下は、特定のユーザー名を入力したときだけ秘密を表示する例です。

# Defining the Interpreter 
#!/bin/bash
echo "Please enter your name first:"
read name
if [ "$name" = "Stewart" ]; then
        echo "Welcome Stewart! Here is the secret: THM_Script"
else
        echo "Sorry! You are not authorized to access the secret."
fi

実行例(条件一致)

conditional_script.sh
user@tryhackme:~$ ./conditional_script.sh
Please enter your name first:
Stewart
Welcome, Stewart! Here is the secret: THM_Script

実行例(条件不一致)

conditional_script.sh
user@tryhackme:~$ ./conditional_script.sh
Please enter your name first:
Alex
Sorry! You are not authorized to access the secret.

コメント (Comments)

コードが長くなると分かりにくくなるため、コメント を入れて整理します。
コメントは # で始まり、その行は実行されません。

例:条件分岐スクリプトにコメントを追加

# Defining the Interpreter
#!/bin/bash

# Asking the user to enter a value.
echo "Please enter your name first:"

# Storing the user input value in a variable.
read name

# Checking if the name the user entered is equal to our required name.
if [ "$name" = "Stewart" ]; then

# If it equals the required name, the following line will be displayed.
echo "Welcome Stewart! Here is the secret: THM_Script"

# Defining the sentence to be displayed if the condition fails.
else
        echo "Sorry! You are not authorized to access the secret."
fi

コメントを入れることで、後から見返すときや他人に共有するときに理解しやすくなります。


まとめ

  • 変数 を使って値を保存・利用できる

  • ループ で繰り返し処理を自動化できる

  • 条件分岐 で状況に応じた処理を実行できる

  • コメント を使えば、スクリプトの可読性が向上する

シェルスクリプトを使えば、Linuxでの作業を効率的に自動化できます。


Answer the questions below

What is the shebang used in a Bash script?

#!/bin/bash

Which command gives executable permissions to a script?

chmod +x

Which scripting functionality helps us configure iterative tasks?

loops


The Locker Script


総合演習:ロッカースクリプトの作成

前回のタスクでは、変数ループ条件分岐 を学びました。
ここでは、それらを組み合わせて一つの実用的なシェルスクリプトを作成してみましょう。


要件

銀行のロッカーを利用するユーザーを想定します。
ロッカーにアクセスするには本人確認が必要です。
スクリプトを実行すると、以下の3つの入力を求めます。

  • ユーザー名

  • 会社名

  • PINコード

入力が以下と一致した場合のみ、認証を成功としロッカーを開けられるようにします。

  • Username: John

  • Company name: Tryhackme

  • PIN: 7385


スクリプト例

# Defining the Interpreter 
#!/bin/bash 

# Defining the variables
username=""
companyname=""
pin=""

# Defining the loop
for i in {1..3}; do
# Defining the conditional statements
        if [ "$i" -eq 1 ]; then
                echo "Enter your Username:"
                read username
        elif [ "$i" -eq 2 ]; then
                echo "Enter your Company name:"
                read companyname
        else
                echo "Enter your PIN:"
                read pin
        fi
done

# Checking if the user entered the correct details
if [ "$username" = "John" ] && [ "$companyname" = "Tryhackme" ] && [ "$pin" = "7385" ]; then
        echo "Authentication Successful. You can now access your locker, John."
else
        echo "Authentication Denied!!"
fi

実行例

認証失敗のケース:

Executing the Locker Script
user@tryhackme:~$ ./locker_script.sh
Enter your Username:
John
Enter your Company name:
Tryhackme
Enter your PIN:
1349
Authentication Denied!!

正しい情報を入力した場合は、次のように認証が成功します。

Executing the Locker Script
user@tryhackme:~$ ./locker_script.sh
Enter your Username:
John
Enter your Company name:
Tryhackme
Enter your PIN:
7385
Authentication Successful. You can now access your locker, John.


👉 このスクリプトは、変数の利用(入力値の保持)、ループ処理(複数回の入力受付)、条件分岐(入力内容の検証)を組み合わせた実践的な例です。


Answer the questions below

What would be the correct PIN to authenticate in the locker script?

7385


Practical Exercise


付属Ubuntuマシン上のスクリプトについて

このルームに付属のUbuntuマシンでは、デフォルトユーザーのホームディレクトリ/home/user)にスクリプトを配置しています。
このスクリプトは、指定ディレクトリ内の .log 拡張子のファイルを対象に、特定のキーワードを検索します。

※実行前に、スクリプト内にいくつか修正が必要です。


権限について(root推奨)

Task #2 の手順でマシンを起動すると、通常ユーザー権限でシェルに入れます。
ただし、指定ディレクトリ配下のすべてのファイルを確実に検索するため、rootユーザーになることを推奨します。

以下のコマンドでrootへ昇格し、パスワードを入力してください(認証情報は Task 2 を参照)。

Become Root User
user@tryhackme:~$ sudo su
[sudo] password for user: 
root@tryhackme:/home/user#

スクリプト修正のヒント(必読)

  • Flagthm-flag01-script

  • 検索対象ディレクトリ/var/log

  • ヒント:スクリプト内に空の二重引用符"")があります。

    • その中を正しい値で埋めてください。

    • 引用符の内側にスペースは入れないでください(例:"thm-flag01-script""/var/log")。

例:grep -R "thm-flag01-script" /var/log --include="*.log" のような形に近づけるイメージです(実際のスクリプトの構成に合わせて置き換えてください)。


推奨手順(サマリ)

  1. /home/user にあるスクリプトをテキストエディタで開く

  2. "" の中を FlagDirectory の値で埋める

  3. 必要なら実行権限を付与:chmod +x script_name.sh

  4. root になって実行:

    user@tryhackme:~$ sudo su root@tryhackme:/home/user# ./script_name.sh
  5. /var/log 配下の .log ファイルから thm-flag01-script を検索できればOK


Answer the questions below

Which file has the keyword?

authentication.log

Where is the cat sleeping?

under the table


Conclusion

このルームでは、シェルの重要性を学び、Linuxシェルの世界に触れながら主要な種類を探索しました。

また、シェルスクリプトの役割とタスク自動化への活用について理解を深めました。

最後には、いくつかの実用的なシェルスクリプトを作成し、複数のディレクトリから「謎のフラグ」を探し出す実践的なラボにも取り組みました。


出典:Linux Shells