Red Hat Certified System Administrator (RHCSA) #2 必須ツール: bash、vi、redirection、find/grep、archive、ssh

読了 13分

#1 試験紹介 で EX200 の形式と受験環境をつかんだなら、ここからすべての作業の土台になるシェルの基本に入ります。RHCSA は空のシェルの前で制限時間内に作業を終える実技試験で、その速度を分けるのがまさにこの記事で扱うツールです。ユーザー管理も LVM の拡張も SELinux の修正も、結局はシェルでコマンドを打って結果を確認する作業なので、redirection と find、grep、vi が手に馴染んでいてこそ残りの領域が速くなります。

特に試験会場にはインターネットがありません。Stack Overflow もブログも見られないので、find のオプション 1 つを思い出せなければ man page を素早く探るしかありません。この記事ではよく使うツールを手に覚えさせると同時に、詰まったときに man page で答えを見つける習慣まで一緒につかみます。

入出力 redirection とパイプ #

シェルのすべてのコマンドには、標準入力 (stdin、0 番)·標準出力 (stdout、1 番)·標準エラー (stderr、2 番) という 3 つの通路があります。redirection はこの通路をファイルや別のコマンドへ回す機能で、RHCSA ではコマンドの結果をファイルに保存したりエラーだけを別に振り分けたりするときに絶えず使います。

# 標準出力をファイルへ (上書き)
ls -l /etc > /tmp/etc-list.txt

# 標準出力をファイルに追記 (append)
date >> /tmp/etc-list.txt

# 標準エラーだけをファイルへ (2 番)
find / -name "*.conf" 2> /tmp/errors.txt

# 標準出力と標準エラーをまとめて 1 つのファイルへ
find / -name "*.conf" &> /tmp/all.txt
find / -name "*.conf" > /tmp/all.txt 2>&1

# エラーを捨てる (権限のないディレクトリの警告を無視)
find / -name "passwd" 2> /dev/null

> は既存の内容を上書きし、>> は末尾に追記します。2 つを取り違えると作業ファイルを丸ごと飛ばしかねないので、累積する必要があるときは必ず >> を使います。標準エラーを /dev/null へ送れば、権限のないディレクトリから出る警告を画面から片付けられます。

パイプ (|) は、あるコマンドの出力を次のコマンドの入力へ渡します。複数のツールをつないで 1 行で作業を終えることがシェルの核心です。

# ログインシェルが bash のユーザーだけを数える
grep "/bin/bash$" /etc/passwd | wc -l

# プロセスをメモリ使用量順に上位 5 個
ps aux | sort -k4 -rn | head -5

tee は出力をファイルに保存しながら同時に画面にも見せます。コマンドの結果を確認しながら記録まで残したいときに便利です。

# 画面に見せながらファイルにも保存
ls -l /var/log | tee /tmp/log-list.txt

# sudo 権限が必要なファイルへ書き込む (リダイレクトはシェルの権限なので sudo が効かない)
echo "net.ipv4.ip_forward = 1" | sudo tee /etc/sysctl.d/99-fwd.conf

最後の例は RHCSA でよく詰まる部分です。sudo echo ... > /etc/... の形は redirection 自体を一般権限のシェルが処理するので権限エラーになります。このとき sudo tee を使えばファイル書き込みの段階が root で実行されて解決します。

find: 条件に合うファイルを見つける #

RHCSA の定番の型は「特定の条件を満たすファイルを見つけてどこかへコピーするか権限を変えよ」です。find はこの作業の中心ツールなので、オプションを手に覚えておきます。

# 名前で見つける (大文字小文字を区別 / 無視)
find /etc -name "*.conf"
find /etc -iname "*.CONF"

# 種類で見つける (f=ファイル、d=ディレクトリ、l=シンボリックリンク)
find /var -type d -name "log"

# サイズで見つける (+10M=10MB 超、-1k=1KB 未満)
find /var -type f -size +10M

# 修正時刻で見つける (-mtime -7=直近 7 日以内、+30=30 日より前)
find /home -type f -mtime -7

# 権限で見つける (完全一致)
find / -type f -perm 4000 2> /dev/null

# 所有者 / グループで見つける
find /home -user alice
find /home -group developers

-size の単位は c (バイト)·k·M·G で、前に + を付けると超過、- を付けると未満、符号がなければちょうどそのサイズを意味します。-mtime の数字も同じ方式で、-n は直近 n 日以内、+n は n 日より前を指します。

権限の検索は RHCSA で特によく出ます。SUID ファイルを探せという問題は -perm 4000 ではなく -perm -4000 を使わないと正確になりません。前に - を付けると「該当のビットを含む」すべてのファイルが引っかかるからです。

# SUID ビットが設定されたすべてのファイル (包含検索)
find / -type f -perm -4000 2> /dev/null

# グループとその他に書き込み権限があるファイル
find /var -type f -perm -022

見つけたファイルにそのまま作業をかける -exec が最も強力です。{} は見つかった各ファイルへ置換され、\; でコマンドを締めくくります。

# 見つけた .conf ファイルをすべて /tmp/backup へコピー
find /etc -name "*.conf" -exec cp {} /tmp/backup/ \;

# 特定のユーザー所有のファイルの権限を一括変更
find /shared -user bob -exec chmod 640 {} \;

# 実行前に確認を取りながら削除 (-ok)
find /tmp -name "*.tmp" -ok rm {} \;

「alice が所有するファイルをすべて見つけて /root/alice-files へコピーせよ」のような問題は find /home -user alice -exec cp {} /root/alice-files/ \; の 1 行で終わります。このパターンを手に覚えておけば、似た問題を素早く解けます。

grep: テキストの中から見つける #

grep はファイルや出力からパターンに合う行を選び出します。ログを探り設定ファイルを確認する、ほとんどすべての作業の出発点です。

# 基本検索
grep "root" /etc/passwd

# 大文字小文字を無視 (-i)
grep -i "error" /var/log/messages

# ディレクトリ全体を再帰検索 (-r)
grep -r "PermitRootLogin" /etc/ssh/

# 一致しない行だけ (-v)。コメントと空行の除去によく使う
grep -v "^#" /etc/ssh/sshd_config | grep -v "^$"

# 行番号を表示 (-n)
grep -n "listen" /etc/httpd/conf/httpd.conf

マッチした行の前後の文脈を一緒に見るには -A (after)·-B (before)·-C (context) を使います。ログでエラーの前後を調べるときに便利です。

# マッチ行とその後ろ 3 行
grep -A 3 "Failed password" /var/log/secure

# マッチ行とその前 2 行
grep -B 2 "error" /var/log/messages

# マッチ行と前後それぞれ 5 行
grep -C 5 "denied" /var/log/audit/audit.log

拡張正規表現は -E でオンにします。正規表現の基礎だけ知っていても検索がずっと正確になります。^ は行の始まり、$ は行の終わり、. は任意の 1 文字、* は直前の文字の 0 回以上の繰り返し、[abc] は文字集合を意味します。

# bash で終わる行 (行末アンカー)
grep "bash$" /etc/passwd

# 空行 (始まりと終わりの間に何もない)
grep -c "^$" /etc/ssh/sshd_config

# 拡張正規表現: error または warn
grep -E "error|warn" /var/log/messages

# 数字が 1 つ以上連続した行
grep -E "[0-9]+" /etc/hosts

テキスト処理ツール #

ファイルの内容を見て整える系のツールも試験作業のあちこちに登場します。less は長いファイルをページ単位でめくって見て、中で /パターン で検索し q で抜けます。man page を読む画面も less なので操作が同じです。

# ファイルをページ単位で見る (/パターン で検索、n で次、q で終了)
less /var/log/messages

# 前 / 後ろの一部だけ見る
head -20 /etc/passwd
tail -20 /var/log/messages

# ログをリアルタイムで追う (-f)
tail -f /var/log/messages

sort は並べ替え、wc は行·単語·バイト数の数え上げ、cut は列の切り出しに使います。

# 辞書順 / 数値順 / 逆順の並べ替え
sort /etc/passwd
sort -t: -k3 -n /etc/passwd   # : 区切り、3 番目のフィールドを数値で

# 行数 / 単語数を数える
wc -l /etc/passwd
grep -c "" /etc/passwd

# : で区切られた 1 番フィールド (ユーザー名) だけを抜く
cut -d: -f1 /etc/passwd

# 固定幅で切る (1 番〜8 番の文字)
cut -c1-8 /etc/passwd

sedawk は 1 行の変換に強力です。RHCSA では vi で直接直すほうが安全なことが多いですが、一括置換や特定フィールドの抽出には 1 行コマンドが速いです。

# sed: すべての行で oldname を newname に置換 (出力のみ)
sed 's/oldname/newname/g' /tmp/file.txt

# sed: ファイルを直接修正 (-i)、原本は .bak でバックアップ
sed -i.bak 's/PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config

# awk: 空白区切りの 3 番目の列だけ出力
awk '{print $3}' /tmp/data.txt

# awk: : 区切り、UID が 1000 以上のユーザー名を出力
awk -F: '$3 >= 1000 {print $1}' /etc/passwd

vi/vim: 試験で必須のエディタ #

RHCSA では設定ファイルを直接直す作業が果てしなく出てきて、その編集はほぼ vi で行います。nano が常にインストールされている保証はないので、vi の基本操作は必ず手に覚えておく必要があります。

vi はモードベースのエディタです。3 つのモードの切り替えを理解することが出発点です。

モード役割進入
通常モード (Normal)移動·削除·コピー·貼り付けEsc
入力モード (Insert)文字入力iao
コマンドラインモード (Command-line)保存·終了·検索置換:

編集を始めて保存してから抜ける流れは次のとおりです。

vi /etc/ssh/sshd_config   # ファイルを開く (通常モードで開始)
i                          # 入力モード進入 (カーソル位置から入力)
... 内容を修正 ...
Esc                        # 通常モードへ復帰
:w                         # 保存
:q                         # 終了
:wq  または  ZZ            # 保存して終了
:q!                        # 保存せずに強制終了

通常モードのよく使う操作も覚えておきます。dd は 1 行削除、yy は 1 行コピー、p は貼り付け、u は取り消し、gg はファイルの先頭、G は末尾、数字G は該当の行への移動です。

検索と置換は試験で時間を大きく節約してくれます。通常モードで /パターン で検索し n で次の一致へ進みます。コマンドラインモードの置換は次の形式を使います。

:%s/old/new/g     # ファイル全体で old を new にすべて置換
:%s/old/new/gc    # 置換するたびに確認を取る
:10,20s/old/new/  # 10〜20 番の行だけで置換
:set number       # 行番号を表示

「sshd_config で PermitRootLogin を no に変えよ」のような問題は、vi で開いて /PermitRootLogin で見つけて直接直すか、:%s/PermitRootLogin yes/PermitRootLogin no/ で一度に変えられます。

archive: tar、gzip、bzip2 #

ファイルをまとめて圧縮する作業も出題領域に入っています。tar は複数のファイルを 1 つにまとめ、オプションに応じて圧縮まで一緒に処理します。オプション文字の意味を知れば組み合わせが簡単です。c は生成、x は展開、t は一覧表示、f はファイル名の指定、v は進行表示、z は gzip、j は bzip2、J は xz 圧縮です。

# ディレクトリを gzip 圧縮アーカイブにまとめる
tar czf /tmp/etc-backup.tar.gz /etc

# bzip2 圧縮でまとめる
tar cjf /tmp/etc-backup.tar.bz2 /etc

# アーカイブを展開する (gzip)
tar xzf /tmp/etc-backup.tar.gz -C /tmp/restore/

# 展開せずに内容の一覧だけ確認
tar tzf /tmp/etc-backup.tar.gz

圧縮文字を外して tar cf でまとめると、圧縮なしの単純なアーカイブになります。展開するときも同じ圧縮文字を合わせるのが原則ですが、最近の tar は圧縮形式を自動検出するので tar xf だけでもたいてい展開できます。単一ファイルを圧縮するときは gzipbzip2 を直接使うこともあります。

# 単一ファイルの圧縮 / 解凍 (原本を .gz へ置き換え)
gzip /tmp/big.log          # → big.log.gz
gunzip /tmp/big.log.gz     # → big.log

# bzip2 (圧縮率がより高く遅い)
bzip2 /tmp/big.log
bunzip2 /tmp/big.log.bz2

ssh と scp: 遠隔作業 #

RHCSA 試験は複数のシステムを扱う場合があり、ssh で別のホストに接続して作業することがよくあります。基本の接続とコマンド実行は次のとおりです。

# 別のホストに接続
ssh user@server1

# 接続せずに遠隔コマンドだけ実行して結果を受け取る
ssh user@server1 'hostname; uptime'

# ポートを指定して接続
ssh -p 2222 user@server1

パスワードなしで接続するには、キーベース認証を設定します。キーペアを作って公開鍵を対象のサーバーへ送れば設定完了です。詳しい firewalld·SSH キー設定は #12 で深く扱いますが、基本の流れはここでつかんでおきます。

# キーペアの生成 (秘密鍵 ~/.ssh/id_ed25519、公開鍵 .pub)
ssh-keygen -t ed25519

# 公開鍵を対象サーバーの authorized_keys へコピー
ssh-copy-id user@server1

# 以降はパスワードなしで接続
ssh user@server1

ファイル転送は scprsync で行います。scp は単純なコピー、rsync は変更分だけ転送するので大きなディレクトリに効率的です。

# ローカル → 遠隔
scp /tmp/report.txt user@server1:/home/user/

# 遠隔 → ローカル
scp user@server1:/etc/hosts /tmp/

# ディレクトリを丸ごと (-r)
scp -r /tmp/configs user@server1:/tmp/

# rsync: 変更分だけ、アーカイブモードで権限を保存 (-a)
rsync -av /tmp/configs/ user@server1:/tmp/configs/

man page の活用: インターネットのない試験会場の武器 #

試験会場にはインターネットがありません。コマンドのオプションが思い出せないときの唯一の参考書が man page なので、素早く見つける習慣がそのまま点数になります。キーワードで関連する man page を探すときは man -k (apropos) を使います。

# キーワードで関連コマンドを探す
man -k password
man -k "list directory"

# man を開いて中で /EXAMPLE で例を探す (less 操作)
man find        # 開いた後 /EXAMPLE を入力、n で次

同じ名前が複数のセクションに存在するときはセクション番号を指定します。1 番はユーザーコマンド、5 番はファイル形式と設定ファイル、8 番は管理者コマンドです。たとえば passwd はコマンド (1 番) とファイル形式 (5 番) の両方があります。

# passwd コマンド (1 番セクション)
man 1 passwd

# /etc/passwd ファイル形式 (5 番セクション)
man 5 passwd

# 設定の例ファイルが集まったディレクトリ (試験で大きな助け)
ls /usr/share/doc/

/usr/share/doc の下にはパッケージごとの設定の例が入っています。autofs や LVM のように設定形式が難しい作業では、例ファイルをコピーして直せば時間を大きく節約できます。

試験の定番: 条件に合うファイルを見つけて処理する #

この記事のツールが一度に出てくる代表的な型が「特定の条件のファイルを見つけてどこかへコピーするかまとめよ」です。いくつかのパターンを手に覚えておけば、似た問題が出ても詰まりません。

# bob が所有するファイルをすべて見つけて /root/bob-files へコピー
mkdir -p /root/bob-files
find / -user bob -type f -exec cp {} /root/bob-files/ \; 2> /dev/null

# /etc で .conf で終わるファイルだけをまとめて圧縮アーカイブに
find /etc -name "*.conf" -exec tar rf /tmp/confs.tar {} \;

# /var/log で直近 7 日以内に修正されたファイルの一覧を保存
find /var/log -type f -mtime -7 > /tmp/recent-logs.txt

# messages ログから error を含む行だけを抜いてファイルへ
grep -i "error" /var/log/messages > /tmp/errors.txt

ここでも永続性と正確性を常に点検します。コピー先のディレクトリを先に作っておいたか、権限のないディレクトリの警告を 2> /dev/null でろ過して結果がきれいかを確認する小さな習慣が失点を防ぎます。

試験ポイント #

  • redirection の区別> は上書き、>> は追記、2> はエラーのみ、&> は出力とエラーをまとめて。sudo で保護されたファイルへ書くときは sudo tee を使う
  • find の条件結合-name·-type·-size·-mtime·-perm·-user をまとめ、-exec ... {} \; でそのまま処理。SUID 検索は -perm -4000
  • grep の正規表現と文脈-i·-r·-v·-E-A/-B/-C。コメント除去は grep -v "^#"
  • vi の必須操作。モード切り替え、:wq·:q!:%s/old/new/g 置換。nano がない場合があるので vi で覚える
  • tar オプションの組み合わせczf でまとめ xzf で展開し tzf で一覧を見る
  • ssh と scpssh-copy-id でキーを配布してパスワードなしで接続し、scp -r·rsync -av で転送する
  • man pageman -k でキーワードを探し、セクション番号で同じ名前を区別し、/usr/share/doc の例を活用する

まとめ #

この記事で押さえたこと:

  • redirection とパイプ。出力·エラーをファイルへ回し、| でツールをつなぎ、tee で保存と表示を同時に行う
  • find と grep。条件に合うファイルを見つけて -exec で処理し、テキストからパターンを選び出して文脈まで見る
  • テキスト処理と viless·sort·cut·sed·awk で内容を扱い、vi のモードと検索置換で設定ファイルを直接直す
  • archive と遠隔作業。tar·gzip でまとめ、ssh キーと scp·rsync で別のホストとファイルをやり取りする
  • man page。インターネットのない試験会場でオプションを探す唯一の参考書

これらのツールはそれ自体が出題領域でありながら、同時に残りのすべての領域の作業を速くこなす土台です。手に馴染むまで RHEL 実務トラック の環境で直接打ってみることをおすすめします。

次へ: シェルスクリプト #

ツールを手に覚えたら、ここからそのツールをまとめて自動化する段階へ進みます。

#3 シェルスクリプト: 条件文、繰り返し、引数、終了コード では、bash スクリプトの基本構造、if·for·while のような制御文、位置引数と終了コード、そして RHCSA が要求する簡単な自動化スクリプトを直接書きながら整理します。

X