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
仮想マシンが起動すると、以下のようにシェルのプロンプトが表示され、コマンドを入力できる状態になります。
user@tryhackme:~$
多くのLinuxディストリビューションでは、デフォルトのシェルとして Bash (Bourne Again Shell) が使われています。ただし、実際に起動するシェルはディストリビューションによって異なる場合があります。
※次のタスクでは、Linuxで利用できるさまざまなシェルについて詳しく見ていきます。
基本的なLinuxコマンド
このルームの前提知識として紹介されている Linux Fundamentalsモジュール では、すでに基本的なコマンドを学んでいるはずです。ここでは、その中でも特によく使うコマンドを簡単におさらいしましょう。
1. 現在の作業ディレクトリを確認する (pwd
)
シェルで作業する際は、「どのディレクトリで操作するか」が重要です。
ほとんどのLinuxディストリビューションでは、シェルを開くとデフォルトで自分のホームディレクトリに入ります。
現在の作業ディレクトリを確認するには、pwd
(Print Working Directory)を実行します。
user@tryhackme:~$ pwd
/home/user
この例では、現在のディレクトリが /home/user
であることが分かります。
2. ディレクトリを移動する (cd
)
別のディレクトリに移動するには、cd
(Change Directory)を使います。
user@tryhackme:~$ cd Desktop
user@tryhackme:~$/Desktop$
3. ディレクトリの中身を確認する (ls
)
GUIではフォルダを開けば中身が見えますが、シェルでは ls
コマンドを使います。
user@tryhackme:~$ ls
Desktop Documents Downloads Music Pictures Public Templates Videos
4. ファイルの内容を表示する (cat
)
テキストファイルの中身を確認するには cat
を使います。
user@tryhackme:~$ cat filename.txt
this is a sample file
this is the second line of the file
5. ファイル内の特定の文字列を検索する (grep
)
Linuxユーザーに非常に人気があるコマンドが grep
です。ファイルの中から特定の単語やパターンを探し出すことができます。
例えば、大きなテキストファイルの中から「THM」という単語を検索する場合は以下のようにします。
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ディストリビューションには複数のシェルがインストールされています。
自分が今どのシェルを使っているか確認するには、次のコマンドを実行します。
user@tryhackme:~$ echo $SHELL
/bin/bash
利用可能なシェルを確認する
Linuxにインストールされているシェルは /etc/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
シェルを切り替える
利用可能なシェルは、名前を入力することで切り替えることができます。
user@tryhackme:~$ zsh
tryhackme%
デフォルトのシェルを恒久的に変更したい場合は、以下のコマンドを使用します。
これで次回以降、端末を開いたときに zsh
が標準のシェルとして起動します。
主なLinuxシェルと特徴
Linuxには多くの種類のシェルがありますが、ここでは代表的な3つを紹介します。
1. Bourne Again Shell (Bash)
ほとんどのLinuxディストリビューションでデフォルトとして使われているシェルです。
古い sh
、ksh
、csh
などの機能を引き継ぎつつ改良され、多くの機能を備えています。
主な特徴
-
スクリプトの互換性が高く、豊富なドキュメントが存在する
-
タブ補完機能(Tabキーでコマンドを補完)
-
コマンド履歴機能(↑↓キーで過去のコマンドを呼び出し可能)
-
history
コマンドで入力履歴を一覧表示できる
2. Friendly Interactive Shell (Fish)
多くのディストリビューションでは標準搭載されていませんが、名前の通りユーザーフレンドリーなシェルです。
主な特徴
-
シンプルな構文で初心者に分かりやすい
-
コマンドの自動スペル修正機能
-
カスタムテーマでプロンプトを自由に変更可能
-
構文ハイライト機能により、コマンドの役割ごとに色分けされ、エラーも見つけやすい
-
Bashと同様にスクリプト、タブ補完、履歴機能をサポート
3. Z Shell (Zsh)
標準ではインストールされていない場合が多いですが、モダンなシェルとして人気があります。
主な特徴
-
高度なタブ補完とスクリプト機能
-
Fishと同様のスペル修正機能
-
豊富なカスタマイズ性(例:oh-my-zshフレームワーク)
-
コマンド履歴や補完など多彩な機能
Bash / Fish / Zsh の比較表
機能 | Bash | Fish | Zsh |
---|---|---|---|
正式名称 | Bourne Again Shell | Friendly Interactive Shell | Z 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 を付けるのが慣例です。
user@tryhackme:~$ nano first_script.sh
シバン (Shebang)
すべてのスクリプトは シバン (shebang) から始める必要があります。
シバンは #!
で始まり、続けてスクリプトを実行するインタプリタを指定します。
例:bashを使う場合
#!/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 で行います。
実行権限の付与と実行
作成したスクリプトには、実行権限を与える必要があります。
user@tryhackme:~$ chmod +x first_script.sh
実行は ./
を付けて行います。
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
→ ループ内で実行する処理を囲む
実行すると以下のように出力されます。
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
実行例(条件一致)
user@tryhackme:~$ ./conditional_script.sh
Please enter your name first:
Stewart
Welcome, Stewart! Here is the secret: THM_Script
実行例(条件不一致)
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
実行例
認証失敗のケース:
user@tryhackme:~$ ./locker_script.sh Enter your Username: John Enter your Company name: Tryhackme Enter your PIN: 1349 Authentication Denied!!
正しい情報を入力した場合は、次のように認証が成功します。
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 を参照)。
user@tryhackme:~$ sudo su
[sudo] password for user:
root@tryhackme:/home/user#
スクリプト修正のヒント(必読)
-
Flag:
thm-flag01-script
-
検索対象ディレクトリ:
/var/log
-
ヒント:スクリプト内に空の二重引用符(
""
)があります。-
その中を正しい値で埋めてください。
-
引用符の内側にスペースは入れないでください(例:
"thm-flag01-script"
、"/var/log"
)。
-
例:
grep -R "thm-flag01-script" /var/log --include="*.log"
のような形に近づけるイメージです(実際のスクリプトの構成に合わせて置き換えてください)。
推奨手順(サマリ)
-
/home/user
にあるスクリプトをテキストエディタで開く -
""
の中を Flag と Directory の値で埋める -
必要なら実行権限を付与:
chmod +x script_name.sh
-
root になって実行:
-
/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