ホーム » 「Linux演習」タグがついた投稿

タグアーカイブ: Linux演習

2021年6月
 12345
6789101112
13141516171819
20212223242526
27282930  

最新の投稿(電子情報)

アーカイブ

カテゴリー

Linux演習 – ファイル操作

Linux演習サーバへの接続

Unix(Linux)は、インターネットでのサーバとして広く活用されている。Linuxを試すには、Windows ならば WSL や Cygwin であったり、Mac でも使える仮想OSの VMware, VirrtualBox を使うこともでる。今回の演習では、全員が同じ環境で使うために、クラウド環境にサーバを準備した。クラウドのunixサーバを利用する場合には、リモートログインのための ssh が一般的である。

一方、教室のWiFi環境では、HTTP,HTTPS の通信しか使えないことから、ssh が通常利用できない。そこで、この演習では、特殊な使い方だが、HTTPS(443) ポートを使う。

Windows 10 ならば、cmd.exe , macOS ならば、ターミナルソフトを起動し、以下の操作を行う。

$ ssh -p 443 ゲストID@演習サーバ

ファイル操作の基本

まずは基本操作をしてみよう。ls コマンド(list) は、ディレクトリ内にあるファイルの一覧を表示する。cat コマンド(catalog)は、指定されたファイルの内容を表示する。

s53599xx@nitfcei:~$ ls
helloworld.c  Maildir

s53599xx@nitfcei:~$ ls -l
total 8
-rw-r--r-- 1 s53599xx students   76 Dec 21 14:30 helloworld.c
drwx------ 5 s53599xx students 4096 Dec 21 14:30 Maildir

s53599xx@nitfcei:~$ cat helloworld.c
#include <stdio.h>

int main() {
    printf( "Hello World\n" ) ;
    return 0 ;
}
s53599xx@nitfcei:~$

ファイルをコピーするには cp コマンド(copy)、不要なファイルを消すには rm コマンド(remove)を使う。

s53599xx@nitfcei:~$ cp helloworld.c test.c
s53599xx@nitfcei:~$ ls -l
total 8
-rw-r--r-- 1 s53599xx students   76 Dec 21 14:30 helloworld.c
drwx------ 5 s53599xx students 4096 Dec 21 14:30 Maildir
-rw-r--r-- 1 s53599xx students   76 Dec 21 14:40 test.c
s53599xx@nitfcei:~$ rm test.c
s53599xx@nitfcei:~$ ls -l
total 8
-rw-r--r-- 1 s53599xx students   76 Dec 21 14:30 helloworld.c
drwx------ 5 s53599xx students 4096 Dec 21 14:30 Maildir
s53599xx@nitfcei:~$

ファイル詳細表示の説明

 

ls -l で表示される詳細の内容は以下の通り。

属性 リンク数 所有者 グループ サイズ 日付 ファイル名
rw- r– r– 1 s53599xx students 76 Dec 21 14:30 helloworld.c
d rwx 5 s53599xx students 4096 Dec 21 14:30 Maildir
d -: 通常ファイル, d:ディレクトリ
rw- rwx 所有者が r:読み出し, w:書き込み, -: 権限なし
ファイルなら、x:実行可能
ディレクトリなら、x:ディレクトリに入れる
r – – – – – グループの rwx の属性 r– は 読み込みだけ許可
r – – – – – その他の rwx の属性  — は、読み書き禁止

基本的なファイル操作コマンド一覧

 

操作 Linux Windows
ディレクトリ一覧(list)
ディレクトリ詳細
ls 場所  ※
ls -l 場所
dir /w 場所  ※
dir 場所
※ 省略時はカレントディレクトリ
ファイル表示(catalog) cat 場所 type 場所
ファイルコピー(copy) cp コピー元 コピー先
cp コピー元 コピー先ディレクトリ
copy コピー元 コピー先
ファイル削除(remove) rm 場所 del 場所
ディレクトリ作成(make dir) mkdir 場所 md 場所
ディレクトリ削除(remove dir) rmdir 場所 rmdir 場所
カレントディレクトリ移動
(change directory)
cd 場所 cd 場所
ドライブの場合は
ドライブ名:
所有者を変更(change owner) chown 所有者 場所
グループを変更(change group) chgrp グループ 場所
属性を変更(change mode) chmod 属性 場所 ←属性の書き方

ワイルドカード文字

ls などのコマンドで、複数のファイルを対象とするとき、ワイルドカード文字が使える。

任意の1文字
?
(例)
$ ls
aaa.c  ab.c    abc.c   bcd.c   defgh.c  hij.cxx
$ ls a?.c
ab.c
$ ls ???.c
aaa.c   abc.c   bcd.c
任意の文字
*
(例)
$ ls a*.c
aaa.c ab.c abc.c
$ ls *.cxx
jij.cxx

相対PATHと絶対PATH

ファイルの場所を指定するには、2つの方法がある。

絶対PATHは、木構造の根(ルートディレクトリ / で表す) からの経路のディレクトリ名を”/”で区切って書き連ねる。ルートディレクトリからの場所であることを示すために、先頭を / で始める。住所を /福井県/越前市/宮谷町/斉藤家 と書くようなもの。

相対PATHは、現在注目しているディレクトリ(カレントディレクトリと呼ぶ)からの経路を書く。住所でいうと、/福井県/越前市 に注目している状態で、宮谷町/斉藤家 と書くようなもの。

上記の絵であれば、/home/tsaitoh/helloworld.c を、相対PATHで書く場合、s53599xx の一つ上にさかのぼって場所を指定することもできる。一つ上のディレクトリ(親ディレクトリ).. (ピリオド2つ)

この場合、” $ cat ../tsaitoh/helloworld.c ” の様な相対PATHでもアクセスできる。

カレントディレクトリ自身を表す場合は、. (ピリオド1つ)を使う。

/home/s53599xx/helloworld.c の場所は、” $ cat ./helloworld.c ” と書くこともできる。

CTF風に演習

ここで、ディレクトリの場所の書き方が理解できたかを練習してみよう。

/home0/Challenge/1-CTF.d の下にフォルダがいくつかあり、その中にさらにファイルがある。このファイルの中には、FLAG{なんとか} と書いた部分がある。この「なんとか」の部分を速く見つけ出して答えよう。

上記フォルダには、5つの問題 Task1 , Task2 , Task3 , Task4 , Task5 がある。

Task2 , Task3 では、以下のコマンドを使う。(ヒントはTaskフォルダの0ReadMeを読め)

操作 Linux
ページャで表示(空白で次のページ,qで停止) more ファイルの場所
元に戻れるページャ(less) less ファイルの場所
多機能ページャ(文字コード判別) lv ファイルの場所
漢字コード変換 nkf ファイルの場所
nkf -j ファイル JISコードで表示
nkf -s ファイル Shift-JISコードで表示(Windows)
nkf -e ファイル EUCコードで表示
nkf -w ファイル UTF-8 で表示(Mac,Linux)

Task4 , Task5 には、難易度をあげるためのトリックがしかけてある。(ヒント 0ReadMe)

授業内レポート

  1. 自分でみつけられたフラグを以下の様に答えよ。(できた所までで良い)
    Task1 = FLAG{なんとか}
    Task2 = …
  2. Task1 で答えを見つけるまでに実行したコマンドとその途中結果を簡単にまとめよ。
    できれば、実行したコマンドを、相対PATH形式、絶対PATH形式で答えよ。
    $ cd /home0/Challenge/1-CTF.d/Task1
    $ ls
    0ReadMe  brain  concussion  persons

history コマンドは、過去に実行したコマンドを表示してくれる。

Linux演習 – LOG解析

Linux は利用者に様々なサービスを提供するサーバで広く利用されている。しかし、幅広いサービス提供となると、中にはウィルス拡散や個人情報収集のための悪意のあるアクセスも増えてくる。

このためサーバでは、アクセスを受けた時の状況を記録し保存する。このような情報はアクセス履歴ログと呼ぶ。

ログの中には、以下のような情報が混在することになるが、大量の 1. や 2. 目的のアクセスの中に、3. や 4. といったアクセスが混ざることになるが、これを見逃すとシステムに不正侵入を受ける可能性もある。

  1. 本来の利用者からのアクセス
  2. 検索システムの情報収集(クローラーからのアクセス)
  3. 不正な情報収集のためのアクセス
  4. システムの不備を探して不正侵入などを試みるアクセス

今回の演習では、電子情報の web サーバのとある1日のアクセス履歴ファイルを用い、パイプ機能を使い様々なフィルタを使い LOG解析の練習を行う。

アクセス履歴の解析

Webサーバのアクセス履歴が、/home0/Challenge/2.2-LOG.d/access.log に置いてある。このファイルで簡単な確認をしてみよう。

(( ファイルの場所に移動 ))
$ cd /home0/Challenge/2.2-LOG.d/

(( .asp という文字を含む行を表示 ))
$ grep .asp access.log

電子情報のWebサーバには、.asp (WindowsのWebサーバで動かすプログラムの拡張子) など存在しない。明らかに設定不備を探すための攻撃である。

これを見ると、grep で .asp を含む行が抜粋され、.asp の部分が強調されていることで、攻撃を簡単に確認できる。しかしこれは画面行数で10件程度が確認できるが、本当は何回攻撃を受けたのだろうか?この場合は、行数をカウントする”wc -l” を使えばいい。

(( アクセス回数を数える ))
$ grep .asp access.log | wc -l
37

access.log の各項目の意味

電子情報のWebサーバの access.log に記録されている各項目の意味は以下の通り。

 

項目 log項目 内容
1 %h リモートホスト。WebサーバにアクセスしてきたクライアントのIPアドレス
2 %l リモートログ名。説明略。通常は “-“
3 %u ログインして操作するページでのユーザ名。通常は “-“
4 %t アクセスを受けた時刻
5 %r 読み込むページ。アクセス方法(GET/POSTなど)と、アクセスした場所
6 %>s ステータスコード。(200成功,403閲覧禁止,404Not Found)
7 %b 通信したデータのバイト数
8 %{Referer}i Referer どのページからアクセスが発生したのか
9 %{User-Agent}i User-Agent ブラウザ種別(どういったブラウザからアクセスされたのか)

以下に、フィルタプログラムを活用して、色々な情報を探す例を示す。実際にコマンドを打って何が表示されるか確認しながら、フィルタプログラムの意味を調べながら、何をしているか考えよう。

.asp を使った攻撃を探す

(( .asp を試す最初の履歴を探す ))
$ grep "\.asp" access.log | head -1
49.89.249.9 - - [20/Dec/2019:09:19:06 +0900] "POST /Include/md5.asp HTTP/1.1" 404 64344 "https://www.ei.fukui-nct.ac.jp/Include/md5.asp" "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)"

(( 49.89.249.9 がどんなアクセスを試みているのか探す ))
$ grep ^49.89.249.9 access.log | head
49.89.249.9 - - [20/Dec/2019:09:19:06 +0900] "POST /Include/md5.asp HTTP/1.1" 404 64344 "https://www.ei.fukui-nct.ac.jp/Include/md5.asp" "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)"
49.89.249.9 - - [20/Dec/2019:09:19:06 +0900] "POST /inc/md5.asp HTTP/1.1" 404 61056 "https://www.ei.fukui-nct.ac.jp/inc/md5.asp" "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)"
  • ステータスコードが404は”Not Found”なので、読み出しに失敗している。
  • IPアドレス検索で、49.89.249.9 がどこのコンピュータか調べよう。

攻撃の時間を確認

(( 49.89.249.9 がどんな時間にアクセスを試みているのか探す ))
$ grep ^49.89.249.9 access.log | awk '{print $4;}'
[20/Dec/2019:09:19:06
[20/Dec/2019:09:19:06
[20/Dec/2019:09:19:07
:
  • 不正アクセスを試みている時間を調べると、そのアクセス元の09:00~17:00に攻撃していることがわかる場合がある。どういうこと?

ページの閲覧頻度を確認

(( /~t-saitoh/ 見たIPアドレスと頻度 ))
$ grep "/~t-saitoh/" access.log | awk '{print $1;}' | sort | uniq -c | sort -gr | head
     38 151.80.39.78
     35 151.80.39.209
     32 203.104.143.206
     31 5.196.87.138
        :
  • grep – “/~t-saitoh/”のページをアクセスしているデータを抽出
  • awk – 項目の先頭(IPアドレス)だけ抽出
  • sort – IPアドレス順に並べる(同じIPアドレスならその数だけ重複した行になる)
  • uniq – 重複している行数を数える
  • sort -gr – 先頭の重複数で大きい順にソート
  • head – 先頭10行だけ抽出
(( /~t-saitoh/ 見たIPアドレスと頻度 ))
(( t-saitoh のテスト問題のページを誰が見ているのか? ))
$ grep "/~t-saitoh/exam/" access.log
5.196.87.156 - - [20/Dec/2019:06:36:02 +0900] "GET /~t-saitoh/exam/db2009/ex2009-5-1.pdf HTTP/1.1" 200 20152 "-" "Mozilla/5.0 (compatible; AhrefsBot/6.1; +http://ahrefs.com/robot/)"
 :
(( クローラーのアクセスが多くてよくわからないので bot を含まない行を抽出 ))
$ grep "/~t-saitoh/exam/" access.log | grep -v -i bot | lv
213.242.6.61 - - [20/Dec/2019:06:33:12 +0900] "GET /%7Et-saitoh/exam/ HTTP/1.0" 200 19117 "http://www.ei.fukui-nct.ac.jp/%7Et-saitoh/exam/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36 OPR/54.0.2952.64 (Edition Yx)"
188.163.109.153 - - [20/Dec/2019:06:43:04 +0900] "GET /%7Et-saitoh/exam/ HTTP/1.0" 200 19117 "http://www.ei.fukui-nct.ac.jp/%7Et-saitoh/exam/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.170 Safari/537.36 OPR/53.0.2907.99"
188.163.109.153 - - [20/Dec/2019:06:43:05 +0900] "POST /cgi-bin/movabletype/mt-comments.cgi HTTP/1.0" 404 432 "http://www.ei.fukui-nct.ac.jp/%7Et-saitoh/exam/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.170 Safari/537.36 OPR/53.0.2907.99"
45.32.193.50 - - [20/Dec/2019:07:06:15 +0900] "GET /~t-saitoh/exam/apply-prog.html HTTP/1.0" 200 5317 "http://www.ei.fukui-nct.ac.jp/" "Mozilla/5.0 (Windows NT 5.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
  • この結果を見ると mt-comments.cgi というアクセスが見つかる。どうも コメントスパム(ブログのコメント欄に広告を勝手に書き込む迷惑行為)をしようとしている。

ネットワーク攻撃への対処

今回の access.log のアクセス履歴解析は、Webサーバへのアクセスへの基本的な対処となる。しかし、もっと違うネットワーク接続ではどのような対処を行うであろうか?

一般的には、

  • サーバにネットワークアクセスの記録ソフトを使う(例ネットワークプロトコルアナライザーWireShark)
  • ファイアウォールのアクセス履歴を解析

授業内レポート

  • ここまでのLOG解析の例の1つについて、どういう考え方でフィルタを使っているのか、自分の言葉で説明せよ。
  • LOG 解析のためのコマンドを考え、その実行結果を示し、それから何が判るか説明せよ。
    (例) コメントスパムを何度も試す危ないアクセス元は〇〇である。

Linux演習 – リダイレクトとパイプ

Linux演習の第2弾として、リダイレクトとパイプについて説明し、LOG解析の演習を行う。

標準入出力とリダイレクト

出力リダイレクト

C言語のプログラミングで、プログラムの実行結果をレポートに張り付ける時はどのように行っているだろうか?多くの人は、実行画面を PrintScreen でキャプチャした画像を張り付けているかもしれない。しかし、数十行にわたる結果であれば何度もキャプチャが必要となる。
そこで、今日の最初はリダイレクト機能について説明する。

“gcc ファイル.c” は、C言語のプログラムをコンパイルし、a.out という実行ファイルを生成する。”./a.out” にてプログラムを実行する。実行する命令に、“> ファイル名” と書くと、通常の出力画面(標準出力) をファイル名に記録してくれる。これを出力リダイレクトと呼ぶ。また、“>> ファイル名” と書くと、既存ファイルの後ろに追記してくれる。

s53599xx@nitfcei:~$ cat helloworld.c
#include <stdio.h>
int main() {
    printf( "Hello World\n" ) ;
    return 0 ;
}

s53599xx@nitfcei:~$ gcc helloworld.c
s53599xx@nitfcei:~$ ./a.out
Hello World

s53599xx@nitfcei:~$ ./a.out > helloworld.txt

s53599xx@nitfcei:~$ cat helloworld.txt
Hello World

s53599xx@nitfcei:~$ ./a.out >> helloworld.txt

s53599xx@nitfcei:~$ cat helloworld.txt 
Hello World
Hello World 

入力リダイレクト

次に、1行に名前と3教科の点数が書いてある複数行に渡るデータの各人の平均点を求めるプログラムを考える。

s53599xx@nitfcei:~$ cp /home0/Challenge/2.1-RedirectPipe.d/avg-each-low.c .
s53599xx@nitfcei:~$ cat avg-each-low.c
#include <stdio.h>
// ((input))           ((output))
// saitoh  43  54 82   saitoh 59.67
// tomoko  89 100 32   tomoko 73.67
// mitsuki 79  68 93   mitsuki 80.00
int main() {
   char name[ 100 ] ;
   int point[ 3 ] ;
   while( scanf( "%s%d%d%d" ,
                 name , &point[0] , &point[1] , &point[2] ) == 4 ) {
      double sum = 0.0 ;
      for( int i = 0 ; i < 3 ; i++ )
         sum += point[i] ;
      printf( "%s %6.2f\n" , name , sum / 3.0 ) ;
   }
   return 0 ;
}

s53599xx@nitfcei:~$ gcc avg-each-low.c
s53599xx@nitfcei:~$ ./a.out
saitoh 43  54 82    入力
saitoh 59.67        出力
tomoko 89 100 32    入力
tomoko 73.67        出力
^D             ← Ctrl-D を押すとファイル入力を終了

しかし、プログラムの書き方を間違えてプログラムを修正していると、動作確認のたびに何度も同じデータを入力するかもしれないが、面倒ではないだろうか?

プログラムを実行する時に、“< ファイル名” をつけると、通常はキーボードから入力する所を、ファイルからの入力に切り替えて実行することができる。このようなscanf()を使う時のようなプログラムの入力を標準入力といい、それをファイルに切り替えることを入力リダイレクトと呼ぶ。

s53599xx@nitfcei:~$ cp /home0/Challenge/2.1-RedirectPipe.d/name-point3.txt .

s53599xx@nitfcei:~$ cat name-point3.txt
saitoh  43  54 82
tomoko  89 100 32
mitsuki 79  68 93 

s53599xx@nitfcei:~$ ./a.out < name-point3.txt
saitoh  59.67
tomoko  73.67
mitsuki 80.00

この入力リダイレクトと出力リダイレクトを合わせて使うこともできる。

s53599xx@nitfcei:~$ ./a.out < name-point3.txt > name-avg.txt

s53599xx@nitfcei:~$ cat name-avg.txt
saitoh  59.67
tomoko  73.67
mitsuki 80.00

パイプ

先の名前と3教科のプログラムの結果から、全員の平均点をも計算したい場合、どのようなプログラムを作るだろうか?C言語だけの知識なら、各人の行のデータを計算するループの中に、全員の合計と人数を求めるプログラムを書いて、最後に平均点を出力するだろう。

一方で、複数人の名前と平均点のデータから平均点を求めるプログラムを書いて、前述のプログラムの実行結果を使う人もいるだろう。

以下の例では、“gcc -o avg-each-row avg-each-row.c” で、avg-each-row という実行ファイル、“gcc -o avg-all avg-all.c” で、avg-all という実行ファイルを生成し、avg-each-row で入力リダイレクト・出力リダイレクトを使って、name-avg.txt を作り、avg-all を入力リダイレクトで、最終結果を表示している。

s53599xx@nitfcei:~$ cp /home0/Challenge/2.1-RedirectPipe.d/avg-all.c .
s53599xx@nitfcei:~$ cat avg-all.c
#include <stdio.h>
// ((input))      ((output))
// saitoh  59.67  73.11
// tomoko  73.67
// mitsuki 80.00
int main() {
   char name[ 100 ] ;
   double point ;
   double sum = 0 ;
   int count = 0 ;
   while( scanf( "%s%lf" , name , &point ) == 2 ) {
      sum += point ;
      count++ ;
   }
   printf( "%6.2f\n" , sum / (double)count ) ;
   return 0 ;
}

s53599xx@nitfcei:~$ gcc -o avg-each-low avg-each-low.c
s53599xx@nitfcei:~$ gcc -o avg-all avg-all.c

s53599xx@nitfcei:~$ ./avg-each-low < name-point3.txt > name-avg.txt

s53599xx@nitfcei:~$ ./avg-all < name-avg.txt
71.11

しかし、いちいち入出力の結果を name-avg.txt を作るのは面倒である。であれば、以下の様なイメージで処理をすれば答えが求まる。

name-point3.txt(avg-each-row)name-avg.txt(avg-all)結果

これは、パイプ機能を使って以下の様に動かすことができる。

s53599xx@nitfcei:~$ ./avg-each-low < name-point3.txt | ./avg-all
71.11

s53599xx@nitfcei:~$ cat name-point3.txt | ./avg-each-low | ./avg-all
71.11

プログラムを実行する時に、“A | B” ように書くと、プログラムA の標準出力結果を、プログラムB の標準入力に接続させて、2つのプログラムを実行できる。このような機能を、パイプと呼ぶ。上記例の2つめ “cat… | ./avg-each-low | ./avg-all” では3つのプログラムをパイプでつないでいる。


リダイレクトのまとめ

 

入力リダイレクト(標準入力) 実行コマンド < 入力ファイル
出力リダイレクト(標準出力) 実行コマンド > 出力ファイル
 出力リダイレクト(標準出力の追記) 実行コマンド >> 出力ファイル
 標準エラー出力のリダイレクト 実行コマンド 2> 出力ファイル
パイプ
コマンドAの標準出力をコマンドBの標準入力に接続
コマンドA | コマンドB

C言語のコンパイルまとめ

 

C言語のコンパイル(実行ファイルはa.out) gcc ソースファイル
 実行ファイル名を指定してコンパイル gcc -o 実行ファイル ソースファイル

フィルタプログラム

パイプを使うと、標準入力からデータをもらい・標準出力に結果を出力するような簡単なプログラムを組み合わせて、様々な処理が簡単にできる。こういったプログラムは、フィルタと呼ぶ。

簡単な例として、入力をすべて大文字に変換するプログラム(toupper)、入力文字をすべて小文字に変換するプログラム(tolower)が、下記の例のように保存してあるので動作を確かめよ。

s53599xx@nitfcei:~$ cp /home0/Challenge/2.1-RedirectPipe.d/toupper.c .
s53599xx@nitfcei:~$ gcc -o toupper toupper.c .
s53599xx@nitfcei:~$ cat toupper.c | ./toupper
#INCLUDE <STDIO.H>
#INCLUDE <CTYPE.H>
INT MAIN() {
    INT     C ;
    WHILE( (C = GETCHAR()) != EOF )
        PUTCHAR( TOUPPER( C ) ) ;
    RETURN 0 ;
}

s53599xx@nitfcei:~$ cp /home0/Challenge/2.1-RedirectPipe.d/tolower.c .
s53599xx@nitfcei:~$ gcc -o tolower tolower.c
s53599xx@nitfcei:~$ cat tolower.c | ./tolower
(((何が出力されるか答えよ)))

よく使われるフィルタのまとめ

 

文字パターンを含む行だけ出力 grep 文字パターン
文字パターンを含まない行を出力
文字パターンを正規表現でマッチングし該当を出力
大文字小文字を区別しない
grep -v 文字パターン
grep -e 正規表現
grep -i 文字パターン
入力文字数・単語数・行数をカウント(word counter) wc
入力行数をカウント wc -l
データを昇順に並べる sort
データを降順に並べる
先頭を数字と見なしてソート
sort -r
sort -g
同じ行データが連続したら1つにまとめる uniq
同じ行が連続したら1つにまとめ、連続した数を出力 uniq -c
空白区切りで指定した場所(1番目)を抽出 awk ‘{print$1;}’
入力の先頭複数行を表示(10行) head
入力の末尾複数行を表示(10行) tail
指定した行数だけ、先頭/末尾を表示 head -行数
tail -行数

 

Linux演習 – ファイル操作

Linux演習サーバへの接続

Unix(Linux)は、インターネットでのサーバとして広く活用されている。Linuxを試すには、Windows ならば WSL や Cygwin であったり、Mac でも使える仮想OSの VMware, VirrtualBox を使うこともでる。今回の演習では、全員が同じ環境で使うために、クラウド環境にサーバを準備した。クラウドのunixサーバを利用する場合には、リモートログインのための ssh が一般的である。

一方、教室のWiFi環境では、HTTP,HTTPS の通信しか使えないことから、ssh が通常利用できない。そこで、この演習では、特殊な使い方だが、HTTPS(443) ポートを使う。

$ ssh -p 443 情報処理センターID@演習サーバ
  • 演習サーバの接続方法(学内のみ) – サーバへの攻撃を極力へらすために非公開。
  • パスワード入力時にタイプミスした時は、Ctrl-U で最初から入力のやり直しができる。
  • サーバの設置先の問題で、パスワード入力後20秒ほど待つ必要があるので注意。

ファイル操作の基本

まずは基本操作をしてみよう。ls コマンド(list) は、ディレクトリ内にあるファイルの一覧を表示する。cat コマンド(catalog)は、指定されたファイルの内容を表示する。

s53599xx@nitfcei:~$ ls
helloworld.c  Maildir

s53599xx@nitfcei:~$ ls -l
total 8
-rw-r--r-- 1 s53599xx students   76 Dec 21 14:30 helloworld.c
drwx------ 5 s53599xx students 4096 Dec 21 14:30 Maildir

s53599xx@nitfcei:~$ cat helloworld.c
#include <stdio.h>

int main() {
    printf( "Hello World\n" ) ;
    return 0 ;
}
s53599xx@nitfcei:~$

ファイルをコピーするには cp コマンド(copy)、不要なファイルを消すには rm コマンド(remove)を使う。

s53599xx@nitfcei:~$ cp helloworld.c test.c
s53599xx@nitfcei:~$ ls -l
total 8
-rw-r--r-- 1 s53599xx students   76 Dec 21 14:30 helloworld.c
drwx------ 5 s53599xx students 4096 Dec 21 14:30 Maildir
-rw-r--r-- 1 s53599xx students   76 Dec 21 14:40 test.c
s53599xx@nitfcei:~$ rm test.c
s53599xx@nitfcei:~$ ls -l
total 8
-rw-r--r-- 1 s53599xx students   76 Dec 21 14:30 helloworld.c
drwx------ 5 s53599xx students 4096 Dec 21 14:30 Maildir
s53599xx@nitfcei:~$

ファイル詳細表示の説明

 

ls -l で表示される詳細の内容は以下の通り。

属性 リンク数 所有者 グループ サイズ 日付 ファイル名
rw- r– r– 1 s53599xx students 76 Dec 21 14:30 helloworld.c
d rwx 5 s53599xx students 4096 Dec 21 14:30 Maildir
d -: 通常ファイル, d:ディレクトリ
rw- rwx 所有者が r:読み出し, w:書き込み, -: 権限なし
ファイルなら、x:実行可能
ディレクトリなら、x:ディレクトリに入れる
r – – – – – グループの rwx の属性 r– は 読み込みだけ許可
r – – – – – その他の rwx の属性  — は、読み書き禁止

基本的なファイル操作コマンド一覧

 

操作 Linux Windows
ディレクトリ一覧(list)
ディレクトリ詳細
ls 場所  ※
ls -l 場所
dir /w 場所  ※
dir 場所
※ 省略時はカレントディレクトリ
ファイル表示(catalog) cat 場所 type 場所
ファイルコピー(copy) cp コピー元 コピー先
cp コピー元 コピー先ディレクトリ
copy コピー元 コピー先
ファイル削除(remove) rm 場所 del 場所
ディレクトリ作成(make dir) mkdir 場所 md 場所
ディレクトリ削除(remove dir) rmdir 場所 rmdir 場所
カレントディレクトリ移動
(change directory)
cd 場所 cd 場所
ドライブの場合は
ドライブ名:
所有者を変更(change owner) chown 所有者 場所
グループを変更(change group) chgrp グループ 場所
属性を変更(change mode) chmod 属性 場所 ←属性の書き方

ワイルドカード文字

ls などのコマンドで、複数のファイルを対象とするとき、ワイルドカード文字が使える。

任意の1文字
?
(例)
$ ls
aaa.c  ab.c    abc.c   bcd.c   defgh.c  hij.cxx
$ ls a?.c
ab.c
$ ls ???.c
aaa.c   abc.c   bcd.c
任意の文字
*
(例)
$ ls a*.c
aaa.c ab.c abc.c
$ ls *.cxx
jij.cxx

相対PATHと絶対PATH

ファイルの場所を指定するには、2つの方法がある。

絶対PATHは、木構造の根(ルートディレクトリ / で表す) からの経路のディレクトリ名を”/”で区切って書き連ねる。ルートディレクトリからの場所であることを示すために、先頭を / で始める。住所を /福井県/越前市/宮谷町/斉藤家 と書くようなもの。

相対PATHは、現在注目しているディレクトリ(カレントディレクトリと呼ぶ)からの経路を書く。住所でいうと、/福井県/越前市 に注目している状態で、宮谷町/斉藤家 と書くようなもの。

上記の絵であれば、/home/tsaitoh/helloworld.c を、相対PATHで書く場合、s53599xx の一つ上にさかのぼって場所を指定することもできる。一つ上のディレクトリ(親ディレクトリ).. (ピリオド2つ)

この場合、” $ cat ../tsaitoh/helloworld.c ” の様な相対PATHでもアクセスできる。

カレントディレクトリ自身を表す場合は、. (ピリオド1つ)を使う。

/home/s53599xx/helloworld.c の場所は、” $ cat ./helloworld.c ” と書くこともできる。

CTF風に演習

ここで、ディレクトリの場所の書き方が理解できたかを練習してみよう。

/home0/Challenge/1-CTF.d の下にフォルダがいくつかあり、その中にさらにファイルがある。このファイルの中には、FLAG{なんとか} と書いた部分がある。この「なんとか」の部分を速く見つけ出して答えよう。

上記フォルダには、5つの問題 Task1 , Task2 , Task3 , Task4 , Task5 がある。

Task2 , Task3 では、以下のコマンドを使う。(ヒントはTaskフォルダの0ReadMeを読め)

操作 Linux
ページャで表示(空白で次のページ,qで停止) more ファイルの場所
元に戻れるページャ(less) less ファイルの場所
多機能ページャ(文字コード判別) lv ファイルの場所
漢字コード変換 nkf ファイルの場所
nkf -j ファイル JISコードで表示
nkf -s ファイル Shift-JISコードで表示(Windows)
nkf -e ファイル EUCコードで表示
nkf -w ファイル UTF-8 で表示(Mac,Linux)

Task4 , Task5 には、難易度をあげるためのトリックがしかけてある。(ヒント 0ReadMe)

授業内レポート

  1. 自分でみつけられたフラグを以下の様に答えよ。(できた所までで良い)
    Task1 = FLAG{なんとか}
    Task2 = …
  2. Task1 で答えを見つけるまでに実行したコマンドとその途中結果を簡単にまとめよ。
    できれば、実行したコマンドを、相対PATH形式、絶対PATH形式で答えよ。
    $ cd /home0/Challenge/1-CTF.d/Task1
    $ ls
    0ReadMe  brain  concussion  persons

history コマンドは、過去に実行したコマンドを表示してくれる。