システムプログラム(第0回): 端末(2)

                                       筑波大学 システム情報系 情報工学域
                                       新城 靖
                                       <yas@cs.tsukuba.ac.jp>

このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~syspro/2023/2023-05-17
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~syspro/2023/
http://www.coins.tsukuba.ac.jp/~yas/

今日の重要な話

その他

■プロセス

説明するのは、けっこう難しい。完全な理解には、次のような勉強が必要にな る。 その前に、ps コマンド、kill コマンドを使えるようにする。

◆プロセスとは

プログラムがメモリに読み込まれ、CPU (processor) により実行できる状態に なったもの。 ←→プログラムは、ハードディスクにあってもプログラム。

「端末」を複数開くと、「シェル」のプロセスが2つ実行される。 プログラムとしては、同じシェルだが、プロセスとしては別物になる。

その昔は、1度に1個のプログラムだけしかメモリに入れられなかった。 (プログラムとプロセスの違いが希薄。)

メモリにプロセスが3つ、オペレーティング・システム・カーネル、ハードディスク、プロセッサ
プログラムとプロセス

プロセスの操作

「殺す」と「止める」は違う。 殺したプロセスは、再開できない。 止めたプロセスは、場合によっては、再開できる。

■プロセスを作る==プログラムを実行する

プログラムを実行すると、しばしば新しいプロセスが作られる。 例:シェル
$ /bin/ls [←]
プログラムが含まれたファイルは、/bin の他に /usr/bin, /usr/sbin, /usr/local/bin等にある。シェルは、/bin/ls と /bin を付けなくても後述す る 環境変数PATH にあるディレクトリを探す。

◆組み込みコマンドと外部コマンド

シェルのコマンドには、ファイルに含まれたプログラムを実行する以外に、シェ ル自身の動きを変えるコマンドがある。これを組み込みコマンド(builtin command)や内部コマンド(internal command)という。それに対して、シェルの 外にあるプログラムに対応しているコマンドは外部コマンド(external command)という。

シェルが外部コマンドを実行する時は、プロセスが作られる。組み込みコマン ドを実行する時は、プロセスは作られず、シェル自身が実行する(シェルの内 部のプログラムが動く)。

内部コマンドには、次のようなものがある。

次のようなコマンドは、普通、外部コマンドである。

いくつかのコマンドは、組み込みコマンドと外部コマンドの両方がある(紛ら わしい)

■プロセスの観察

手引き 2.10.1 参照

プロセスには、ID (identifier)と属性がある。 psコマンド は、プロセスの一覧と属性を表示するコマンドである。

$ ps [←]
    PID TTY          TIME CMD
4026784 pts/0    00:00:00 bash
4028828 pts/0    00:00:00 emacs
4028900 pts/0    00:00:00 ps
$ []
1行が1プロセスに対応。左から次のような意味を持つ。
PID プロセス識別子
プロセスを区別する番号。 伝統的な Unix では、最大5桁の番号(最大 32767, 65535, 99999)。 64 ビットの Linux では、デフォルトで 2 の 22 乗(/proc/sys/kernel/pid_max)
TTY, (TT) 端末名
そのプロセスが結びつけられている端末の省略形。 たとえば、端末 /dev/pts/0pts/0になる。
TIME
CPU時間。 CPUがそのプロセスを実行するために費やした時間。
CMD (または COMMAND)
そのプロセスを起動した時のコマンド。 プログラムが含まれているファイルの名前の一部。
ps コマンドで表示される端末の名前は、 端末プログラムのウィンドウごとや、ssh での遠隔ログインごとに違う。 シェルで、自分の端末の名前は、tty コマンドで調べることができる。
$ tty [←]
/dev/pts/0
$ []

◆プロセスと端末

Unix 系の OS (Linux, macOS 含む)でプロセスは、「端末」に関連して次のように分類される ps コマンドに x オプションを指定すると、端末と結びついていないプロセスも表示する。 (x がない場合、同じ UID で別の端末に結びついているプロセスが表示されないことがあるが、x があると表示する。)
$ ps x [←]
    PID TTY      STAT   TIME COMMAND
4026641 ?        Ss     0:00 /lib/systemd/systemd --user
4026642 ?        S      0:00 (sd-pam)
4026648 ?        Ssl    0:00 /usr/bin/pipewire
4026649 ?        Ssl    0:00 /usr/bin/pipewire-media-session
4026650 ?        Ssl    0:00 /usr/bin/pulseaudio --daemonize=no --log-target=jou
4026677 ?        Ss     0:00 /usr/bin/dbus-daemon --session --address=systemd: -
4026698 ?        Ssl    0:00 /usr/libexec/gvfsd
4026719 ?        Sl     0:00 /usr/libexec/gvfsd-fuse /run/user/1013/gvfs -f
4026752 ?        Ssl    0:00 /usr/libexec/xdg-document-portal
4026753 ?        R      0:00 sshd: yas@pts/0
4026756 ?        Ssl    0:00 /usr/libexec/xdg-permission-store
4026779 ?        SNsl   0:00 /usr/libexec/tracker-miner-fs-3
4026784 pts/0    Ss     0:00 -bash
4026823 ?        Ssl    0:00 /usr/libexec/gvfs-udisks2-volume-monitor
4026828 ?        Ssl    0:00 /usr/libexec/gvfs-afc-volume-monitor
4026833 ?        Ssl    0:00 /usr/libexec/gvfs-gphoto2-volume-monitor
4026837 ?        Ssl    0:00 /usr/libexec/gvfs-mtp-volume-monitor
4026841 ?        Ssl    0:00 /usr/libexec/gvfs-goa-volume-monitor
4026845 ?        Sl     0:00 /usr/libexec/goa-daemon
4026852 ?        Sl     0:00 /usr/libexec/goa-identity-service
4028414 ?        S      0:00 sshd: yas@pts/1
4028415 pts/1    Ss+    0:00 -bash
4028504 pts/1    Tl     0:00 emacs -nw
4028828 pts/0    Tl     0:00 emacs -nw
4029698 pts/0    R+     0:00 ps x
$ []
ps に x, l, u, a 等のオプションを付けると、 ps はプロセスの 状態 (STATe) を表示する。よく表示される状態(大文字部分)には、次のようなものがある。
R (runnable)
実行可能。CPU が空いていれば実行される。
U (uninterruptible), D (Disk),
ディスク入出力などの完了を待っている。
S (Sleep)、I (Idle)
キーボードや他のプロセスからの入力を待っている。

◆プロセスとユーザ

プロセスには、どのユーザの資格で実行しているかという情報( UID, User Identifier )が設定されている。この資格は、通常はそのプロセスを起動した ユーザになる。psコマンドを引数なしに実行すると、自分の資格で実行してい る(端末がある)プロセスだけを表示する。他人のプロセスも表示したい時は、 psコマンドを実行するときに「a」オプション(all)をつける。
$ ps a [←]
端末と結びついていないプロセスも含めるには、x オプションもつける。
$ ps ax [←]

◆プロセスと資源

psコマンドにuオプション(user-oriented)を付けると、 プロセスに割り当てられたメモリ資源やCPU資源が表示する。 練習問題 ps u 参照。

◆プロセスの親子関係

プロセスには、生みの親となるプロセスが1個ある。 もとのプロセスを「親プロセス」、 親プロセスから生まれたプロセスを 「子プロセス」とう。 psコマンドにlオプション(long)を付けると、 親プロセスを表示することができる。 親子関係により、プロセスは全体として木構造 木構造(tree structure) を作る。

練習問題 ps lと親プロセスpstreeコマンド参照。 。

■プロセスを殺す(kill)

手引き 2.10.2 参照

プロセスを殺すとは、プロセスが自主的に終了しない時に、強制的に終了させ ること。

◆どんな時にプロセスを強制終了したいか

◆プロセスを殺す2つの方法

Unix では、プロセスを殺す方法は、主に次の2つ。

どちらの方法でも、裏では シグナル (ソフトウェア割込み) という仕掛けが働く。

注意: 端末プログラムでウィンドウを閉じたくらいでは、 問題のあるプロセスは死んでいないこともある。

◆キーによるプロセスの強制終了

端末で動作しているプロセスが、キーボードからキーを読み込んでいる状態の 時には、^C (Control + C) を押すと、終了できる。
$ sleep 5 [←]
$ []
以下の例では、500秒 sleep したかったが、途中でやめたくなった。
$ sleep 500 [←]
^C
$ []
^C を押すと、端末の働きで、プロセスに対して 「シグナル」が飛ぶようになっている。

cat コマンドは、引数のファイルを画面に表示する。

$ cat /etc/shells [←]
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/usr/bin/tmux
/bin/tmux
/usr/bin/zsh
/bin/zsh
/bin/ksh
/bin/rksh
/usr/bin/ksh
/usr/bin/rksh
/bin/csh
/bin/tcsh
/usr/bin/csh
/usr/bin/tcsh
/usr/bin/fish
/bin/fish
$ []
cat コマンドは、引数を与えないと、キーボードから(行単位で)データを読み、 それを画面に表示する。 途中で cat コマンドのプロセスを^Cで強制終了している。
$ cat [←]
Line 1[←]
Line 1
Line 2[←]
Line 2
^C
$ []
^C と同様に ^\ (「^\」または「^¥」) もプロセスを強制終了させるキーで ある。^\ は、^Cが利かないときでも利くことがある。

^\ の場合、デバッグ用にcore という名前のファイル ができる。普段は、core ファイルは不要なので、^C を使うべ きである。

coins の環境では、core ファイルが作られないように設定されている。 core ファイルの利用方法は、デバッガ gdb のマニュアル、 man core (core ファイルの man ページ(man コマンドで表示されるページ))、

stty コマンドを使うと、^C^\ を変更でき る。

$ stty -a [←]
speed 38400 baud; rows 40; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = ;
eol2 = ; swtch = ; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
-iuclc ixany imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke -flusho -extproc
$ []
「intr」のところに表示されるものが「^C」, 「quit」のところに表示されるものが「^\」に相当するキー。 「kill」は、1行削除の意味。

◆kill コマンドによるプロセスの強制終了

^C^\ で死なないプロセス を殺すには、kill コマンドを使う。

これには、普通、別の端末を使う。 ssh で遠隔ログインしている時は、端末プログラムで、もう1枚ウィンドウを開き、 同じホストに遠隔ログインする。 ps コマンドで PID を調べ、kill コマンドに与える。

$ ps  [←]
(pidを調べる)
$ kill pid [←]
$ []
kill コマンドでは、引数で与えれたプロセス識別子pidのプロセスを殺す。 他人のプロセスは、権限がないので殺せない。

注意:pid には、プロセス識別子となる番号を入れる。「p」、 「i」「d」と3文字打つのではない。たとえば、PID が 1023 のプロセスを殺す 時には、次のように打つ。

$ kill 1023 [←]

◆kill -KILL

単純な kill コマンドでは死なないプロセスの場合、 -KILLをつけてkillコマンドを実行する。
$ kill -KILL pid [←]
-KILL 以外にも、様々な種類がある。詳しくは、man kill を参照。

■プロセス関連のコマンドのまとめ

ps			プロセスの一覧の表示
ps x			プロセスの一覧の表示
ps ax			プロセスの一覧の表示
stty -a			端末の状態(キーの割り当て)の表示
^C (キーボード)		プロセスを殺す
kill PID		プロセスを殺す
kill -KILL PID		プロセスを殺す(必殺)
PID はプロセス識別子。PIDと打つのではない。

■シェルと標準入出力

シェル(shell) は、次のようなプログラムである。 コマンド・インタプリタともいう。

◆プログラムの入出力

入力
プログラムが実行する時に受け取るデータ。 (引数、オプションに加えて)ファイルからも受け取れる。
出力
プログラムの実行結果
シェルの機能として、画面を出力をファイルに保存したり、キーボードの代わ りにファイルに保存されたデータを与えたりできる。

◆標準入出力

Unix では、端末でシェルから実行されるプログラムは次の3種類の入力と出力をあてにしている。
標準入力 (stdin, standard input, 0番)
普通、キーボードにつながっている。
標準出力 (stdout, standard output, 1番)
普通、画面につながっている。
標準エラー出力 (stderr, standard error output, 2番)
普通、画面につながっている。

キーボード、標準入力、プログラム、標準出力、標準エラー出力、画面
図? プログラムの標準入出力の普通の接続先

◆標準入力がキーボードによるコマンドの実行と^D

cat コマンドは、ファイル名を与えないと、標準入力(キーボード)からデータ を読む。
$ cat [←]
Line 1[←]
Line 1
Line 2[←]
Line 2
Line 3[←]
Line 3
^D
$ []
cat コマンドは、入力しているファイルが終わりになる(EOF, end of file)と、 自動的に終了する。キーボードからの入力は、無限に継続可能だが、 ^D (Control + D) と打つと、普通のファイルと同様に、ファイルの終 わりという意味になる。

cat コマンドは、「-n」オプションを付けると行番号を付加する。

$ cat -n [←]
Line 1[←]
     1	Line 1
Line 2[←]
     2	Line 2
Line 3[←]
     3	Line 3
^D
$ []

◆標準出力の切り替え(redirection リダイレクション)

端末でシェルから実行されるプログラムは、何もしないと画面に結果が表示さ れる。
$ ls -l [←]
合計 50
drwx------ 20 yas  510  31  4月  6 16:29 Maildir
drwxr-xr-x 13 yas prof  13  3月 31 10:20 WinFiles
drwxr-xr-x  2 yas prof  10  4月 10 14:42 bin
drwxr-xr-x 88 yas  510  97  4月 17 16:38 coins
drwxr-xr-x 15 yas  510  17  4月 12 16:50 cs
drwxr-xr-x  4 yas  510 103  4月 10 21:47 dot
drwxr-xr-x  3 yas prof   3  4月  7 10:02 etc
drwxr-xr-x  4 yas  510   4  3月  7  2014 lib
lrwxrwxrwx  1 yas  510  14  7月 18  2022 os2 -> coins/os2-2016
drwxr-xr-x 19 yas  510  76  3月 24 10:07 public_html
drwx------  3 yas prof   3  3月 24 17:24 snap
lrwxrwxrwx  1 yas  510  12  4月 11  2014 syspro -> coins/syspro
drwxr-xr-t  2 yas prof   2  3月 29 23:08 thinclient_drives
drwxr-xr-x  3 yas prof  15  4月 13 21:33 tmp
<省略>
$ []
シェルは、「記号>」 があると、標準出力を画面から指定されたファ イルに切り替えて、指定されたプログラムを実行する。 プログラムの結果は、ファイルに保存され、画面には何も表示されない。
$ ls -l > file1 [←]
$ []

キーボード、標準入力、プログラム、標準出力、ファイル、標準エラー出力、画面
図? プログラムの標準出力のファイルへの切替え

保存した結果は、cat コマンドや head コマンドで表示できる。 headコマンド は、ファイルや標準入力の先頭を表示する ためのコマンド。-n (nは数)というオプションが与 えられると、先頭の n 行だけ表示する。
$ head -5 file1 [←]
合計 50
drwx------ 20 yas  510  31  4月  6 16:29 Maildir
drwxr-xr-x 13 yas prof  13  3月 31 10:20 WinFiles
drwxr-xr-x  2 yas prof  10  4月 10 14:42 bin
drwxr-xr-x 88 yas  510  97  4月 17 16:38 coins
$ []

◆標準入力の切り替え

head コマンドや cat コマンドは、ファイル名を与えないと、標準入力(キー ボード)からデータを読む。
$ head -5 [←]
Line 1[←]
Line 1
Line 2[←]
Line 2
Line 3[←]
Line 3
Line 4[←]
Line 4
Line 5[←]
Line 5
$ []

シェルは、「記号<」 があると、標準入力をキーボードから指定され たファイルに切り替え、指定されたプログラムを実行する。

$ head -5 < file1 [←]
合計 50
drwx------ 20 yas  510  31  4月  6 16:29 Maildir
drwxr-xr-x 13 yas prof  13  3月 31 10:20 WinFiles
drwxr-xr-x  2 yas prof  10  4月 10 14:42 bin
drwxr-xr-x 88 yas  510  97  4月 17 16:38 coins
$ []

ファイル、標準入力、プログラム、標準出力、標準エラー出力、画面
図? プログラムの標準入力のファイルへの切替え

上の例では、コマンドはファイルを開くことはしない。 シェルが開いたファイルやキーボードをそのまま使う。

以下の例では、画面の表示は同じだが、動作が異なる。 以下の例では、head コマンドが自分でファイルを開いている。

$ head -5 file1 [←]
合計 54
drwx------ 20 yas  510  31  4月  6 16:29 Maildir
drwxr-xr-x 13 yas prof  13  3月 31 10:20 WinFiles
drwxr-xr-x  2 yas prof  10  4月 10 14:42 bin
drwxr-xr-x 88 yas  510  97  4月 17 16:38 coins
$ []

◆パイプ

シェルは、「記号|」があると、次の動作を行う (パイプ(pipe)機能)。 例:
$ ls -l | head -5 [←]
合計 54
drwx------ 20 yas  510   31  4月  6 16:29 Maildir
drwxr-xr-x 13 yas prof   13  3月 31 10:20 WinFiles
drwxr-xr-x  2 yas prof   10  4月 10 14:42 bin
drwxr-xr-x 88 yas  510   97  4月 17 16:38 coins
$ []

ファイル、標準入力、プログラム、標準出力、パイプ、標準エラー出力、画面、パイプ、標準入力、次のプロセス
図? プログラムの標準出力のパイプへの切替え

ファイルを介しても類似の操作は可能だが、後で不要なファイルを消さなけれ ばならない。
$ ls -l > tempfile [←]
$ head -5 < tempfile [←]
合計 55
drwx------ 20 yas  510   31  4月  6 16:29 Maildir
drwxr-xr-x 13 yas prof   13  3月 31 10:20 WinFiles
drwxr-xr-x  2 yas prof   10  4月 10 14:42 bin
drwxr-xr-x 88 yas  510   97  4月 17 16:38 coins
$ rm tempfile [←]
$ []
パイプは、3つ以上のプログラム(プロセス)を結びつけることもできる。
$ ls -l | cat -n | head -5 [←]
     1	合計 54
     2	drwx------ 20 yas  510   31  4月  6 16:29 Maildir
     3	drwxr-xr-x 13 yas prof   13  3月 31 10:20 WinFiles
     4	drwxr-xr-x  2 yas prof   10  4月 10 14:42 bin
     5	drwxr-xr-x 88 yas  510   97  4月 17 16:38 coins
$ []

◆標準エラーの役割と切り替え

標準出力の切り替えを行ったとしても、標準エラーは画面に表示される。
$ ls -l Maildi > file1 [←]
ls: 'Maildi' にアクセスできません: そのようなファイルやディレクトリはありません
$ cat file1 [←]
$ []
Maildi」 は、「public_html」の打ち間違い(rがない)である。 ls コマンドは、エラー・メッセージを標準出力ではなく標準エラー出力に書き 出す。

2>file」をつかうと、標準エラー出力をファイルに保存 することもできる。

$ ls -l Maildi > file1 2> file2 [←]
$ cat file1 [←]
$ cat file2 [←]
ls: 'Maildi' にアクセスできません: そのようなファイルやディレクトリはありません
$ []
2>&1」をつかうと、標準エラー出力(2)を、標準出力 (1)に混ぜて(&)、ファイルに保存することもできる。
$ ls -l Maildi > file1 2>&1 [←]
$ cat file1 [←]
ls: 'Maildi' にアクセスできません: そのようなファイルやディレクトリはありません
$ []
2>&1」は、順番が大事。ファイルに混ぜて保存する場合 は、「>file」の後にやること。先にやると、その時点で の標準出力(画面)が指定されてしまう。
$ ls -l Maildi 2>&1 > file1 [←]
ls: 'Maildi' にアクセスできません: そのようなファイルやディレクトリはありません
$ cat file1 [←]
$ []
2>&1を使うと、エラー・メッセージも含めてパイプに出力 することもできる。この場合は、パイプ|より左に書く。 (理由は、「プログラム言語処理」の授業を受けると分かる。)
$ ls -ld Maildi  2>&1  | cat -n [←]
     1	ls: 'Maildi' にアクセスできません: そのようなファイルやディレクトリはありません
$ []

◆ファイルの追記

標準出力では、ファイルを追加することができる。
>file
ファイルがなければ、まず空のファイルを作成する。ファイルがあれば、 file の内容を消して空にする。
>>file
ファイルが存在しても、消さずにその後ろに追加する。
例: echo コマンドを 2 回実行して、2行のファイルを作成する。
$ echo hello [←]
hello
$ echo hi [←]
hi
$ echo hello > hello.txt [←]
$ cat hello.txt [←]
hello
$ echo hi > hello.txt [←]
$ cat hello.txt [←]
hi
$ echo hello > hello.txt [←]
$ cat hello.txt [←]
hello
$ echo hi >> hello.txt [←]
$ cat hello.txt [←]
hello
hi
$ []

■ファイルの属性

ls コマンドに -l (long) オプションをつけると、 ファイルやディレクトリだけでなく、いくつかの属性も合わせて表示される。
$ ls [←]
Maildir   cs	 lib	      syspro		 ダウンロード  ビデオ
WinFiles  dot	 os2	      thinclient_drives  テンプレート  ピクチャ
bin	  etc	 public_html  tmp		 デスクトップ  ミュージック
coins	  file1  snap	      vmware		 ドキュメント  公開
$ ls -l [←]
合計 54
drwx------ 20 yas prof   31  4月  6 16:29 Maildir
drwxr-xr-x 13 yas prof   13  3月 31 10:20 WinFiles
drwxr-xr-x  2 yas prof   10  4月 10 14:42 bin
drwxr-xr-x 88 yas prof   97  4月 17 17:11 coins
drwxr-xr-x 15 yas prof   17  4月 12 16:50 cs
drwxr-xr-x  4 yas prof  103  4月 10 21:47 dot
drwxr-xr-x  3 yas prof    3  4月  7 10:02 etc
-rw-r--r--  1 yas prof 1282  4月 17 16:50 file1
drwxr-xr-x  4 yas prof    4  3月  7  2014 lib
lrwxrwxrwx  1 yas prof   14  4月 17 17:11 os2 -> coins/os2-2016
drwxr-xr-x 19 yas prof   76  3月 24 10:07 public_html
drwx------  3 yas prof    3  3月 24 17:24 snap
lrwxrwxrwx  1 yas prof   12  4月 17 17:09 syspro -> coins/syspro
drwxr-xr-t  2 yas prof    2  3月 29 23:08 thinclient_drives
drwxr-xr-x  3 yas prof   15  4月 13 21:33 tmp
drwxr-xr-x  6 yas prof    8  1月  4  2019 vmware
drwxr-xr-x  2 yas prof    2  3月 29 23:08 ダウンロード
drwxr-xr-x  2 yas prof    2  3月 29 23:08 テンプレート
drwxr-xr-x  2 yas prof    2  3月 29 23:08 デスクトップ
drwxr-xr-x  2 yas prof    2  3月 29 23:08 ドキュメント
drwxr-xr-x  2 yas prof    2  3月 29 23:08 ビデオ
drwxr-xr-x  2 yas prof    2  3月 29 23:08 ピクチャ
drwxr-xr-x  2 yas prof    2  3月 29 23:08 ミュージック
drwxr-xr-x  2 yas prof    2  3月 29 23:08 公開
$ []

ファイルの型

ls -l の一番左1文字は、ファイルの型(type)を表わす。
-
ファイル
d
ディレクトリ
l
シンボリック・リンク

ファイルの型とファイルへのアクセス(読み書き)の可否を決めるための属性

許可されたアクセス方法(モード)

ls -l で、ファイルの型の次の 9 文字は、許可されたアクセス方法を示す文字。 モード(mode)とも言う。 9文字は、3文字の固まりが3組ある。

ファイルのモードの例、所有者、グループ、その他、110,100,100、rw-r--r--
ファイルのモードの例

各3文字はアクセス毎にその許可・拒否を表す。

r	読込み可
w	書込み可
x	実行可(ディレクトリの場合は探索可)
モードで該当する部分が「-」の場合は、その種類のアクセスが許可さ れてないことを意味する。

「読込み可」とは、その内容を参照できること意味する。たとえば、cp コマン ドでコピーできる。読出し可能なディレクトリなら、ls コマンドでそのディレ クトリ中のファイル名の一覧を表示できる。

「書込み可」とは、その内容を変更することができることを意味する。たとえ ば、テキスト・ファイルなら、エディタで修正したものを書き込むことができ る。書込み可能なディレクトリなら、mv コマンドでそのディレクトリのなかに あるファイル名前を変更できる。

「実行可」というのは、ファイルの内容がプログラムの場合は、 そのプログラムを実行することができる。

ディレクトリに対する 「検索可」というのは、その下にあるファイルやディレクトリを たどっていける(ファイルを開く(読み書きのため)、cd (change directory)できる)という意味である。

ディレクトリが「読込み可」でも、「検索可」でないと、 ディレクトリに「読込み可」のファイルがあっても、 ディレクトリに入ってファイルを読むことができない。 逆に、「検索可」でも、ディレクトリが「読込み可」でないと、 ディレクトリにあるファイル名やディレクトリ名を表示させることが できない。

そのディレクトリにあるファイル名を知っていて、そのファイルが「読み込み 可」なら読むことがでる。

アクセスするユーザによって異なったアクセスの許可・拒否がしたいことがあ る。そのために、rwxの指定は、ファイルの所有者、ファイルの属すグループ、 それ以外の人用に3セット用意されている。

例:モードが「rw-r--r--」のファイル

まとめると、「誰でも読めるが所有者しか書けない」。

9文字は、9ビットの整数で、表記する時は、2進法というよりは、8進法を使う。 モード「rw-r--r--」は、2進数なら「110100100」で、8進数な ら「644」。

■アクセス制御

アクセス制御(access control) とは、「主体」が、「オブジェクト」を「操作」する時、どんな操作なら正し いということを定義して、それがきちんと守られていることをということを保 証することである。

図? アクセス制御における主体、オブジェクト、および、操作
図? アクセス制御における主体、オブジェクト、および、操作

Unixでは、アクセス制御の主体は、 プロセス である。 プロセスとは、コンピュータの中で実行中のプログラムのことである。 (プログラムでも、ハードディスクに保存されているものはプロセスではない。) プロセスは、利用者と対応しているので、 アクセス制御では、利用者ごとに許されたアクセスの方法を考えれば良い。

アクセス制御のオブジェクトは、ファイル、または、プロセスである。 操作には、次のようなものがある。

◆ユーザとグループ

Unix (macOS, Linux含む), Windows では、ユーザ(個人)とグルー プを識別したアクセス制御を行うことができる。 オペレーティング・システムごとに、ユーザやそのグループの考え方は、基本 的には似ているが、細かい所で異なる。

図? 実世界のユーザとUNIX中のプロセス・ファイル
図? 実世界のユーザとUNIX中のプロセス・ファイル

◆ユーザ

ユーザ(user, 利用者)とは、Unixの外では、個人(人間)。 Unixの内部では、次のどれかで表現する。
ユーザ名(user name)
文字列
UID(user ID, user identifier)
16ビット-32ビットの整数

Unixでは、全てのファイルやプロセスは、あるユーザの所有物である。 ファイルとプロセスには、UID が付加されている。

◆グループ

グループ(group)とは、Unixの外の世界では、計算機を使う人間の集合。 Unixの内部では、次のどれかで表現する。
グループ名(group name)
文字列
GID(Group ID, group identifier)
16ビット-32ビットの整数

1人のユーザが複数のグループに属することができる。

◆ファイルの属性

ファイルは、属性(ls -l で表示)として、UID と GID を1つずつ持つ。 ファイルの所有者となる個人は、1人。 ファイルが属するグループも1つ。

◆プロセスの属性

プロセスは、UID (1個) と GID を複数個持つ。

◆プロセスのユーザ名とグループ名を調べる

プロセスの所有者のユーザ名を表示するには whoamiコマンドを用いる。
$ whoami [←]
yas
$ []
この例では、この人(のプロセス)のユーザ名は、yas

プロセスが属しているグループのグループ名を調べるには、 groupsコマンドを用いる。

$ groups [←]
prof c-admin c-spec tebiki c-gakusei c-comp coins-2019 coins-2023
$ []
この例では、この人(のプロセス)は、 prof, c-admin, c-spec, tebiki, c-gakusei, c-comp, coins-2019, coins-2023 という8つのグループに属している。

idコマンドも使える。

$ id [←]
uid=1013(yas) gid=5510(prof) groups=5510(prof),5020(c-admin),5065(c-spec),5150(t
ebiki),5180(c-gakusei),6000(c-comp),6019(coins-2019),6023(coins-2023)
$ []

◆ファイルの UID・GID 属性を調べる

ファイルの UID 属性(所有者属性)と GID 属性を調べるには、 ls -l (ファイルの場合), ls -ld (ディレクトリの場合) を用いる。
$ ls -l .bashrc [←]
-rw-r--r-- 1 yas prof 180  3月  8  2019 .bashrc
$ ls -ld ~ [←]
drwxr-xr-x 35 yas prof 91  4月 17 17:11 /home/prof/yas
$ []
この例では、UID 属性が yas、GID 属性が prof である。

◆ファイルに対するアクセス制御

Unixでは、ファイルの「内容」のアクセス制御を次の3段階で行う。
ユーザ
ファイルのUID(所有者)が、プロセスのUIDと同じ
グループ
ファイルのGIDが、プロセスのGIDのリストのどれかと同じ
その他
上の2つに当てはまらない時
これをつかって、モード属性の下位9ビットのうち、どの3ビットを使うかを 決める。そして、そのビットが1になっていれば、その操作が許される。

ファイルの「内容」のアクセス3段階であるが、ファイルの「属性」次の2段 階である。

ユーザ
ファイルのUID(所有者)が、プロセスのUIDと同じ
それ以外
ファイルのUID(所有者)が、プロセスのUIDと異なる
ユーザの権限では、ファイルの属性(モード、グループ、時刻)を変更する ことができる。それ以外の権 限では、属性を読み出すことはできるが、変更は一切できない。 つまり、ファイルの内容がアクセスできなくても、ls -l で 属性を調べることはできる。

◆ディレクトリのxの働き

ディレクトリのモードで x は、そのディレクトリの内容を検索できることを意 味する。ディレクトリの x を落すことで、それ以下の部分木全体のアクセスを 禁止することができる。

(ホームディレクトリ以下の)ディレクトリの x を使ったファイルへの読み込み アクセスの許可と禁止。

図? /home/user2/public_html/index.html と /home/user2/Maildir/mail1
図? ディレクトリのxの働き

ファイル /home/user2/public_html/index.html を読むには、次のディレクト リとファイルのモードが必要になる。パスの途中で x が1つでも途絶えると、アクセ スできなくなる。
  1. / の x
  2. home の x
  3. user2 の x
  4. public_html の x
  5. index.html の r
ファイル /home/user2/Maildir/mail1 を読むには、次のディレクト リとファイルのモードが必要になる。パスの途中で x が1つでも途絶えると、アクセ スできなくなる。
  1. / の x
  2. home の x
  3. user2 の x
  4. Maildir の x
  5. mail1 の r

◆プロセスに対するアクセス制御

プロセスのアクセス制御は、次の2段階で行なう。
同一ユーザ
操作対象のプロセスが、操作するプロセスのUIDと一致している。
それ以外
操作対象のプロセスが、操作するプロセスのUIDと一致していない。
プロセスの操作としては、シグナルを送ることができるかどうか (kill() システムコール) と、デバッガで デバッグすることができるとか(ptrace() システムコール)、トレースを調べることができるかなどが ある。それらの操作は、同一ユーザの場合 許され、そうではない場合は、許されない。

◆スーパー・ユーザ

どのようなアクセスも可能な無敵のユーザ。

スーパー・ユーザ(super user) は、UID が 0 。 特権ユーザ(privileged user)ルート(root)su (su コマンド、あるいは super user の略)ともよばれる。 スーパーユーザのユーザ名は、慣例として root という文字列が使われる。

ファイルのバックアップなど、システム管理の作業には スーパー・ユーザの仕組みが必要になる。

ファイルの UID・GID 属性を変更する

ファイルの UID 属性(所有者属性)を変更するには、chown コマ ンドを用いる。ただし、スーパーユーザの権限が必要である。

ファイルをコピーして、元ファイルを消すことはできる。

ファイルの GID 属性を変更するには、chgrp コマンドを使う。 一般ユーザは、自分が属しているグループにのみ変更できる。 任意のグループに変更するには、スーパー・ユーザの権限が必要である。

◆ユーザ名とUID、グループ名とGIDの対応、属性の伝播

■ファイルのモードの変更

◆chmod コマンド

chmodコマンドは、ファイルのモード属性を変更するためのコマンド。
$ ls -l file1.txt [←]
-rw-r--r-- 1 yas prof 1282  4月 17 16:50 file1.txt
$ chmod go-r file1.txt [←]
$ ls -l file1.txt [←]
-rw------- 1 yas prof 1282  4月 17 16:50 file1.txt
$ []
file1.txt に対して、グループ(g)とそれ以外の人(o)に対して「読込み可」の許可を 取り除いている。

chmodは一般的には次の形式で実行する。

$ chmod set file1 file2 ... [←]
set の形式
[ugoa][=+-][rwx]
ここの[ugoa]は、誰に対するアクセスの設定を変更するかを対象となる人を以 下の表から選んで並べる(複数可)。
文字 単語 意味
u user ユーザ(利用者,所有者)
g group グループ
o others その他
a all 全員、ugo と同じ
(空) umaskを除く全員
[=+-]の意味
文字 意味
+ 許可を追加する
- 許可を除く
= 指定した許可だけとする
[rwxXst]の部分には次のような指定が可能。
文字 単語 意味
r read 読込み可
w write 書込み可
x execute 実行可
X execute 実行可(所有者に対して「実行可」がある時だけ)
setには[ugoa][=+-][rwx]の指定を「u=rw,og=r」のように「,」で区 切って複数並べることもできる。 setには、8進数を使うこともできる。 練習問題 8進数を利用したchmodコマンド 参照。

chmod には、-R (recursive)オプションがある。 これは、ディレクトリをたぐり全部変更することを意味する。

◆モードの実例

rw-r--r--
誰かでも読めるファイル
rwxr-xr-x
誰かでも読めるアクセスできるディレクトリ。 xもたてる。 (たてる==ビットを1にする。)
rwxr-xr-x
実行可能ファイル
rwx------
電子メール( Maildir, Mail )、 デスクトップ( Desktop )、 ダウンロード( Downloads )、 ライブラリ( Library )、 書類( Documents )等、 他人には見せないファイルを保存するための ディレクトリのモード。
rw-r--r--
WWWページ用のファイル (~/public_html以下のファイル)
rwxr-xr-x
WWWページ用のディレクトリ (public_html以下のディレクトリ)
rwxr-xr-x または rwx--x--x
WWWページを作成する時のホーム・ディレクトリ (~~/public_html の親ディレクトリ)。 x ビットを出す。
rw-rw-r-- または rwxrwxr-x
グループで共同作業するような時には、グループに属する人には書き込みを許す。
r-xr-xr-x, r-x------
読み込み専用のディレクトリ。 その下のファイルを削除することができない。

■シェル変数と環境変数

■変数とは

変数(variable)
何かを覚えるためのもの。メモリを抽象化して名前をつけたもの。
変数名(variable name)
変数を区別するための名前
変数の値(value)
変数が覚えているもの
変数の値を参照(reference)
変数の値を取り出すこと
変数に値を代入(assignment)
変数名で変数を指定して、その値を変更する。変数に値をセットする。

◆シェル変数と環境変数の違い

シェルでは、2種類の変数を使える。
シェル変数
1つのシェル内でのみ有効。
環境変数
実行されるプログラム(子プロセス)に引き継がれる。

◆echo コマンドの復習

echo コマンドは、引数をそのまま画面(標準出力)に出力するコマンド。
$ echo hello [←]
hello
$ echo hi [←]
hi
$ echo /usr/bin/*z [←]
/usr/bin/7z /usr/bin/unxz /usr/bin/xz
$ echo /usr/bin/7z /usr/bin/unxz /usr/bin/xz [←]
/usr/bin/7z /usr/bin/unxz /usr/bin/xz
$ []

◆シェル変数の操作

シェル変数へ代入するには、「変数名=」を使う。
$ X=100 [←]
$ []
参照するには、「$変数名」とする。
$ X=100 [←]
$ echo $X [←]
100
$ []
他の変数と紛らわしい時には、 「"$変数名"」のようにダブルクォートで括るとよい。
$ echo x"$X"x [←]
x100x
$ []
(注意: $Xx と $X は別の変数なので区別できるようにする。) あるいは、${変数名}のように、 括弧で括る方法もある。
$ echo x${X}x [←]
x100x
$ []

シェル変数を削除するには、unset コマンドを使う。

$ unset X [←]
$ echo $X [←]

$ echo x"$X"x [←]
xx
$ []
設定されていないシェル変数を使おうとすると、空として扱われる。 注意:シェルのプロンプト($ ) と間違えないこと。シェルのプロンプ ト($ ) は、実際のコンピュータでは、 yas@azalea16:~$ のようになっている。

◆シェル変数を何に使うか(シェル)

シェルの動作を変更する。例。
PS1
プロンプト
azalea16:~ yas$ echo $PS1[←]
\h:\W \u\$
azalea16:~ yas$ PS1='hi$ '[←]
hi$ ls
Maildir		  dot	       lily-netstat	syspro		   デスクトップ
WinFiles	  etc	       literacy-a4.txt	syspro-url	   ドキュメント
bin		  expressions  literacy-a5.txt	thinclient_drives  ビデオ
cal-2023-05.txt   file1        os2		tmp		   ピクチャ
cal-2023-567.txt  file2        passwd		vmware		   ミュージック
coins		  hello.txt    public_html	ダウンロード	   公開
cs		  lib	       snap		テンプレート
hi$ []
くわしくは man bash を参照。

◆シェル変数を何に使うか(独自)

重複した入力を避けて、楽をするために使う。
$ coins=coins.tsukuba.ac.jp [←]
$ ssh www.$coins [←]
$ ssh azalea10.$coins [←]

◆環境変数の代入

bash では、シェル変数の変数名を export コマンドに与えることで、 そのシェル変数を環境変数に変える。
$ X=100 [←]
...
$ export X [←]
$ []
あるいは、最初から export を付けて代入の操作をすることもできる。
$ export X=100 [←]
$ []
bash では、環境変数の参照方法と削除方法はシェル変数と同じ($とunset)である。

◆環境変数の利用方法(TZ)

シェルがプログラムを実行する時、シェル変数は、プログラムへ引き渡されな いが、環境変数は、渡される。環境変数は、プログラムの動作を変更するため に用いる。 以下の例では、環境変数 TZ を設定して、date コマンドと ls コ マンドの動きを変えている。
$ date [←]
2023年  5月  9日 火曜日 18:48:46 JST
$ echo $TZ [←]

$ ls -l file1 [←]
-rw-r--r-- 1 yas prof 0  5月  9 17:05 file1
$ TZ=EST [←]
$ echo $TZ [←]
EST
$ export TZ [←]
$ date [←]
2023年  5月  9日 火曜日 04:49:32 EST
$ ls -l file1 [←]
-rw-r--r-- 1 yas prof 0  5月  9 03:05 file1
$ []
Linux の date コマンドマニュアルには、ちゃんとは記載されていない。
$ man date [←]
DATE(1)                          User Commands                         DATE(1)

NAME
       date - print or set the system date and time

SYNOPSIS
       date [OPTION]... [+FORMAT]
       date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]

DESCRIPTION
       Display the current time in the given FORMAT, or set the system date.

       Mandatory  arguments  to  long  options are mandatory for short options
       too.

...
       -u, --utc, --universal
              print or set Coordinated Universal Time (UTC)
...
EXAMPLES
...
       Show the time on the west coast of the US (use tzselect(1) to find TZ)

              $ TZ='America/Los_Angeles' date
この 環境変数名=値 コマンド名 は、環境変数を設定してコマンドを 実行する方法の1つ。この方法では、元のシェルでは環境変数を変更しない。

環境変数 TZ の話は、man environ に出ている。この man ページには、他に も HOME, LANG, PATH 等、知っておくべき環境変数が多数記載されている。

$ man environ [←]
ENVIRON(7)                 Linux Programmer's Manual                ENVIRON(7)

NAME
       environ - user environment
...
       HOME   A user's login directory, set by login(1) from the password file
              passwd(5).

       LANG   The name of a locale to use for locale categories when not over‐
              ridden by LC_ALL or more specific environment variables such  as
              LC_COLLATE,  LC_CTYPE, LC_MESSAGES, LC_MONETARY, LC_NUMERIC, and
              LC_TIME (see locale(7) for further details of the LC_*  environ‐
              ment variables).

       PATH   The  sequence  of  directory  prefixes that sh(1) and many other
              programs apply in searching for a file known  by  an  incomplete
              pathname.   The  prefixes  are separated by ':'.  (Similarly one
              has CDPATH used by some shells to find the target  of  a  change
              directory  command, MANPATH used by man(1) to find manual pages,
              and so on)
...
       *  TZ and TZDIR give timezone information used by tzset(3) and  through
          that  by  functions  like  ctime(3),  localtime(3), mktime(3), strf‐
          time(3).  See also tzselect(8).
...

◆シェルのメタキャラクタ

シェルが解釈し、コマンドには渡されない文字。 < > | $ { } ( ) [ ] & ; ^ " * ? ~ ' ` 空白 タブ など。

コマンドの引数として渡したい時には、解釈を避ける(エスケープ(escape))た めの特殊な形式を使う。
形式 エスケープ対象 エスケープしないメタキャラクタ
\x \」の直後の一文字 なし (行末の「\」は継続行の意味)
'str' 「'」でくくられた文字列 「'」自身は入れられない。「\'」も効かない。
"str" 「"」でくくられた文字列 「$」, 「`」(バッククォート),「"」(ダブルクォート), 「\」,「!」
\は、ASCII 5c(16進)の文字。表示は、「\」か「¥」。

ダブルクォート "" の内部では、$ は解釈され、シェル変数や 環境変数の置き換えられる。シングルクォート 「''」では、$ は解釈さない。

$ echo $HOME [←]
/home/prof/yas
$ echo "$HOME" [←]
/home/prof/yas
$ echo '$HOME' [←]
$HOME
$ echo \$HOME [←]
$HOME
$ []

◆環境変数PATH

環境変数PATHは、コマンドが存在するディレクトリを保持している環境変数である。
$ echo $PATH [←]
/home/prof/yas/bin:/usr/local3/coins/linux/bin:/usr/local3/coins/common/bin:/opt
/intel/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/gam
es:/usr/local/games:/snap/bin:/home/prof/yas/bin
$ printenv PATH [←]
/home/prof/yas/bin:/usr/local3/coins/linux/bin:/usr/local3/coins/common/bin:/opt
/intel/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/gam
es:/usr/local/games:/snap/bin:/home/prof/yas/bin
$ []
シェルは、打ち込まれたコマンドを環境変数 PATH の中から探して実行する。 たとえば、ls と打ち込まれると、/usr/bin にある /usr/bin/ls を実行する。

複数のコマンドがみつかれば、PATHの先に見つかったものを実行する。 どのコマンドが実行されるかを確認するには、which コマンドを使う。

$ ls -l /usr/bin/ls /bin/ls [←]
-rwxr-xr-x 1 root root 138208  2月  8  2022 /bin/ls
-rwxr-xr-x 1 root root 138208  2月  8  2022 /usr/bin/ls
$ which ls [←]
/usr/bin/ls
$ []

■コマンド行の編集機能とヒストリ機能

◆historyコマンド

history コマンドは、過去に打ち込んだコマンドの一覧を表示するコマンドである。
$ history [←]
    1  saykotoeri2 
    2  saykotoeri2 
    3  fg
    4  dup
<中略>
  500  history
$ []
シェル変数 HISTFILESIZE の個数だけ記憶している。
$ echo $HISTFILESIZE [←]
500
$ []

◆bashのコマンド行の編集機能

bash には、Emacs に似せて、コマンド行の編集機能がある。

◆「!」と「^」

bash には、過去に打ち込んだコマンドを記憶して再現する機能がある。 bash では、コマンド行の編集機能があるので使わなくてもよいが、次の ことは理解しておく必要がある。

◆利用

bash では、 コマンド行の編集機能 で、ヒストリをさかのぼって編集して利用できる。 その他に、次のような方法もある。bash では、ほとんど使われない。 編集機能がないシェルでは有効であった。
!!
直前のコマンドの再実行
!10
history で表示される 10番のコマンドの実行
!-2
現在からさかのぼって2個前のコマンドの実行。!-1 は、!! と同じ。
!str
先頭が str から始まるコマンドで、最も最新のもの。
!?str
文字列 str を含むコマンドで、最も最新のもの。
^old^new
直前のコマンドの old を new で置き換えたもの。打ち間違いの修正。
!*
直前のコマンドの引数(コマンド名以外)
利用例:
$ ls file.txt [←]
file.txt
         ここで -l を付けわすれたのに気がつく
$ ls -l !* [←]
ls -l file.txt
-rw-r--r--  1 yas  prof  9  4 29 21:23 file.txt
$ []

■シェル・スクリプト

(よく利用する)シェルに対するコマンドを、ファイルに保存して、(簡単に) 実行できるようにしたもの。簡単なプログラミングとも言える。

◆bash

Coins での標準のログインシェルは、bash。端末(iTerm, xterm, ktermなど)を 開いたり、ssh で遠隔ログインすると、ログインシェルが実行される。

bash (Bourne-Again SHell) は、sh (Bourne Shell)の機能を強化したもの。 シェル・スクリプトを書く時には、多くのシステムで備わっている /bin/sh を 使うことも多い。(/bin/sh はあるが /bin/bash がないシステムもある。)

◆シェル・スクリプトの作り方(1):基本

まず端末から実行してみる。

例:サイズが大きいファイルの上位 10 個を表示したい。 ls コマンドと sortコマンドheadコマンドを組み合わせる。

$ ls -l | sort -k 5 -nr | head [←]
-rw-r--r--  1 yas prof 19568  5月 11 16:53 kana.aiff
-rw-r--r--  1 yas prof 17406  6月 15  2018 exam-result.xlsx
-rwxr--r--  1 yas prof  9418  4月 18 11:07 lily-netstat
-rw-r--r--  1 yas prof   579  4月 19 17:57 cal-2023-567.txt
-rw-r--r--  1 yas prof   193  4月 19 17:53 cal-2023-05.txt
drwxr-xr-x  4 yas prof   103  5月  3 11:58 dot
drwxr-xr-x 88 yas prof    97  4月 17 17:11 coins
drwxr-xr-x 19 yas prof    76  3月 24 10:07 public_html
-rw-r--r--  1 yas prof    46  4月 19 18:44 syspro-url
-rw-------  1 yas prof    36  4月 19 18:11 literacy-a5.txt
$ []
echo コマンド、 historyコマンド あるいは、コピー&ペースト機能を用いて 端末から打ち込んだものを結果をファイルに保存する。以下の例では、echo コ マンドを使ってファイルを作成している。
$ []
(^p で1行もどす。)
$ ls -l | sort -k 5 -nr | head [←]
(^a で、行頭に移動して 「echo '」と打ち、^e して
「' > ls-size」 と打つ)
$ echo 'ls -l | sort -k 5 -nr | head' > ls-size10 [←]
$ cat ls-size10 [←]
ls -l | sort -k 5 -nr | head
$ ls -l ls-size10 [←]
-rw-r--r--  1 yas  prof  29  6 15 14:38 ls-size10
$ bash ls-size10 [←]
-rw-r--r--  1 yas prof 19568  5月 11 16:53 kana.aiff
-rw-r--r--  1 yas prof 17406  6月 15  2018 exam-result.xlsx
-rwxr--r--  1 yas prof  9418  4月 18 11:07 lily-netstat
-rw-r--r--  1 yas prof   579  4月 19 17:57 cal-2023-567.txt
-rw-r--r--  1 yas prof   193  4月 19 17:53 cal-2023-05.txt
drwxr-xr-x  4 yas prof   103  5月  3 11:58 dot
drwxr-xr-x 88 yas prof    97  4月 17 17:11 coins
drwxr-xr-x 19 yas prof    76  3月 24 10:07 public_html
-rw-r--r--  1 yas prof    46  4月 19 18:44 syspro-url
-rw-------  1 yas prof    36  4月 19 18:11 literacy-a5.txt
$ []

◆シェル・スクリプトの作り方(2):「#!」とchmod +x

シェル・スクリプトを実行する度にいちいち「bash 」と打つのは煩わ しいことがある。その場合は、次のようにする。

1行目にテキスト・エディタで「#!/bin/bash」を書き加える。

$ emacs ls-size10 [←]
(1行目に「#!/bin/bash [←]」と書き加える。)
$ cat ls-size10 [←]
#!/bin/bash
ls -l | sort -k 5 -nr | head
$ []
chmod +x で実行可能属性を付ける
$ ls -l ls-size10 [←]
-rw-r--r--  1 yas  prof  41  6 15 14:41 ls-size10
$ chmod +x ls-size10 [←]
$ ls -l ls-size10 [←]
-rwxr-xr-x  1 yas  prof  41  6 15 14:41 ls-size10
$ []
ファイル名を指定すると、実行することができる。ファイル名としては、明示 的に相対パス名であることを示すために先頭に「./」を付けるか、ホー ムディレクトリにあるこを示すために「~/」を付ける(ホーム・ディレ クトリにあることを仮定している)。
$ ./ls-size10 [←]
-rw-r--r--  1 yas prof 19568  5月 11 16:53 kana.aiff
-rw-r--r--  1 yas prof 17406  6月 15  2018 exam-result.xlsx
-rwxr--r--  1 yas prof  9418  4月 18 11:07 lily-netstat
-rw-r--r--  1 yas prof   579  4月 19 17:57 cal-2023-567.txt
-rw-r--r--  1 yas prof   193  4月 19 17:53 cal-2023-05.txt
drwxr-xr-x  4 yas prof   103  5月  3 11:58 dot
drwxr-xr-x 88 yas prof    97  4月 17 17:11 coins
drwxr-xr-x 19 yas prof    76  3月 24 10:07 public_html
-rw-r--r--  1 yas prof    46  4月 19 18:44 syspro-url
-rw-------  1 yas prof    36  4月 19 18:11 literacy-a5.txt
$ ~/ls-size10 [←]
-rw-r--r--  1 yas prof 19568  5月 11 16:53 kana.aiff
-rw-r--r--  1 yas prof 17406  6月 15  2018 exam-result.xlsx
-rwxr--r--  1 yas prof  9418  4月 18 11:07 lily-netstat
-rw-r--r--  1 yas prof   579  4月 19 17:57 cal-2023-567.txt
-rw-r--r--  1 yas prof   193  4月 19 17:53 cal-2023-05.txt
drwxr-xr-x  4 yas prof   103  5月  3 11:58 dot
drwxr-xr-x 88 yas prof    97  4月 17 17:11 coins
drwxr-xr-x 19 yas prof    76  3月 24 10:07 public_html
-rw-r--r--  1 yas prof    46  4月 19 18:44 syspro-url
-rw-------  1 yas prof    36  4月 19 18:11 literacy-a5.txt
$ []

◆シェル・スクリプトの作り方(3):~/bin

完成したスクリプトを ~/bin に置くと、他のコマンド(ls, cp, emacs) 等と同じように実行することができる。
$ mkdir ~/bin [←]
(注意: mkdir は、1度だけ実行すればよい。)
$ ls-size10 [←]
-bash: ls-size10: command not found
$ mv ls-size10 ~/bin [←]
$ ls -l ~/bin/ls-size10 [←]
-rwxr-xr-x  1 yas  prof  41  6 15 14:41 /home/prof/yas/bin/ls-size10
$ ls-size10 [←]
-rw-r--r--  1 yas prof 19568  5月 11 16:53 kana.aiff
-rw-r--r--  1 yas prof 17406  6月 15  2018 exam-result.xlsx
-rwxr--r--  1 yas prof  9418  4月 18 11:07 lily-netstat
-rw-r--r--  1 yas prof   579  4月 19 17:57 cal-2023-567.txt
-rw-r--r--  1 yas prof   193  4月 19 17:53 cal-2023-05.txt
drwxr-xr-x  4 yas prof   103  5月  3 11:58 dot
drwxr-xr-x 88 yas prof    97  4月 17 17:11 coins
drwxr-xr-x 19 yas prof    76  3月 24 10:07 public_html
-rw-r--r--  1 yas prof    46  4月 19 18:44 syspro-url
-rw-------  1 yas prof    36  4月 19 18:11 literacy-a5.txt
$ []
ホームディレクトリにある「ls-size10」は、そのままファイル名を打 ち込んでも実行できない。mv コマンドで「~/bin/」に移動した後は、 「ls-size10」で実行可能になる。 (Coins では、標準で ~/bin が PATH に含まれている。)

◆シェル・スクリプトの作り方(4):引数

シェル・スクリプトを実行する時に、シェル・スクリプトに対して引数を与え ることができる。

ls-size10 では、カレント・ワーキング・ディレクトリ(.)だけ表示できる。他 のディレクトリを表示したい。また、上位 10 個ではなく、5 個、20 個と数を 変えたい。 シェル・スクリプトの名前を 「lss」 とする。

$ cd ~/bin [←]
$ ls -l ls-size10 [←]
-rwxr-xr-x  1 yas  prof  41  6 15 14:41 ls-size10
$ ls -l lss [←]
ls: lss: No such file or directory
$ cp ls-size10 lss [←]
$ ls -l lss [←]
-rwxr-xr-x  1 yas  prof  41  6 15 14:46 lss
$ emacs lss [←]
(修正)
$ cat lss [←]
#!/bin/bash
ls -l $2 | sort -k 5 -nr | head -$1
$ []
(cp の時点で x ビットは立っているので chmod +x は不要。)
ls-size10 で ls には引数はなかったが、lss では「$2」を与えている。「$2」 は、コマンドに与えられた引数のうち、2番目のものを意味している。また、 head には -$1 を与えている。

作成したシェルスクリプト「lss」を実行してみる。

$ cd [←]
$ pwd [←]
/home/prof/yas
$ lss 5 /usr/bin [←]
-rwxr-xr-x 1 root root    24879104  5月  1  2022 x86_64-linux-gnu-lto-dump-11
-rwxr-xr-x 1 root root    16130168 12月  1 17:52 snap
-rwxr-xr-x 1 root root    10280680  5月  4  2022 gdb
-rwxr-xr-x 1 root root     8379976  7月  6  2022 gtk4-encode-symbolic-svg
-rwxr-xr-x 1 root root     7004032  2月  9  2022 luahbtex
$ lss 3 /usr/sbin [←]
-rwxr-xr-x 1 root root   5412752  4月 27 16:07 ipp-usb
-rwxr-xr-x 1 root root   3397048  6月  4  2022 wpa_supplicant
-rwxr-xr-x 1 root root   3255560  6月  9  2022 NetworkManager
$ lss 10 . [←]
-rw-r--r--  1 yas prof 19568  5月 11 16:53 kana.aiff
-rw-r--r--  1 yas prof 17406  6月 15  2018 exam-result.xlsx
-rwxr--r--  1 yas prof  9418  4月 18 11:07 lily-netstat
-rw-r--r--  1 yas prof   579  4月 19 17:57 cal-2023-567.txt
-rw-r--r--  1 yas prof   193  4月 19 17:53 cal-2023-05.txt
drwxr-xr-x  4 yas prof   103  5月  3 11:58 dot
drwxr-xr-x 88 yas prof    97  4月 17 17:11 coins
drwxr-xr-x 19 yas prof    76  3月 24 10:07 public_html
-rw-r--r--  1 yas prof    46  4月 19 18:44 syspro-url
-rw-------  1 yas prof    36  4月 19 18:11 literacy-a5.txt
$ []

◆bashスクリプトの引数を参照するためのシェル変数

引数として a b c が与えられた時の実行例。
$ echo $# [←]
3
$ echo $1 $2 $3 [←]
a b c
$ shift [←]
$ echo $# [←]
2
$ echo $1 $2 $3 [←]
b c
$ []

◆bashのコメント

bash では、「#」を使ってコメントを書くことができる。bash は、 文字「#」移行、行末まで無視する。
$ echo a b # c d [←]
a b
$ # echo a b c [←]
$ []

◆bash のコマンドの置換え

bash では、コマンドの標準出力の結果を、別のコマンドの引数に使うことができる。
$ date +%A [←]
金曜日
$ echo Today is `date +%A` . [←]
Today is 金曜日 .
$ []
この例では、バッククォート(` `)で括った部分 が実行され、その結果を echo コマンドの引数に使っている。バッククォート (` `)の代わりに、「$(コマンド)」という形式も 使える。
$ echo Today is $(date +%A) . [←]
Today is 金曜日 .
$ []
コンピュータでは、クォート「'xxx'」とバッククォー ト「`xxx`」は違う。

バッククォートは、シェルスクリプトでもよくつかう。

$ tex=file1.tex [←]
$ basename file1.tex .tex [←]
file1
$ basename $tex .tex [←]
file1
$ base=`basename $tex .tex` [←]
$ echo $base [←]
file1
$ []

◆~/.bashrc

bash は、端末の中で新たに実行されたり(遠隔)ログインの時に新たに実行さ れると、~/.bashrc という名前のファイルにあるプログラムを自動的 に実行する。~/.bashrc では、次のようなことを行う。

◆~/.bashrcの編集は慎重に

~/.bashrc を編集したら、一度、端末プログラムがウィンドウを問題なく開けるか、確 認すると良い。

~/.bashrc に問題があり、ssh でログインできない(ログインしてもすぐにロ グアウトしてしまう)時や、端末プログラムがウィンドウを開かない(一瞬開い てすぐに閉じる)時には、次のような方法で修正する。

coins で標準の ~/.bashrc は次のようになっている。
$ cat /usr/local/lib/standard/bashrc-home [←]
#
# coins standard ~/.bashrc [←]
#
if [ -f /usr/local/lib/standard/bashrc ]; then
        . /usr/local/lib/standard/bashrc
fi

# add your own code below [←]
$ []

◆~/.bashrcの編集結果の反映

~/.bashrc を編集しても、現在実行中の bash には影響を与えない。

編集内容を有効にするには、次の方法がある。

◆~/.bashrcでのシェル変数の設定の例

シェル変数を使って短い表現を使う場合、 シェル変数の設定を恒久的なものにしたい。 それには、~/.bashrc に保存する。

以下の例は、ssh でよくアクセスするホストをシェル変数に登録している。

$ cat ~/.bashrc [←]
...
coins=coins.tsukuba.ac.jp
www=www.$coins
icho=icho01.u.tsukuba.ac.jp
...
$ []
これを使うと、ssh が簡単になる。
$ ssh $www [←]
$ ssh $icho [←]

◆~/bin

~/.bashrcなどを設定して、~/bin環境変数PATH に含まれ るようにすることを奨める。自分で作成したプログラムやシェル・スクリプトを ~/bin に置くと、ファイル名を指定しなくても (「~/ファイル名」や 「./ファイル」打たなくて)、 ~/bin以下の短いファイル名で実行できるようになる。

coins では、標準で ~/binPATH に含まるように設定されて いるので、各自設定する必要はない。

■bash alias (エイリアス)

◆正規表現(regular expression)

単純な検索。 正規表現の例:

^」、「.」、「*」、「$」 は、 メタキャラクタ。特別の意味を持つ。 メタキャラクタを含まない文字列も、正規表現として意味を持つ。

正規表現といっても、このようなメタキャラクタを使わず単純な文字列の検索で使うことも多い。

◆grepコマンド

grep は、引数で指定されたファイル、または、標準入力を検索 し、引数で指定された文字列が存在する行だけを表示するプログラムである。

以下の例は、ファイル「/etc/passwd」の中にある「root」とい う文字を含む行を表示している。

$ grep root /etc/passwd [←]
root:x:0:0:root:/root:/bin/bash
nm-openvpn:x:120:126:NetworkManager OpenVPN,,,:/var/lib/openvpn/chroot:/usr/sbin/nologin
$ []
同じことを、パイプを使っても実行することができる。
$ cat /etc/passwd | grep root [←]
root:x:0:0:root:/root:/bin/bash
nm-openvpn:x:120:126:NetworkManager OpenVPN,,,:/var/lib/openvpn/chroot:/usr/sbin/nologin
$ []
練習問題 grep

◆ps の結果を grep で探す

ps コマンドで大量の表示の中から特定のプログラムを見つけたい時には、 grep コマンドと組み合わせて用いると便利である。

次の例は、bash と macs のプロセスを探している。

$ ps [←]
    PID TTY          TIME CMD
  19795 pts/0    00:00:00 bash
  27126 pts/0    00:00:00 ps
$ ps  x [←]
    PID TTY      STAT   TIME COMMAND
  19648 ?        Ss     0:00 /lib/systemd/systemd --user
  19649 ?        S      0:00 (sd-pam)
<中略。大量の表示>
  26321 pts/1    Ss     0:00 -bash
  26374 pts/1    Sl+    0:00 emacs -nw
  27164 pts/0    R+     0:00 ps x
$ ps x | grep bash [←]
  19795 pts/0    Ss     0:00 -bash
  26321 pts/1    Ss     0:00 -bash
  27393 pts/0    S+     0:00 grep bash
$ ps x | grep emacs [←]
  26374 pts/1    Sl+    0:00 emacs -nw
$ []
練習問題 ps コマンドと grep コマンド 参照。 ps, grep の変わりに pgrep コマンドを使う 方法もある。

◆正規表現とファイル名置換

ファイル名置換 の代りに grep を使う方法がある。

次の例では、/usr/bin にある、rm から始まるファイル名を持つファイルを探して表示している。

$ cd /usr/bin [←]
$ ls rm* [←]
rm  rmdir
$ ls | grep '^rm' [←]
rm
rmdir
$ []

◆lv

lv コマンドは、less コマンドと同様に、表示しているファイルを検索する機 能がある。次のようなキーが使える。「パタン」では正規表現が使える。
キー 説明
/パタン 順方向検索
n 順方向検索次候補
/[←] 順方向検索次候補
?パタン 逆方向検索
?[←] 逆方向検索次候補
手引き 2.7.2 参照

◆正規表現の詳細

grep コマンド、egrep コマンド、Emacs での正規表現の使い方。

■ファイルの整理

◆ファイルとディレクトリの木構造を扱うプログラム

標準では単一のファイルやディレクトリを扱うコマンドも、 木構造 を扱うことができるものもある。 木構造をうまく扱うには、「再帰的な(recursively)」処理が重要になる。 これは、自分と同じ処理を、木構造の子供の節にも行うことである。 くわしくは、2年生の「データ構造とアルゴリズム」で扱う。

例:

再帰的な処理を行わせるためには、大文字 -R (recursively) オプションを取 るコマンドも多いが、小文字 -r のものもある。例: scp -r。 大文字でも小文字でもどちらでも受付けるものもある。

何もしないと、自動的に再帰的な処理を行うプログラムもある。例: tar, tree, find 等。

ディレクトリに対しても mv コマンドは有効である。ディレクトリの名前を mv で変更すると、木構造で考えると、それ以下のファイルの名前を全て変更し たことと同じ効果がある。

ファイルのコピーでは、 シンボリック・リンク等の問題があるため、 cp -r では不十分なことが多い。

◆quotaコマンド

coins では、ホーム・ディレクトリ以下で個人がファイルを保存するために利 用できるディスクの上限が決まっている。上限や現在の利用量を表示するため には、一般的には、quota コマンドを使う。
$ quota -v [←]
Disk quotas for user tcoins1 (uid 19001):
     Filesystem    1K blocks  quota limit     grace  files  quota limit  grace
          /home      1763828     10240000  11264000  12583            0      0
/usr/local/local3          0            0         0      0            0      0
$ []

上のユーザは、/home の領域で 1,763,828 KB 使っている。 上限は、10,240,000 KB。 ファイル数は、12583 個。ファイル数の上限は、設定されていない。

coins の標準は、上限 10 GB (10*1024 KB)。これを超えると、ファイルを保存で きなくなる。 coins.tsukuba.ac.jpの電子メールも受信できなくなる。 10 GB (10*1024 KB) を超えると、警告のメールが飛ぶ仕組みがあるが、メール が飛ばないこともあるので、各自自分で気をつける。 手引き 10.9 ディスククォータに関する警告メールが来てしまった 参照

Coins では 2023年3月のシステムの置き換えで quota が使えなくなった。 残りどのくらい使えるかは、Windows に(リモートデスクトップで)ログインして調べる方法がある。

Windows にログインしなくても、同じことが smbclient コマンドの du サブ コマンド (disk usage) を使うことでもわかる。
$ smbclient -U coins-ad\\$USER //130.158.231.169/home -c du [←]
Password for [COINS-AD\ユーザ名]:(パスワードを打つ。画面には表示されない。)

                10485760 blocks of size 1024. 9395656 blocks available
Total number of bytes: 0
$ []
この例では、 10,485,760 KB (10 GB) のうち 9,395,656 KB (8.96 GB) 使えることがわかる。

130.158.231.169 は、ファイルサーバ pansy5.coins.tsukuba.ac.jp の IP アドレス。このコマンドを簡単に実行するための coins-quota という シェル・スクリプトも用意されている。

$ which coins-quota [←]
/usr/local3/coins/linux/bin/coins-quota
$ cat `which coins-quota` [←]
#!/bin/sh -x

smbclient -U coins-ad\\$USER //130.158.231.169/home -c du
$ []

quota limit を超えた時には、不要なファイルを消す。 まずは、キャッシュを削除する。

◆duコマンド

ホーム・ディレクトリ全体ではなく、個々のディレクトリごとに ディスク使用量を調べたい時には、 du コマンド を使う。引数に調べたいディレクトリ名を与える。ディレクトリ名としては、 「.」や「~」も可。du は、ファイルの数が多い時に表示までに時間がかかる。 途中でやめたくなった時には、 ^C (Control+C) で強制終了する。
$ du ~ [←]
(ホーム・ディレクトリ以下のファイルの容量を表示)
$ du . [←]
(カレントワーキング・ディレクトリ以下のファイルの容量を表示)
$ du -s . [←]
(-s で合計だけ表示)
$ du -s -k . [←]
(-k で KB 単位で表示)
$ du -s -k * [←]
(指定されたディレクトリ(*なのでそこにあるもの全部)単位で合計の表示)
$ du -s -k * | sort -nr | head [←]
(合計を大きい順にソートし、その先頭 10 行を表示)
man du、 手引き 2.8.2 duコマンド 参照手引き 11.9.1 必要のないファイルを調査,削除する 参照

◆キャッシュ

キャッシュに関する素養について別ページで説明する。

◆コマンドによるファイルの整理

次のようなコマンドやディレクトリについての別ページで説明する。

■Emacs(2)

複数のファイルを扱う方法と検索

◆insert-file

Emacs にはファイルを挿入する機能がある。

◆別のファイルへ保存

読み込んだファイルとは別のファイルに保存することができる。 前回のレポートを修正する時に便利。早めに C-x C-w で書き込むこと を奨める。さもないと元のファイルを壊してしまうことになる。

類似のことは、cp コマンド等で元のファイルを別のファイルにコピーしてから、 別のファイルを Emacs で修正してもできる。

◆Emacs のバッファとウィンドウ

手引き 3.5.2 画面の分割 参照 Emacs のバッファは、ハードウェアのメモリを抽象化したもの。ファイルの内 容を読み込み、編集できる。保存しなければ、失われる。

Emacs でウィンドウとは、バッファの一部を表示する画面。 。 。

Emacs のウィンドウ、一部表示、バッファ、ファイル、読み込み、保存
図? Emacsのウィンドウとバッファとファイルの関係

キー 説明
C-x 2 ウインドウを2つに分割(現在のバッファを複数ウインドウで表示)
C-x 1 ウインドウを1つにする(他のウインドウを閉じる)
C-x 0 現在のウインドウを閉じる
C-x o 他の(other)ウインドウにカーソルを移動。
C-x C-b バッファのリストを表示
C-x b 別のバッファを表示する

◆Emacs のバッファとウィンドウの使い道の例

Emacs には、通常の検索とインクリメンタルな検索の2種類の検索がある。 手引き 3.3.7 検索・置換 参照 インクリメンタル・サーチの途中で、検索する文字を打つ代わりに、C-s, C-r を打つと次に見つかった場所にカーソルが移動する。

◆Emacsの検索と文字列の置換え

手引き 3.3.7 参照

M-x query-replace (M-%, Esc %) が便利。

M-% と打つと、ミニバッファで次のように聞かれる。

Query replace: 置き換え前の文字列[←]
Query replace 置き換え前の文字列 with: 置き換え後の文字列[←]
キー意味
y (または SPC) 置き換え
n 次の候補に移動
q 終了
! 以降すべて置換
練習問題 Emacs query-replace

その他に、次のような置換え機能がある。 。

■World Wide Web、ホームページ

情報科学類のコンピュータにアカウントがある人は、 HTML ファイルや PNG 形式等の画像ファイルを ホームディレクト以下に置く事で、 個人のホームページを作成することができる。

◆情報科学類での個人のホーム・ページ

筑波大学情報学類コンピューティング環境では、個人の WWW ページは、次のよ うな URL で参照される。 ここで「ユーザ名」を、ログインの時に打つ自分のユーザ名 で置き換える。たとえば、学籍番号が 202194321 の人は、次のような URL で 参照される。 この URL は、次のディレクトリに対応する。 このディレクトリは、mkdir コマンドで作成できる。
$ mkdir ~/public_html [←]

2023年注意。2023年3月より http: 用と https: 用のディレクトリが統合され た。以前は、別のディレクトリであった。

mkdir の後、 ディレクトリのxの働き を理解し、 ホームディレクトと作成したディレクトリに対して chmod コマンド で others に対して x ビットを立てる必要がある。 練習問題 Webページ用のディレクトリ作成 参照。

このディレクトリに index.html というファイルを作成すれば、 それが情報科学類での個人のホーム・ページの内容となる。

◆Web アクセスログ

◆アクセスログとエラーログ

Web サーバは、ページがアクセスされる度に記録を残す。この記録をアクセス ログという。アクセスログは、情報科学類のサーバ www (www.coins.tsukuba.ac.jp) では、次の場所にある。
http
/var/log/httpd/access*
https
/var/log/httpd/ssl_access*
この中で、数字が一番大きなもの、または、日付が新しいものが、 現在増加しているログである。
$ cd /var/log/httpd/ [←]
$ ls    access* | tail -1 [←]
$ ls -t access* | head -1 [←]
以下の例では、現在増加しているログは access_log_20220609 である。
$ cd /var/log/httpd/ [←]
$ ls access*     | tail -1 [←]
access_log_20220609
$ ls  -t access* | head  -1 [←]
access_log_20220609
$ []
以下は、アクセス・ログの内容の例である。見やすいように改行を入れているが 実際には1行が1つのページの転送を意味する。
2001:2f8:3a:1711::230:30 - - [14/Jun/2022:10:04:32 +0900] "GET /~syspro/2022/202
1-06-16/ HTTP/1.1" 200 77088 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; 
rv:89.0) Gecko/20100101 Firefox/89.0"

2001:2f8:3a:1711::230:30 - - [14/Jun/2022:10:04:32 +0900] "GET /~syspro/2022/202
1-06-16/images/www-cgi.png HTTP/1.1" 200 15499 "http://www.coins.tsukuba.ac.jp/~
syspro/2022/2022-06-16/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:89.0)
 Gecko/20100101 Firefox/89.0"

2001:2f8:3a:1711::230:30 - - [14/Jun/2022:10:05:32 +0900] "GET /~syspro/2022/202
1-06-16/cgi-printarg.cgi?lastname=name1&firstname=name2&lang=C&email=who%40dom H
TTP/1.1" 200 443 "http://www.coins.tsukuba.ac.jp/~syspro/2022/2022-06-16/" "Mozi
lla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:89.0) Gecko/20100101 Firefox/89.0"

2001:2f8:3a:1711::230:30 - - [14/Jun/2022:10:06:23 +0900] "POST /~syspro/2022/20
21-06-16/cgi-printarg.cgi HTTP/1.1" 200 375 "http://www.coins.tsukuba.ac.jp/~sys
pro/2022/2022-06-16/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:89.0) Ge
cko/20100101 Firefox/89.0"
このログは、設定ファイル /etc/httpd/conf/httpd.conf にある CustomLog 等の設定による。
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog "|/usr/sbin/rotatelogs -l /etc/httpd/logs_http/access_log_%Y%m%d 20M" combined
combined という名前が付けられたログのフォーマットの意味は、以下の通りである。

アクセスログの他に、エラーが起きた時にもログが作られる。これを エラーログ という。エラーログは、情報科学類のサーバ www (www.coins.tsukuba.ac.jp) では、次の場所にある。

http
/var/log/httpd/error_log_*
https
/var/log/httpd/ssl_error_log_*
CGI のプログラムをデバッグする時には、このエラーログを見て原因を探る。

その他に、次のようなログを取ることもある。

ssl_request_log (coins では /var/log/httpd/ssl_request_log_*)
SSL のプロトコル等
/var/log/httpd/suexec.log 等 (coins では /var/log/secure)
suExec を使っていた時のログ

練習問題 学類 Web サーバのアクセス・ログの観察 参照。

■Webページに対するアクセス制御と認証

■coins.tsukuba.ac.jp のメール

情報科学類のコンピュータにアカウントがある人は、次のメールアドレスが使えるようになっている。

■練習問題

練習問題は、時々更新する。 レポート課題は、それとは別に、ページの末尾にある。

◆プロセス

練習問題(3001) psコマンド

手引き 2.10.1 ps コマンド 参照

ps コマンドを使って、プロセスの一覧を表示しなさい。

$ ps [←]

練習問題(3002) psコマンドのオプション

ps コマンドには、様々なオプションを与えることができる。 以下は、-l オプションをを与えたものである。
$ ps l [←]
ps コマンドに、次のオプションを与えて、動作を確認しなさい。
a
all。他人のプロセスも含めて全てのプロセス。
l
long。長い表示。
u
長い表示。
U user (大文字)
ユーザ名 user のプロセスだけ
x
端末無しのプロセスの表示
ux
u と x の組み合わせ
ps コマンドにオプションを与える方法として、「-」を付ける方法と付けない 方法がある。「-」の有無で表示が変わることがある。
$ ps l [←]
$ ps -l [←]
「-」の有無で、使い方が違うことがある。
$ ps u [←]
$ ps -u ログイン名 [←]

他のオプションについて、man ps を見て見なさい。

練習問題(3003) grep

grep コマンドを使って次のようなことを行ってみなさい。

grep コマンドには次のようなオプションを指定することができる。

-v
その行が含まれないものを表示する
-i
大文字小文字を無視する
この動きを確認しなさい。

練習問題(3004) ps コマンドと grep コマンド

この機能を利用して見なさい。

端末と結びついていないプロセスを調べるには、ps コマンドに x オプション を与える。次のようにして、bash、emacs、ssh 関連、その他 /bin 関連プロセスの PID を調べなさい。

$ ps x | grep bash [←]
$ ps x | grep emacs [←]
$ ps x | grep ssh [←]
$ ps x | grep /bin [←]
grep コマンドに -i オプションを付けると大文字と小文字を関係なく調べるこ とができる。このことを確認しなさい。
$ ps x | grep S [←]
$ ps x | grep -i s [←]

練習問題(3005) psコマンドとlvコマンド

ps コマンドに a オプションを付ける等して、プロセス数が多くなると画面に 入り切らなくなる。この時には、lv コマンドと組み合わせるとよい。
$ ps aux | lv [←]
この方法を、確かめなさい。lv コマンドについては、 手引き 2.7.2 参照lv コマンド を参照しなさい。q(終了)、次のページへの移動(スペースキー)、 ページを戻る(b)は、必ず覚えなさい。

練習問題(3006) ps u

psコマンドにuオプション(user-oriented)を付けると、 プロセスに割り当てられたメモリ資源やCPU資源が表示する。
$ ps u [←]
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
yas        72189  0.0  0.0  21288  5580 pts/0    Ss   15:59   0:00 -bash
yas        93931  4.0  0.1 200456 36652 pts/0    Tl   16:59   0:00 emacs -nw
yas        93937  0.0  0.0  22584  1556 pts/0    R+   16:59   0:00 ps u
$ []
%CPU
過去1分間に利用した CPU 時間の割合。
%MEM
実際に消費してるメイン・メモリの大きさの割合。
VSZ (Virtual Size)
仮想記憶上のプロセスの大きさ。KB 単位。
RSS (resident set size)
実際に消費してるメイン・メモリの大きさ。
START
プロセスが生成された時刻。

練習問題(3007) ps lと親プロセス

psコマンドに「l」オプション(long)をつけると親プロセスのプロセス識別子が PPIDのところに表示される。 このこと確認しなさい。
$ ps l [←]
F   UID     PID    PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
0  1013   72189   72175  20   0  21288  5580 do_wai Ss   pts/0      0:00 -bash
0  1013   93931   72189  20   0 200456 36652 do_sig Tl   pts/0      0:00 emacs -
0  1013   94534   72189  20   0  22372  1564 -      R+   pts/0      0:00 ps l
$ []
PID 93931 の emacs の親プロセスは、PID 72189 の bash。 PID 94534 の ps の親プロセスは、PID 72189 の bash。

練習問題(3008) psコマンドで横長の表示

ps コマンドは、端末の横幅に合わせて表示する。 長い COMMAND が途中で切れてしまう。 表示を増やすには、次の方法がある。 次のように、w オプションの効果を確認しなさい。
$ ps ux [←]
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
yas        72046  0.0  0.0  17788 10532 ?        Ss   15:59   0:00 /lib/systemd/
yas        72047  0.0  0.0 171900  5712 ?        S    15:59   0:00 (sd-pam)
yas        72053  0.0  0.0  49488  6768 ?        Ssl  15:59   0:00 /usr/bin/pipe
yas        72054  0.0  0.0  33512  7036 ?        Ssl  15:59   0:00 /usr/bin/pipe
<省略>
$ ps uxw [←]
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
yas        72046  0.0  0.0  17788 10532 ?        Ss   15:59   0:00 /lib/systemd/
systemd --user
yas        72047  0.0  0.0 171900  5712 ?        S    15:59   0:00 (sd-pam)
yas        72053  0.0  0.0  49488  6768 ?        Ssl  15:59   0:00 /usr/bin/pipe
wire
yas        72054  0.0  0.0  33512  7036 ?        Ssl  15:59   0:00 /usr/bin/pipe
wire-media-session
yas        72055  0.0  0.0 307056 22776 ?        Ssl  15:59   0:00 /usr/bin/puls
eaudio --daemonize=no --log-target=journal
<省略>
$ []
また、端末の画面を横幅を広げて ps コマンドを打ちなさい。

練習問題(3009) topコマンド

top コマンドで、「重たい」プロセスを表示しなさい。 「重たい」プロセスとは、CPU時間を大量に消費しているプロセスや メモリを大量に消費しているプロセスのことである。 終了するには、小文字の q を打つ。^C でもよい。
$ top [←]
よく使われるオプションに -o, -d -u がある。 詳しくは man top を見なさい。
$ top -o %CPU [←]
(CPU を消費している順)
$ top -o RES [←]
(Resident Memory Size, メモリの消費している順)
$ top -d 5 [←]
(5秒置きに更新)
$ top -u $USER [←]
(自分のプロセスだけ)

練習問題(3010) topコマンドのkillによる強制終了

top コマンドのプロセスを kill コマンドで殺してみなさい。

練習問題(3011) ^Dによるcatコマンドの終了

cat コマンドと 標準出力の切り替え で短いファイルを作 成してみなさい。
$ cat > file1.txt [←]
Line 1[←]
Line 2[←]
^D
$ cat file1.txt  [←]
Line 1
Line 2
$ []

練習問題(3012) ^Cによる cat コマンドの強制終了

^C (Control+C) によるプロセスの強制終了を行いなさい。
$ cat [←]
aaa[←]
aaa
bbb[←]
bbb
^C
$ []
なお、^C と 入力の終わりを意味する ^D は働きが異な る。どちらでもプロセスが終了することがあるが、強制終了したい場合には、 ^C を使いなさい。

練習問題(3013) ^Cによる強制終了(2)

次のような終了するのに時間がかかるプログラムを実行してしまって、途中で やめたくなった時に ^C で終了するように練習しなさい。
$ ls -R ~ [←]
(大量の表示、省略)
^C
$ []

練習問題(3014) yesコマンドの強制終了

yes コマンドは、端末に y と表示し続けるコマンドである。 普通、終了することはないので、強制終了が必要になる。 次のように実行すると、最初の 10 行だけ表示する。
$ yes | head [←]
y
y
y
y
y
y
y
y
y
y
$ []
yes コマンドは普通、終了しないので、最後の 10 行を表示しようと tail コ マンドを使っても表示されない。
$ yes | tail [←]
この時、別の端末で yes コマンドのプロセスを kill してみなさい。
$ ps [←]
(yes のプロセスの PID を調べる)
$ kill PID [←]
$ []
yes のプロセスが終了すると、tail コマンドが最後の 10 行を表示する。 このことを確認しなさい。

yes と tail を ^C で強制終了するとどうなるか。調べなさい。

$ yes | tail [←]
^C
$ []
yes コマンドと lv コマンドを実行するとどうなるか調べなさい。
$ yes | lv [←]
yes コマンドを単独で実行し、^C で停止しなさい。
$ yes [←]
...
^C
$ []
cat -n と合わせて実行し、必要なら強制終了しなさい。
$ yes | cat -n [←]
$ yes | cat -n | lv [←]
$ yes | cat -n | head [←]
$ yes | cat -n | tail [←]

練習問題(3015) ^Cが効かないプログラム

端末の中で実行されるプログラムのうち、次のようなプログラムは、 ^C でも終了しない。このことを確認しなさい。 注意: C-c は、C-x と同じように、2ストローク以上で1つの意 味をなすことが多い。何もない状態でC-c を打った場合には、 C-g によりキャンセルしなさい。

練習問題(3016) killコマンド

手引き 2.10.2 参照

kill コマンドを使って、プロセスを殺してみなさい。

  1. iTerm 等で、端末を2個つ表示し、それぞれシェルを実行する。
  2. 片方の端末で、lv コマンドでファイルを表示する。
    $ lv ~/.bashrc [←]
    
  3. もう片方の端末で、ps コマンドで lv コマンドから実行された プロセスの PID を調べる。
    $ ps [←]
    
  4. kill コマンドで lv コマンドから実行されたプロセスを殺す。
    $ kill PID [←]
    

lv コマンドの代わりに、bash からなるプロセスを殺すとどうなるか調べなさい。

ps, grep, kill の変わりに pgrep や pkill コマンドを使う方法もある。

練習問題(3017) killコマンドで他人のプロセスを殺そうとしてみる

ps コマンドで調べたプロセスのうち、他人のプロセス(root、その他) を kill コマンドで殺そうとしてみなさい。何がおきるかを観察しなさい。どのよ うなエラーが生じるか。

練習問題(3018) ps | grep、kill

次の一連の操作を行いなさい。
$ ps 引数 | grep オプション パタン [←]
$ kill  [←]
たとえば、次の例のように、 pulseaudio のプロセスを探して、殺してみなさい。
$ ps ux | grep pul [←]
yas        72055  0.0  0.0 307056 22776 ?        Ssl  15:59   0:00 /usr/bin/pulseaudio --daemonize=no --log-target=journal
(端末がないので、ps に x オプションをつける。)
$ kill 72055 [←]
(これで死んでいる。)
$ kill 72055 [←]
-bash: kill: (72055) - そのようなプロセスはありません
(2度目は確認のため。)
$ ps ux | grep pul [←]
yas       105073  0.0  0.0  18792  2432 pts/0    S+   17:30   0:00 grep pul
(ps コマンドでも表示されない。)
$ [←]

練習問題(3019) ps lによるプロセスの木構造の確認

ps l コマンドを使うと、親プロセスの PID が表示される。 この仕組みを使って、親プロセスの親プロセスを調べなさい。 さらに、その親プロセスを調べなさい。

次の例は、bash の親プロセス、その親プロセス、さらにその親プロセスを調べ て、sshd であることを突き止めている。

$ ps alx | grep bash [←]
0     0    1393       1  20   0  20016  3756 -      S    ?          0:05 /bin/bash /usr/bin/vboot-agent-service
0  1013   72189   72175  20   0  21424  5736 do_wai Ss   pts/0      0:00 -bash
0  1013  105712   72189  20   0  18792  2428 pipe_r S+   pts/0      0:00 grep bash
$ ps alx | grep 72175 [←]
5  1013   72175   72043  20   0  19212  8728 -      S    ?          0:00 sshd: yas@pts/0
0  1013   72189   72175  20   0  21424  5736 do_wai Ss   pts/0      0:00 -bash
0  1013  105802   72189  20   0  18792  2436 pipe_r S+   pts/0      0:00 grep 72175
$ ps alx | grep 72043 [←]
4     0   72043    1153  20   0  17992 10676 -      Ss   ?          0:00 sshd: yas [priv]
5  1013   72175   72043  20   0  19212  8728 -      S    ?          0:00 sshd: yas@pts/0
0  1013  105868   72189  20   0  18792  2404 pipe_r S+   pts/0      0:00 grep 72043
$ ps alx | grep 1153 [←]
4     0    1153       1  20   0  15720  8984 -      Ss   ?          0:00 sshd: /usr/sbin/sshd -D [listener] 1 of 10-100 startups
4     0   72043    1153  20   0  17992 10676 -      Ss   ?          0:00 sshd: yas [priv]
4     0  105775    1153  20   0  15720  8676 -      Ss   ?          0:00 sshd: [accepted]
$ []
  1. grep bash で見つかるプロセスの PID は、1393, 72189, 105712 。 目的のものは、pts/0 で動いている 72189。その PPID は、72175。
  2. PID が 72175 のものを探すと、sshd である。
  3. その親は、72043 の ssh。
  4. その親は、PID 1 の init プロセス。この親はいない。

どんなプロセスでも、PID が 1 番のプロセスにたどりつく。このことを確認しなさい。

練習問題(3020) pstreeコマンド

pstreeコマンドを実行しなさい。それでプロセスの親子関係により木構造が作 られていることを確認しなさい。
$ pstree [←]
$ pstree | lv [←]
$ pstree -p | lv [←]
端末の画面の横幅を広げると見やすい。

練習問題(3021) macOS Command+Option+Esc

macOS で、Command+Option+Esc キーを押すと 「アプリケーションの強制終了」のウインドウを表示できる。

(まず、Commandキー(Command) と Option キーを左手で押し、 押しっぱなしの状態で、右手で Esc キーを一度押して離す。) 左上のアップル・メニュー(リンゴのアイコン)を押し、 「強制終了」を選んでも良い。

Command+Option+Escキー
「アプリケーションの強制終了」のウインドウ

この機能を確認しなさい。なお、この機能では、ウインドウを開くプロセスし か強制終了できない。iTerm の中で実行されるプロセスや端末とは結びついて いないプロセスを強制終了するには、kill コマンドを使うしかない。

練習問題(3022) 「アクティビティモニタ.app」の利用

macOS で「ユーティリティ(/Applications/Utilities/)」にある 「アクティビティモニタ.app(Activity Monitor.app)」 を動作させ、プロセスの一覧を表示させなさい。
$ open "/Applications/Utilities/Activity Monitor.app" [←]
または、Finder で、「移動」メニューから「ユーティリティ」を 選択。「アクティビティモニタ.app」のアイコンをダブルクリック。

アクティビティモニタの表示 (クリックで拡大)
アクティビティモニタの表示

表示されたら、「CPU」タブを表示しなさい。そして、 表示されるプロセスの順序を変えてみなさい。

topコマンド の表示と比較しなさい。

練習問題(3023) 「アクティビティモニタ.app」によるメモリ使用量の調査

macOS で アクティビティモニタ.appを実行しなさい。 「CPU」タブではなく、「メモリ」タブを開きなさい。プロセスをメモリの使用 量の順に表示しなさい。

練習問題(3024) Windows タスクマネージャー

手引き 5.6節 参照

「プロセス」のタブでは、CPU 時間の順番やメモリ使用量の順番に並べ替えな さい。

強制終了しても問題がなさそうな「アプリケーション」や「プロセス」を、強 制終了してみなさい。

◆標準出力の切り替え

練習問題(3025) 標準出力の切り替え

次のように、cal コマンドを実行して、>による標準出力の切り替 えが動作することを確認しなさい。
$ cal 5 2023 [←]
      5月 2023
日 月 火 水 木 金 土
    1  2  3  4  5  6
 7  8  9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

$ cal 5 2023 > cal-2023-05.txt [←]
$ ls -l cal-2023-05.txt [←]
-rw-r--r-- 1 yas prof 193  4月 19 17:53 cal-2023-05.txt
$ cat cal-2023-05.txt [←]
      5月 2023
日 月 火 水 木 金 土
    1  2  3  4  5  6
 7  8  9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

$ []

練習問題(3026) bcコマンド

bc コマンドは、電卓のプログラムである。一般的には、キーボードから数式を 読み込み、結果を画面に表示する。これを動作させてみなさい。

動作例:

$ bc [←]
bc 1.07.1
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
10+20[←]
30
^D
$ []
bc コマンドは、プロンプトを表示しないが、ユーザが打ち込んだ数式を行単位 で計算して表示する。終了するには、入力の終わり(end of file) を意味する ^D (Control+D) を押す。コントロール・キーを押しながら、 D キーを押す。

次のような機能が利用できる。

bc に -l オプションを付けると小数が扱える。 詳しくは、man bc を見なさい。

練習問題(3027) 標準入力の切り替え

bc コマンドに対して、ファイルから数式を読み込ませて計算させなさい。 まず、テキスト・エディタ、または、cat 等で数式が含まれたファイルを作成 しなさい。以下は、cat で作成する例である。Emacs を利用して作成してもよ い。
$ cat > expressions [←]
10+20[←]
2^40[←]
^D
$ cat expressions  [←]
10+20
2^40
$ []
次に作成した数式を、 キーボードの代わりにファイルからデータを読み込ませる。
$ bc < expressions [←]
30
1099511627776
$ []
次に、echo コマンドとパイプを使ってみなさい。数式は、ダブルクォーテーショ ンマーク(「"」)で括るとよい。
$ echo "10+20" [←]
10+20
$ echo "10+20" | bc [←]
30
$ echo "2^40" | bc [←]
1099511627776
$ []

練習問題(3028) 追記

以下のような手順で、5月から7月のカレンダ含むファイルを作成しなさい。
$ ls -l cal-2023-567.txt [←]
ls: 'cal-2023-567.txt' にアクセスできません: そのようなファイルやディレクトリはありません
$ cal 5 2023 >  cal-2023-567.txt [←]
$ cal 6 2023 >> cal-2023-567.txt [←]
$ cal 7 2023 >> cal-2023-567.txt [←]
$ cat cal-2023-567.txt [←]
      5月 2023
日 月 火 水 木 金 土
    1  2  3  4  5  6
 7  8  9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

      6月 2023
日 月 火 水 木 金 土
             1  2  3
 4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30

      7月 2023
日 月 火 水 木 金 土
                   1
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
$ []

練習問題(3029) lvコマンド

lv コマンド の使い方を復習しなさい。次のキーを確認しなさい。 次のファイルを lv コマンドで表示してみなさい。
$ lv /usr/share/dict/words  [←]
$ lv /etc/services [←]

練習問題(3030) lsとパイプ(1)

ls コマンドは、出力が端末かパイプかで表示方法を変える。 パイプの場合、縦になる。
$ ls [←]
file1.txt	file2.txt
$ ls | cat [←]
file1.txt
file2.txt
$ []
このことを確認しなさい。
$ ls [←]
$ ls | cat [←]
$ ls | lv [←]
ls-1 オプションは、(端末でパイプでも)縦に表示するオプ ションである。-1 は、数字の 1 であり、アルファベットの L の小文字の l ではない。ls-C オプショ ンは、(端末でパイプでも)横に表示するオプション。
$ ls [←]
file1.txt file2.txt
$ ls -1 [←]
file1.txt
file2.txt
$ ls -C [←]
file1.txt file2.txt
$ ls -C | cat [←]
file1.txt file2.txt
$ []
このことを確認しなさい。

練習問題(3031) lsとパイプ(2)

次のコマンドを実行して、パイプの動作を確認しなさい。

練習問題(3032) psとパイプ

次のコマンドを実行して、パイプの動作を確認しなさい。

練習問題(3033) macOS pbpaste コマンド

Web ページや端末の結果結果を Emacs にペーストする時に、タブが含まれ ているために、自動的に字下げが行われて、表示が 乱れてしまうことがある。この問題は、 macOS なら pbpaste コマンドと Emacs C-x i (insert-file) で解決できる。このことを確認しなさい。

まず、pbpaste コマンドを使って、Web ページの一部や端末の表示の一部を ファイルに保存しなさい。

  1. Web ブラウザで Web ページを表示する。あるいは、 端末で、コマンドを実行する。
  2. その一部をマウスで選択し、コピーする (メニューバーの「編集」メニューの「コピー」を選ぶ。)
  3. 端末で pbpaste コマンドを実行する。
    $ pbpaste > file1.txt [←]
    
  4. Emacs を実行する。
    $ emacs file2.txt [←]
    
  5. 先ほど保存したファイルを、 Emacs C-x i (insert-file) で読み込む。

練習問題(3034) macOS pbcopy コマンド

macOS の pbcopy コマンドを使って 端末でアクセスできるファイルや、コマンドの結果を Thunderbird や別の端末にコピーしてみなさい。
  1. コピーしたいファイルを標準入力として pbcopy コマンドを実行する。
    $ pbcopy < ファイル名 [←]
    
    cat コマンドとパイプを使う方法もある。
    $ cat ファイル名 | pbcopy [←]
    
    cat コマンドではなく、他のコマンドでも良い。
    $ ps    | pbcopy [←]
    
    $ ls -l | pbcopy [←]
    
  2. Thunderbird や別の端末で、ペーストの動作を行う。 (メニューバーの「編集」から「ペースト」を選ぶ、等。)

練習問題(3035) expand コマンド

端末の結果結果を Emacs にペーストする時に、タブが含まれているために、 自動的に字下げ が行われて、表示が乱れてしまうことがある。 expand コマンドをつかうと、タブを空白に置き換えてくれる。
$ ls [←]
(タブ入りの表示、横)
$ ls | expand [←]
(タブを含まない表示、縦)
$ ls -C | expand [←]
(タブを含まない表示、横。コピーして、Emacs にペーストしても乱れない。)
$ []
この動きを確認しなさい。 。 。

練習問題(3036) Emacs shell-command

Emacs には、shell-command という機能があり、 Emacs が端末プログラムの働きをして、その中でシェルを実行することができる。
M-x shell-command[←]
この機能を、C-u (Control+u) を付けて実行すると、コマンドを実行 してその結果を現在編集中のファイル(バッファ)に挿入できる。
C-u M-x shell-command[←]
Shell command: 実行したいコマンド[←]
この機能を確認しなさい。

練習問題(3037) Windows コマンドプロンプトや Powershell での標準入出力の切り替え

「コマンドプロンプト」では、Unix のシェルと同様に、 標準入出力の切り替え(redirection リダイレクション) が行なえることを確認しなさい。
dir > files.txt
type files.txt
type files.txt | more
dir, type は、「コマンドプロンプト」のコマンド。 powershell では, ls と cat コマンドを使う。

◆ファイルの属性、アクセス制御

練習問題(3038) whoami,groups,idコマンド

whoami, groups, idコマンドを使って、プロセス(シェル)のUID, GID, groups 属性を表示しなさい。
$ id [←]
$ whoami [←]
$ groups [←]

練習問題(3039) 他人から読み書き可能な自分のファイル

ルートからホームディレクトリにいたる間でのディレクトリのモードを調べな さい。
$ echo ~ [←]
$ ls -ld / [←]
$ ls -ld /home [←]
$ ls -ld /home/ugrad/ [←]
・・・中略・・・
$ ls -ld  ~ [←]
Coins の Web サーバで個人の Web ページを開設した人は、 ディレクトリ ~/, ~/public_html や ~/public_html/index.html のモードを調べな さい。
$ ls -ld ~/ [←]
$ ls -ld ~/public_html [←]
$ ls -l  ~/public_html/index.html [←]
他の人(WWWページとして公開するために、WWWサーバ・プロセスからのアクセ スも含む)がアクセスしようとしたらどうなるかを考察しなさい。

その他に、次のファイルやディレクトリのモードを調べなさい。

練習問題(3040) 自分が読み書き可能な他人のファイル

他人のファイルで、内容を読む事ができるファイルを読みなさい。 たとえば、新城のファイルを読むには次のようにする。
$ cd ~yas [←]
$ ls -l [←]
$ ls -l literacy-a* [←]
$ lv literacy-a4.txt [←]
$ []

練習問題(3041) アクセス不可能な他人のファイル

他人のファイルで、内容を読む事がでないファイルを読もうとしてみなさい。  たとえば、新城のファイルを読もうとするには次のようにする。
$ cd ~yas [←]
$ ls -l [←]
$ ls -l literacy-a* [←]
$ lv literacy-a5.txt [←]
$ []

練習問題(3042) 他人のプロセスのkill

ps コマンド、grep コマンド、lv コマンド等で、他人のプロセスの PID を調 べなさい。その PID を使って、他人のプロセスを kill してみなさい。その結 果、そのプロセスがどうなるかを調べなさい。

練習問題(3043) chmod コマンド

chmod コマンドで、ファイルやディレクトリのモードを変更しなさい。 以下の例は、file1に対して、グループ(g)とそれ以外の人(o)に対して「読込み 可」の許可を取り除いている。
$ ls -l file1.txt  [←]
-rw-r--r--  1 yas  prof  2  5 10 18:59 file1.txt
$ chmod go-r file1.txt  [←]
$ ls -l file1.txt  [←]
-rw-------  1 yas  prof  2  5 10 18:59 file1.txt
$ []
go-r を含めて、様々なモードの設定方法がある。 次の設定方法の意味を確認しなさい。

練習問題(3044) WWWページのファイルのモード

WWW ページとして公開するファイルのモードはその他(others)に対するアクセ ス許可で r ビットが立っている必要がある。もし、このビットを chmod o-r で落した場合、Web ブラウザでアクセスできなくなる。このことを確かめなさ い。

以下の例では、sample1.html というファイルが存在し、 http://www.coins.tsukuba.ac.jp/~ユーザ名/sample1.html 等で アクセス可能な状態になっているものとする。

$ cd ~/public_html [←]
$ cp sample1.html sample2.html  [←]
<アクセス制御のテスト用のファイルを cp コマンドで作成する。>
$ ls -l sample2.html  [←]
-rw-r--r--  1 yas  prof  408  5 18 11:11 sample2.html
<Firefoxでアクセス、再読み込み等>
$ chmod o-r sample2.html  [←]
$ ls -l sample2.html  [←]
-rw-r-----  1 yas  prof  408  5 18 11:11 sample2.html
<Firefoxでアクセス、再読み込み等>
$ chmod o+r sample2.html  [←]
$ ls -l sample2.html  [←]
-rw-r--r--  1 yas  prof  408  5 18 11:11 sample2.html
<Firefoxでアクセス、再読み込み等>
$ []

同様に、ディレクトリを作成し、その他(others)に対する x ビットを立てたり 落したりしながら、その効果を確認しなさい。

$ cd ~/public_html [←]
$ mkdir dir1 [←]
$ emacs dir1/file1.html [←]
$ ls -ld dir1 [←]
$ ls -l dir1/file1.html [←]
<Firefoxでアクセス、再読み込み等>
$ chmod o-x dir1 [←]
$ ls -ld dir1 [←]
<Firefoxでアクセス、再読み込み等>

練習問題(3045) 8進数を利用したchmodコマンド

chmod コマンドは、モードを8進数で与えることもできる。 。 。 また、利用してみなさい。 8進数で指定することの利点を考えなさい。

練習問題(3046) umaskの影響調査

新しく生成されるファイルは、マスク、または、umask の影響を受ける。 。 。 このことを確認しなさい。

chmod コマンドで ugoa を指定しない場合、 a と似ているが、umask の部分は落とされる。 このことを確認しなさい。

練習問題(3047) chgrp コマンド

chgrp コマンドで、ファイルやディレクトリのGID属性を変更しなさい。
$ ls -l file1.txt [←]
(ファイルのグループの表示)
$ id [←]
(自分(プロセス)が属しているグループの表示)
$ chgrp グループ file1.txt [←]
$ ls -l file1.txt [←]
(ファイルのグループの表示)
$ []
まず、適当な内容を持つテキスト・ファイルを作成しなさい。
$ echo hello > file1 [←]
$ ls -l file1 [←]
-rw-r--r--  1 yas  prof  6  5 23 22:28 file1
$ cat file1 [←]
hello
$ []
そして、次のような要求を満たすように chmod コマンドを使ってモードを変更 しなさい。提出するファイルには、chmod コマンドをどのように利用したか、 また、その結果 ls -l の表示がどのようになったかを含めなさい。

練習問題(3048) mkdirとchmodによる drop box ディレクトリの実装

同じコンピュータ(ファイルサーバ)を共有しているユーザ間で秘密のファイ ルを受け渡しする方法として、受信側のディレクトリに drop box となる ディレクトリを作成する方法がある。このディレクトリは、 次のようなモードを持つ。
$ ls -ld dropbox [←]
drwx-wx-wx  2 yas  prof  80  5 22 15:28 dropbox
$ []
送信側は、受信者が読めるモードで、ファイルを作成し、受信者の drop box ディレクトリの下にコピーする。
$ emacs file-2023-05-17.text [←]
$ ls -l file-2023-05-17.text  [←]
-rw-r--r--  1 yas  prof  56353  5 22 15:38 file-2023-05-17.text
$ cp file-2023-05-17.text ~user/dropbox [←]
$ []
送信者は、このディレクトリから目的の取り出す。cp コマンド等でファイルを コピーし、元のファイルを rm コマンド等で削除する。

このような drop box を用いて、隣の人、あるいは、その他の友人にファイルを渡しなさい。 同様に、ファイルを受け取りなさい。

$ ls -l file-2023-05-17.text  [←]
-rw-r--r--  1 yas  prof  56353  5 22 15:38 file-2023-05-17.text
$ cp file-2023-05-17.text ~ [←]
$ rm file-2023-05-17.text [←]

注意: この練習問題では、 インターネット上のファイル・サービス https://www.dropbox.com/ を用いない。

練習問題(3049) mkdirとchmodによる drop box ディレクトリの実装(2)

この drop box の使い方では、ファイル名として予測 可能なものを用いた場合、本来の受信者だけでなく、その他のユーザがファイ ルをアクセスすることも可能である。どのようにすれば、アクセスできるのか を説明しなさい。

他の人へのアクセスを防ぐ方法として、ファイル名に乱数(予測されない文字 列)を含める方法がある。この方法を練習してみなさい。

なお、cp コマンド等でコピーした場合には、ps コマンドで引数が表示される ことがある。このことを確認しなさい。ファイル名を秘匿してdrop box に書き 込む時には、ps で表示されない方法を使う必要がある。その方法を考えなさい。

練習問題(3050) ディレクトリのGIDの伝播

UIDとGIDの伝播を確認しなさい。 /tmp など、誰でも書き込みできる場所にファイルを作成すると、その ファイルの UID 属性はどうなるか調べなさい。新たに実験用のディレクトリを mkdir コマンドで作成しなさい。そのディレクトリのGID属性を chgrp で変更 し、その中に新たなファイルやディレクトリを作成したら、その GID がどう設 定されるかを確かめなさい。また、既存のファイルをmv コマンドで移動したら どうなるかを調べなさい。

◆シェル変数と環境変数

練習問題(3051) シェル変数の確認

setコマンドに引数付けないで実行すると、全てのシェル変数(環境変数含む)の 値が表示される。
$ set [←]
$ set | lv [←]
どのようなシェル変数が設定されているか観察しなさい。

練習問題(3052) printenvコマンド

printenvtコマンドに引数付けないで実行すると、全ての環境変数の値が表示さ れる。これを確認しなさい。
$ printenv [←]
$ printenv | lv [←]

練習問題(3053) 環境変数の確認

個々の環境変数の値がどうなっているか、echo コマンドや printenv コマンド で確認することができる。
$ echo $HOME [←]
/home/prof/yas
$ printenv HOME [←]
/home/prof/yas
$ []
注意: echo の引数には、$ を付けるが、 printenv の引数には、$ を付けない。

次のような環境変数の値を調べなさい。

注意:環境変数が設定されていないことがある。

練習問題(3054) 環境変数 TZ の動作

次のようなコマンドを打ち、環境変数 TZ の働きを調べなさい。
$ date [←]
$ echo $TZ [←]
$ export TZ=EST    [←]
$ date [←]
$ unset TZ [←]
$ date [←]
$ []
環境変数 TZ/usr/share/zoneinfo/ の下にあるファイル名 を設定して、その動作を確認しなさい。

練習問題(3055) 環境変数 HOME

環境変数 HOME の値を調べなさい。
$ echo $HOME [←]
cd コマンドの引数に与えて、ホーム・ディレクトリや ホーム・ディレクトリ以下のディレクトリに移動してみなさい。
$ cd / [←]
$ pwd [←]
$ cd $HOME [←]
$ pwd [←]
$ cd / [←]
$ pwd [←]
$ cd $HOME/Maildir [←]
$ pwd [←]
$ []
ファイル名の置き換え機能「~/」を使う方法と環境変数 HOME を使う方法を比 較しなさい。

練習問題(3056) 環境変数 PATH

環境変数 PATH の働きを次のようにして調べなさい。
$ echo $PATH [←]
(表示を確認する)
$ aaaa [←]
-bash: aaaa: command not found     (エラーの表示)
$ ls [←]
(普通に実行される)
$ which ls [←]
/usr/bin/ls
$ PATH=/ [←]
$ ls [←]
-bash: ls: command not found     (エラーの表示)
$ exit [←]
この例ではPATH の内容がかなり限定され、普段は実行できるコマンドが実行で きなくなっている。それで、最後に exit コマンドでシェルを終了している。 シェルが必要ならば、もう一度端末を実行するか ssh でログインしてシェルを実行する。

練習問題(3057) シェル変数の操作

シェル変数を使って、長いファイル名やディレクトリ名を簡単に打ちなさい。
$ u=/usr/local3/coins/linux/bin [←]
$ echo $u [←]
/usr/local3/coins/linux/bin
$ ls $u/ruby [←]
/usr/local3/coins/linux/bin/ruby
$ ls $u/jupyter [←]
/usr/local3/coins/linux/bin/jupyter
$ []

練習問題(3058) 「*」のエスケープ

「*」は、シェルが解釈するメタキャラクタの1つである。 ファイル名置換 で、ファイル名に置換られる。
$ echo * [←]
(ファイル名の並び)
$ ls -ld * [←]
(ls -ld の結果)
$ []
次のようにして、「*」をエスケープして、ファイル名置き換えの動作を無効化 できることを確認しなさい。
 $ echo \*[←]
 *
 $ ls -ld \*[←]
 ls: *: No such file or directory
 (「*」というファイルが存在しないというエラー・メッセージ。エラーが出ることが正しい動作。)
 $ echo '*'[←]
 *
 $ ls -ld '*'[←]
 ls: *: No such file or directory
 $ echo "*"[←]
 *
 $ ls -ld "*"[←]
 ls: *: No such file or directory
 $ []

練習問題(3059) 様々なシェルのメタキャラクタのエスケープ

練習問題 「*」のエスケープ と同様に、様々な メタキャラクタ を表示してみなさい。
$ echo '< > | { } ( ) [ ] & ; ^ " * ? ~'[←]
< > | { } ( ) [ ] & ; ^ " * ? ~
$ echo "< > | { } ( ) [ ] & ; ^ ' * ? ~"[←]
< > | { } ( ) [ ] & ; ^ ' * ? ~
$ echo \< \> \| \{ \} \( \) \[ \] \& \; \^ \" \* \? \~[←]
< > | { } ( ) [ ] & ; ^ " * ? ~
$ []

練習問題(3060) 変数とクォートの働き

bash で ダブルクォート「" "」 や シングルクォート 「' '」の働きを調べなさい。
$ echo $HOME [←]
(表示の確認)
$ echo "$HOME" [←]
(表示の確認)
$ echo '$HOME' [←]
(表示の確認)

練習問題(3061) historyコマンド

history コマンドで、どのようなコマンドを打ち込んできたかを調べなさい。
$ history [←]
$ history | tail -5 [←]
(過去の5行だけ表示)
$ history | grep cd [←]
(cd を含む行だけ表示)
$ history | lv [←]
(ページャ lv でページ単位で表示。)

練習問題(3062) historyを使ったコマンドの実行

history の結果を用いて、過去のコマンドを再実行してみないさい。

練習問題(3063) シェル変数 HISTFILESIZE

シェル変数 HISTFILESIZE の値を調べなさい。
$ echo $HISTFILESIZE [←]
history コマンドで表示されるコマンドの数を調べなさい。
$ history [←]
<表示>
$ history | wc [←]
$ []
wc は、word count の略で、行数、単語数、バイト数を表示する。一番左が行 数である。 シェル変数 HISTFILESIZE の値を変化させると、何が起きるか調べなさい。

練習問題(3064) シェル変数 PS1

シェル変数 PS1 を表示しなさい。
azalea15:~ yas$ echo $PS1[←]
\h:\W \u\$
azalea15:~ yas$ []
この時、"$PS1" のようにダブルクォートでエスケープしないとうまく表示できないことがある。この理由を考えなさい。 シェル変数 PS1 は、シェルのプロンプトを保持している。これを変更してみな さい。
azalea15:~ yas$ PS1='hi$ '[←]
hi$
hi$ []

マニュアル man bash で、PS1 変数(PROMPTING)の中で次のような表現がどのような意味を 持っているかを調べなさい。

man bash の中では、ページャ lv (less) の 「/」 による検索が便利である。

練習問題(3065) シェル変数と環境変数の比較

シェル変数と環境変数を比較しなさい。 練習問題 シェル変数の確認練習問題 printenvコマンド の結果を比較しなさい。変数を次の3つに分けて数を数えなさい。 シェル変数の方が数は多い。環境変数にしか現れないものは存在するか。
$ set | wc [←]
     88     128    2643
$ set | lv [←]
(表示省略。q で終了)
$ printenv | wc [←]
     41      47    1435
$ printenv | lv [←]
(表示省略。q で終了)
$ []

練習問題(3066) クォートと改行

ダブルクォート「" "」 や シングルクォート 「' '」は、中に改行を含めることができる。逆に言うと、必ず閉じる 必要がある。閉じられていない場合には、シェルのプロンプトが$ から > に変化する。このことを確認しなさい。
$ echo "a [←]
> b[←]
> c"[←]
(表示の確認)
$ echo 'a [←]
> b[←]
> c'[←]
(表示の確認)
$ []

練習問題(3067) ~/.bashrcの観察

自分のホーム・ディレクトリにある ~/.bashrc の内容を観察しなさい。
 $ cat ~/.bashrc[←]
 #
 # coins standard ~/.bashrc
 #
 if [ -f /usr/local/lib/standard/bashrc ]; then
	 . /usr/local/lib/standard/bashrc
 fi

 # add your own code below
 $ []

◆シェル・スクリプト

練習問題(3068) 1行からなるシェル・スクリプトの作成

次の手順で 1 行からなるシェル・スクリプトを作成しなさい。

まず、端末で何かコマンドを実行しなさい。以下の例では、直接 Linux にロ グインしている状態か、または、リモートデスクトップでログインしている状 態で、「システムプログラム」の授業のページを標準の Web ブラウザで開い ている。

以下の open コマンド (xdg-open コマンド) は、ファイル名、または、URL を引数により、それを開くようなプログラムを実行する。以下の例では、URL を引数により、Web ブラウザを実行して、そのページを開いている。

$ ls -l /usr/bin/open [←]
lrwxrwxrwx 1 root root 22  2月  6 14:50 /usr/bin/open -> /etc/alternatives/open
$ ls -l /etc/alternatives/open [←]
lrwxrwxrwx 1 root root 17  2月  6 14:50 /etc/alternatives/open -> /usr/bin/xdg-open
$ open https://www.coins.tsukuba.ac.jp/~syspro/2023/ [←]
(^p で1行もどす。^a で、行頭に移動して 「echo '」と打ち、^e して
「' >  open-syspro」 と打つ)
$ echo 'open https://www.coins.tsukuba.ac.jp/~syspro/2023/'  > open-syspro [←]
$ cat open-syspro [←]
open https://www.coins.tsukuba.ac.jp/~syspro/2023/
$ []
bash の機能で、^p (Control+P) で1行戻して、echo でファイルに落とす。 echo には、実行したコマンドを 「'シングルクォート'」で括る( '|') などして、エスケープして与えると安全である。

作成したファイルは、そのまま実行できる。

$ bash open-syspro [←]

いちいち bash と打たないでもいいようにするために、chmod コマンド で実行可能属性をつける。

$ ls -l open-syspro [←]
-rw-r--r--  1 yas  prof  34  6 16 15:08 open-syspro
$ chmod +x open-syspro [←]
$ ls -l open-syspro [←]
-rwxr-xr-x  1 yas  prof  34  6 16 15:08 open-syspro
$ ./open-syspro [←]
$ ~/open-syspro [←]
$ []
エディタ(Emacs)で1行目に「#!/bin/bash」か「#!/bin/sh」を入れる。
#!/bin/bash
open https://www.coins.tsukuba.ac.jp/~syspro/2023/ 

完成したコマンドを ~/bin に移動する。

$ mkdir ~/bin [←]
(注意: mkdir は、1度だけ実行すればよい。)
$ mv open-syspro ~/bin [←]
$ open-syspro [←]
$ []

練習問題(3069) fileコマンド

file コマンドは、ファイルの種類を推定して表示するコマンドである。ファイ ルの拡張子がなくても、画像や HTML 等を推定できる。
$ file .bashrc .emacs /bin/ls public_html/index.html.en [←]
.bashrc:                   ASCII text
.emacs:                    Lisp/Scheme program, ASCII text
/bin/ls:                   ELF 64-bit LSB pie executable, x86-64, version 1 (SYS
V), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=8
97f49cafa98c11d63e619e7e40352f855249c13, for GNU/Linux 3.2.0, stripped
public_html/index.html.en: HTML document, ASCII text, with escape sequences
$ []

練習問題(3070) シェル・スクリプトの例

/usr/bin には、C 言語で記述したソース・プログラムをコンパイルして作成し たプログラムの他に、シェル・スクリプト(主に/bin/sh)も含まれている。どの ようなシェル・スクリプトがあるかを調べなさい。
$ cd /usr/bin [←]
$ file * | grep shell [←]
$ []

そのプログラムが、一般のプログラム(機械語)かシェル・スクリプトかは、 file コマンドを使うと調べることができる。

$ cd /usr/bin[←]
$ ls -l zless[←]
-rwxr-xr-x 1 root root 2206  9月  5  2022 zless
$ file zless[←]
zless: POSIX shell script, ASCII text executable
$ head zless[←]
#!/bin/sh

# Copyright (C) 1998, 2002, 2006-2007, 2010-2018 Free Software Foundation, Inc.

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
$ []

練習問題(3071) sortコマンド

sort コマンド は、データを並べ替えるプログラムである。データは、引数で指 定されたファイル、または、標準入力から受け取る。結果は、標準出力、また は、-o で指定されたファイルに書き出すプログラムである。

1行に1つ、なにかの名前(人名、果物の名前)を含むファイルを作成しなさい。 sort コマンドを使って、並べ替えなさい。

$ emacs fruits.txt [←]
$ sort  fruits.txt [←]
$ sort < fruits.txt [←]

sort コマンドでよく使うオプション

-n
数値として比較
-r
逆順でソート
-f
大文字小文字を区別しない
-k 番号
番号で指定されたフィールド以降をソートする。
-o filename
結果を filename に保存

練習問題(3072) コマンド単体の復習

今日の課題では、シェル・スクリプトを作成するために今まで利用したコマンド を利用する。 次のようなコマンドの使い方を復習しなさい。

練習問題(3073) 数字だけを表示するdate

date は、日本語の環境では「年月日」などを含めて表示する。これを数字だけを表 示するようなシェル・スクリプト date-num を作成しなさい。
$ date [←]
2023年 4月15日 金曜日 12時12分46秒 JST
$ date-num [←]
2023-04-15
$ []
ヒント: man date と man strftime 参照。 date コマンドの + で、strftime の説明にある format string を指定する。

練習問題(3074) 世界の都市の時刻を表示するdate

自分が関心がある世界の2つ以上の都市を選びなさい。それらの都市の現在時刻 を表示するシェル・スクリプトを作成しなさい。
$ date-cities [←]
Asia/Tokyo
2023年 4月15日 金曜日 12時56分51秒 JST
Europe/London
2023年 4月15日 金曜日 04時56分51秒 BST
America/New_York
2023年 4月14日 木曜日 23時56分51秒 EDT
$ []

ヒント: date コマンドは、 環境変数の利用方法(TZ) で、表示を変化させる。

ヒント: 都市の情報は、/usr/share/zoneinfo/ にある。 夏時間(daylight saving time/summer time)により、 経度の標準からずれていることもある。

ヒント: 画面に都市名を表示するには、echo コマンドが使える。

練習問題(3075) ディレクトリの属性を表示するls -l

ls -l にディレクトリ名を与えるとその内容が表示される。-d オプションを付 けると、ディレクトリ自身の属性が表示されるが、しばしばこのオプションを 忘れてしまう。そこで、次のようなシェル・スクリプト lldir を作成して、ディ レクトリの属性を簡単に表示するようにしなさい。
$ lldir ~ [←]
drwxr-xr-x  59 yas  prof  12288  6 16 15:37 /home/prof/yas
$ lldir / [←]
drwxrwxr-t  27 root  admin  1326  4 22 15:43 /
$ []

練習問題(3076) platexを2回実行するシェル・スクリプト

platx コマンドは、参照を解決するためにしばしば2 回実行する必要がある。 それを簡単にするためのシェル・スクリプト l2 を作成しなさい。
$ l2 file [←]
ヒント: 引数には、拡張子 .tex 無しのファイル名を受け付けた方が、シェル スクリプトが簡単になる。

練習問題(3077) platex、dvipdfmx、Preview.appの連続実行

platex コマンド、dvipdfmx コマンド、Preview.app (プレビュー.app) を次々と実行するシェル・スクリプトを作成しなさい。

$ lpshow file [←]
(画面には、file.pdf が Preview.app で表示される)
ヒント: 引数には、拡張子 .tex 無しのファイル名を受け付けた方が、シェル スクリプトが簡単になる。

ヒント: 拡張子 .pdf を持つファイルを open コマンドで開くと、標準では Preview.app が動作するが、他のプログラム(例えば Adobe Reader)にも変更で きる。この課題でも他のプログラムを使ってもよい。

練習問題(3078) 「.」から始まるファイルだけを表示するls

ls コマンドや bash の * では、「.」から始まるファイルは表示されない。逆 に「.」から始まるファイルだけを表示する ls コマンドを作りなさい。
$ ls-dot ~ [←]
.
..
.bashrc
.emacs
.login
$ []
ヒント

方法1:シェルの ファイル名置換でよく使われるパタン を利用し、「.*」というパタンで探す。

方法2: ls に -a オプションを付けると、全てのファイルを表示し、 そのうち、先頭が「.」のものを抜き出す。 先頭が「.」のものを抜き出すには、 grep コマンドで次のパタンを検索する。

$ grep '^\.' [←]
abc[←]
.abc[←]
.abc
aaa[←]
.aaa[←]
.aaa
^D
$ []

余裕があれば、-l などのオプションが付けられるようにしなさい。

練習問題(3079) ディレクトリだけを表示するls

ディレクトリだけを表示する ls コマンドを作りなさい。
$ lsd ~ [←]
Desktop/
Documents/
Downloads/
Library/
Mail/
Maildir/
Movies/
Music/
Pictures/
WinFiles/
bin/
public_html/
$ []
方法1: ls -F の結果から grep で「/」がついているものだけを抜き出す。

余裕があれば、-l などのオプションが付けられるようにしなさい。 余裕があれば、ls と同じように、ファイル名の順に並べ替えなさい。

練習問題(3080) ファイルの行数の順に表示するwc

wc コマンド は、ファイルの行数、単語数、バイト数を表示する。wc コマンド は、引数で与えられた順に表示する。これを行数の順に表示するようなスクリ プトを作りなさい。
$ wc-lines *.c [←]
      85     228    1836 proc-uid-print.c
      75     187    1156 pipe-rw-dup.c
      50     152    1141 vaddr-print.c
      46     140    1071 proc-create.c
      67     161    1014 pipe-rw-nodup.c
      38      93     819 signal-int.c
      50      98     802 setjmp-longjmp.c
      32      90     561 run-n.c
      27      66     535 home-print.c
      20      50     424 cont-1.c
      20      50     424 cont-0.c
      25      60     419 t-system.c
      20      40     384 exec-date.c
      14      49     370 arg-print.c
      15      44     355 env-print.c
      12      32     305 cont-2.c
      13      16     174 fork-hello.c
       4      10      60 main-return.c
$ []
この課題では、合計(Total)は表示されなくてもよい。

ヒント:wc の出力を sort コマンドでソートする。for で1つずつ wc コマン ドを実行して、全体の結果を sort するか、引数 $* で wc した後、sort する。

練習問題(3081) 使っているメモリのサイズが大きいプロセスの表示

ps aux では、全プロセス(a)が、サイズなどの情報も含めて(u)表示される。
$ ps aux [←]
USER       PID  %CPU %MEM      VSZ    RSS   TT  STAT STARTED      TIME COMMAND
root         1   0.0  0.0  2456708   1356   ??  Ss   火08AM    1:26.40 /sbin/la
yas       3549   0.0  0.0  2435468    980 s000  Ss    3:40PM   0:00.01 -bash
yas       3548   0.0  0.0  2450900    748   ??  S     3:40PM   0:00.00 /usr/sbi
yas       3546   0.0  0.0  2456124    672   ??  Ss    3:40PM   0:00.01 /sbin/la
root      3544   0.0  0.1  2450900   4700   ??  S     3:40PM   0:00.27 /usr/sbi
root      3543   0.0  0.0  2446148    820   ??  Ss    3:40PM   0:00.00 /usr/lib
...
root        54   0.0  0.6  2468840  25220   ??  Ss   火08AM    0:43.01 /usr/lib
root      3556   0.0  0.0  2434788    428 s000  R+    3:40PM   0:00.00 ps aux
$ []
そのうち、メモリのサイズ(RSS)が大きいプロセスを 10 個だけ表示するシェル・ スクリプトを作りなさい。
$ ps-rss-top10 [←]
USER       PID  %CPU %MEM      VSZ    RSS   TT  STAT STARTED      TIME COMMAND
root       318   0.0  3.0   215076 127388   ??  Ss   火08AM    1:12.05 /Library/
root       104   0.0  0.9  2567852  37332   ??  Ss   火08AM    0:41.42 /System/L
_windowserver  1007   0.0  0.6  2775984  25560   ??  Ss   火05PM    0:31.43 /Sys
root        54   0.0  0.6  2468840  25220   ??  Ss   火08AM    0:43.01 /usr/libe
root      1599   0.0  0.6 11156056  24040   ??  Ss   水02PM    0:09.13 /System/L
_mysql     218   0.0  0.5  2510832  18940   ??  S    火08AM    0:57.74 /opt/loca
_securityagent  1019   0.3  0.4  2757796  15396   ??  S    火05PM    7:51.89 /Sy
root       305   0.0  0.3   152008  14292   ??  S    火08AM    0:31.75 /Library/
root      1010   0.0  0.2  2727284   7956   ??  Ss   火05PM    0:03.56 /System/L
root      1050   0.0  0.2  2777952   7676   ??  Ss   火05PM    0:00.66 /System/L
$ []
ヒント:1行目は、そのまま表示する。RSS の順(第6フィールド)に sort して head する。

余裕があれば、VSZ の順、CPU 時間の順に表示するスクリプトを作りなさい。

類似のことを実行するプログラムとして top がある。

練習問題(3082) カウントダウン

引数で与えられた数を、秒単位でカウントダウンしていくシェルスクリプトを作りなさい。 (Python 等のスクリプト言語で作成するのは不可。)
$ ./countdown 3 [←]
3
2
1
0
$ []

練習問題(3083) バックアップ・ファイルとのdiff

emacs は、ファイルを保存する時に、1つの前のバージョンを「~」を 付けて保存する。そのようなファイルを見つけて、オリジナルのファイルと diff コマンドで比較するようなスクリプトを作りなさい。
$ diff-backup kadai10.txt [←]
余裕があれば、比較しているファイルの名前を表示したり、ファイルごとに停 止する、引数を取る、diff に対するオプションを取る、などの工夫をしなさ い。

練習問題(3084) coins標準の bashrc の観察

自分のホーム・ディレクトリにある ~/.bashrc は、coins 標準のbashrc を「.」 コマンド (source コマン)ドで読み込んでいる。その読み込んでいる先のファ イルでどのような設定がなされているかを観察しなさい。
$ lv ~/.bashrc [←]
$ lv /usr/local/lib/standard/bashrc [←]
環境変数 PATHの値を観察しなさい。
$ echo $PATH [←]
環境変数 PATH に含まれているディレクトリには、どのようなコマンドがある かを調べなさい。例えば、/usr/local/bin を調べるには、次のようにする。
$ ls /usr/local/bin [←]
PATH 以外にどのような シェル変数と環境変数 が設定されているかを調べなさい。
$ set [←]
(全てのシェル変数と環境変数の表示)
$ set | lv [←]
(全てのシェル変数と環境変数の表示。lv によるページ単位の表示。)
$ printenv [←]
(環境変数の表示)
$ printenv | lv [←]
(環境変数の表示。lv によるページ単位の表示。)
$ []

練習問題(3085) ~/.bashrcでのシェル変数の登録

シェルに対してよく打ち込む長い文字列を、~/.bashrc で シェル変数に設定 してみなさい。

注意: ~/.bashrcの編集は慎重に に行うこと。 もし ~/.bashrc に間違いが含まれた場合、端末のウィンドウが開かなくなる、 ssh で遠隔ログインができなくなる 等の問題が生 じることがある。(端末プログラムがウィンドウを開いても、すぐに bash が終了するので、 ウィンドウを閉じてしまう、ssh で遠隔ログインしても、すぐにログアウトしてしまう ことがある。)

~/.bashrc に alias の定義を追加しても、既に実行しているシェルには反映さ れない。実行しているシェルに反映させるには、「.」コマンドを用いる。 ~/.bashrcの編集結果の反映参照。

練習問題(3086) エイリアス ll の定義

以下の例を真似て、bash の alias 機能を用いてls -l の代わりに ll というコマンドを使えるようにしなさい。

$ ls -l [←]
total 80
-rw-r--r--  1 yas  prof  36224  6 16 16:24 index.html
-rw-r--r--  1 yas  prof   4459  6 16 16:24 screen-tab.png
$ ll [←]
-bash: ll: command not found
          # この時点ではコマンドは見つからない
$ alias ll='ls -l' [←]
          # alias による ll コマンドの定義
$ ll [←]
total 80
-rw-r--r--  1 yas  prof  36224  6 16 16:24 index.html
-rw-r--r--  1 yas  prof   4459  6 16 16:24 screen-tab.png
$ []

練習問題(3087) bash alias 関連のコマンド

bash の alias 関連のコマンドを利用してみなさい。
一覧表示
alias コマンドを引数なしで実行する。例:
$ alias [←]
単独表示
alias コマンドに名前を引数として与える。例:
$ alias ll [←]
定義
alias コマンドに「名前='定義内容'」 を引数として与える。例:
$ alias ll='ls -l' [←]
削除
unalias コマンドに名前を引数として与える。例:
$ unalias ll [←]

練習問題(3088) bashのエイリアスの~/.bashrcへの登録

bash の alias は、定義したシェルでのみ有効である。 全部のシェルで有効にするためには、 ~/.bashrc に登録する必要がある。

注意: ~/.bashrcの編集は慎重に に行うこと。 もし ~/.bashrc に間違いが含まれた場合、端末のウィンドウが開かなくなる、 ssh で遠隔ログインができなくなる 等の問題が生 じることがある。(端末プログラムがウィンドウを開いても、すぐに bash が終了するので、 ウィンドウを閉じてしまう、ssh で遠隔ログインしても、すぐにログアウトしてしまう ことがある。)

~/.bashrc に alias の定義を追加しても、既に実行しているシェルには反映さ れない。実行しているシェルに反映させるには、「.」コマンドを用いる。 ~/.bashrcの編集結果の反映参照。

 $ cat ~/.bashrc
 #
 # coins standard ~/.bashrc
 #
 if [ -f /usr/local/lib/standard/bashrc ]; then
	 . /usr/local/lib/standard/bashrc
 fi

 # add your own code below

 alias ll='ls -l'
          # ~/.bashrc に ll を追加した
 $ ll[←]
 bash: ll: command not found
          # 追加しただけでは、コマンドは見つからない
 $ . ~/.bashrc[←]
          # 「.」コマンドで、~/.bashrc を読み込む
 $ ll
 (ls -l の表示)
          # ll コマンドが有効になっている。
 $ []

練習問題(3089) 1行からなるエイリアスの定義

1行からなるシェル・スクリプトと同様に、1行からなるエイリアスを定義しなさい。

練習問題(3090) LANGを変更するalias

環境変数LANGを次のものに変更するようなalias を定義しなさい。 手引き 2.7.2 参照。 ページャ lv には、検索機能がある。 にあるキーの動きを確かめなさい。

練習問題(3092) ls -Rコマンド

ls コマンドには、-R (大文字 R, Recursive) というコマンドがあり、 引数で指定されたディレクトリに子供のディレクトリが含まれていたら、 その子供についても表示する(子供にも子供があればそれも表示する)。 この動きを確かめなさい。
$ cd ~ [←]
$ ls -R    . | lv [←]
$ ls -lR   . | lv [←]
$ ls -laR  . | lv [←]
-R オプションは、このようにしばしば-l オプションや -a オプションと一緒に使われる。また、-R オプションは、大 量の結果を表示することが多いので、パイプに出力してページャで表示するこ とが多い。 (これらのオプションを忘れた人は、man コマンドを見なさい。)

練習問題(3093) treeコマンド

treeコマンド を利用してみなさい。

練習問題(3094) シンボリック・リンクの調査

ls -l を使って、次のディレクトリにどのようなシンボリック・リンクがある かを調べなさい。 ls コマンドと grep コマンドを組み合わせて使うと便利である。
$ ls -l /Applications | grep '^l' [←]
ここで、'^l' は、 行の先頭がl で始 まるという意味である。 。

練習問題(3095) cp -rコマンド

cp -r の動作について調べなさい。 実際に実行して動作を確認しなさい。

練習問題(3096) scp -rコマンド

scp の -r オプションの動作について調べなさい。 実際に実行して動作を確認しなさい。 シンボリック・リンクをどのように扱うか試してみなさい。

練習問題(3097) tarコマンドによるファイルのコピー

tar コマンドを用いて、ファイルをコピーしなさい。 シンボリック・リンクをどのように扱うか試してみなさい。 ssh と組み合わせることで、異なるコンピュータ間でファイルをコピーできることを確認しなさい。 。

練習問題(3098) Finder によるエイリアスの作成

Finder で ファイルに対するエイリアスを作成してみなさい。

練習問題(3099) Emacs Dired によるディレクトリ木の表示

Emacs に含まれている Directory Editor を利用して ディレクトリ木を表示しなさい。 テキストファイルを開いたり、削除したり、改名したりしなさい。 。

練習問題(3100) lynx,w3m コマンドによるディレクトリ木の表示

lynx や w3m のように、端末で動作する Web ブラウザを利用してディレクトリ 木を表示しなさい。
$ lynx . [←]
$ lynx ~ [←]
$ w3m . [←]
$ w3m ~ [←]

◆ファイルの整理

練習問題(3101) quotaの表示

quotaコマンド の説明を参考にして、 自分が保持しているファイルが、ディスク上でどの程度の領域を占めているの かを調べなさい。また、上限(quota limit) がいくつかを調べなさい。

2023/04/20 注意。 smbclient は、azalea か jelly では動作する。 violet01, violet03 (www) ではうまく動作しないかもしれない。

この結果と、 du コマンド の結果を比較しなさい。

$ du -s -k ~ [←]
(表示までに時間がかかる。強制終了したければ、^C)

練習問題(3102) du コマンド

du コマンドを利用してみなさい。 引数に調べたいディレクトリ名を与える。ディレクトリ名としては、「.」や 「~」も可であるが、ファイルの数が多い時に表示までに時間がかかる。途中で やめたくなった時には、 ^C (Control+C) で強制終了する。
$ cd  [←]
$ du * [←]

練習問題(3103) du コマンドのオプション

du コマンドのオプションの動きを確認しなさい。 sort コマンドや head コマンドと組み合わせて使ってみなさい。 du コマンドの説明を参照。

$ du -s * [←]
$ du -s -h * [←]
$ du -s -k * [←]

練習問題(3104) Firefox Webブラウザのキャッシュの設定

自分が使っている Web ブラウザで、次のことを調べなさい。 手引き 10.10 参照

練習問題(3105) その他の Webブラウザのキャッシュの削除

Web ブラウザのキャッシュを削除してみなさい。削除方法は、次の資料を参照 しなさい。 ここには、次の3つのブラウザについて、削除方法が記載されている。

◆Emacs(2) 複数ファイルの扱い

練習問題(3106) Emacsの復習

Emacs で、ファイルを作成する方法を復習しなさい。

方法1: 引数にファイル名を与える方法。

方法2: 実行後にファイル名を与える方法

練習問題(3107) Emacs emacs、タブキーによる補完機能

練習問題 emacs、タブキーによる補完機能 を行いなさい。

練習問題(3108) Emacs 他のファイルへの保存

Emacs で別のファイルへ保存する機能を練習しなさい。

練習問題(3109) Emacs、カットの復習

Emacsの カット&ペースト、コピー&ペースト の機能を用いて、カット機能を使って大量のテキストを削除してみなさい。 この機能は、次のような時に有用である。 カットの練習をする時には、まずファイルをコピーする必要がある。 ファイルをコピーするには、次のような方法がある。 Emacs でカットを行うには、次のようにする。
  1. 削除したいテキストの先頭にカーソルを移動させる。
  2. C-SPC、または、C-@ でマークを設定する。
  3. 削除したいテキストの末尾にカーソルを移動させる。
  4. C-wでカットする。
macOS で C-SPC でマークを設定したいのに、できない場合には、 「システム環境設定>キーボード>ショートカット」で Spotlight や入力ソースの切り替えに割当てられている ショートカット・キーを変更したり解除すると良い。

練習問題(3110) Emacs でコピー&ペーストで用いるキー

Emacs で、次のキー操作の動作を調べなさい。
キー 説明
C-SPC または C-@ コピーする領域の先頭を決める(マークを設定する)
C-w マークした部分とカーソルの間の領域をカットする
Esc w または M-w マークした部分とカーソルの間の領域をコピーする
C-y コピー、または、カットしたものをペーストする

練習問題(3111) Emacs でのコピー&ペースト

、 , 手引き 3.3.5項 参照。 Emacs で、キー操作よるコピー&ペーストの練習をしなさい。
  1. 内容を壊してもよいテキストファイルを作成する。 たとえば、以前に提出したレポートを、cp コマンドでコピーする。
  2. Emacs を実行する。
  3. C-x C-f で、1.のファイルを開く。
  4. コピーしたい部分の先頭にカーソルを移動する。 カーソル移動キーC-f,C-b,C-n,C-pの他に、 文字単位の移動の他に、ページ単位の移動 C-v,M-v,Esc vも有用である。
  5. C-SPC または C-@ で、マークを設定する。 もし、macOS でC-SPC がうまく動かない時には、 Spotlight のショートカット・キーの解除 を行う。 Windowsで端末を開きsshコマンドを利用 している時は、C-SPCC-@ が使えないことがある。 その時は、Tera Term 等を使う。
  6. カーソルを、コピーしたい部分の末尾に移動する。
  7. M-w または Esc w でコピーする。
  8. カーソルを、ペーストしたい部分に移動する。
  9. C-y でペーストする。
同様に、次の操作を確認しなさい。

練習問題(3112) Emacs で複数のウインドウとバッファの操作

Emacs で、次のキー操作の動作を調べなさい。
キー 説明
C-x 2 ウインドウを2つに分割(現在のバッファを複数ウインドウで表示)
C-x 1 ウインドウを1つにする(他のウインドウを閉じる)
C-x 0 現在のウインドウを閉じる
C-x o 他の(other)ウインドウにカーソルを移動。
C-x C-b バッファのリストを表示
C-x b 別のバッファを表示する
手引き 3.5.1項 参照

練習問題(3113) Emacs で長いファイルの編集

Emacs のウインドウを開く機能(C-x 2)は、1画面に入らないような大 きなファイルを部分的に表示する時に有用である。このことを確認しなさい。
  1. Emacs を実行する。
  2. C-x C-f で、ファイルを開く
  3. カーソル移動のキーで、表示したい部分を表示する。 文字単位の移動の他に、ページ単位の移動も有用である。
  4. C-x 2 で、ウインドウを2つに分割する。
  5. C-x o で、カーソルをもう1つのウインドウに移動
  6. カーソル移動のキーで、別の表示したい部分を表示する。
  7. 以後、C-x o で、カーソル行き来しながら編集を進める。 よく使われる操作は、1つのファイルから別のファイルへの コピー&ペーストやカット&ペースト。片方のバッファで コピー、または、カットして、別のバッファへ移動してペーストする。
  8. C-x C-s で、ファイルを保存
  9. C-x C-c で、Emacs を終了する

練習問題(3114) Emacs で複数のファイルの編集/2つのウインドウ

次の手順で、Emacs で複数のファイルを同時に編集してみなさい。
  1. Emacs を実行する。
  2. C-x C-f で、ファイルを開く
  3. C-x 2 で、ウインドウを2つに分割する。
  4. C-x o で、カーソルをもう1つのウインドウに移動
  5. C-x C-f で、ファイルを開く
  6. 以後、C-x o で、カーソル行き来しながら編集を進める。 よく使われる操作は、1つのファイルから別のファイルへの コピー&ペーストやカット&ペースト。片方のバッファで コピー、または、カットして、別のバッファへ移動してペーストする。
  7. C-x C-s で、ファイルを保存
  8. C-x o で、カーソルをもう1つのウインドウに移動
  9. C-x C-s で、ファイルを保存
  10. C-x C-c で、Emacs を終了する

練習問題(3115) Emacs で複数のファイルの編集/見えないウインドウ

次の手順で、Emacs で複数のファイルを同時に編集してみなさい。
  1. Emacs を実行する。
  2. C-x C-f で、ファイルを開く
  3. C-x C-f で、ファイルを開く
  4. 以後、C-x b で、バッファを切り替える。 補完機能が使える。タブキーを押すと、バッファの一覧が表示される。
  5. 以後、 C-x b で、バッファを切り替えながら編集を進める。 よく使われる操作は、1つのファイルから別のファイルへの コピー&ペーストやカット&ペースト。片方のバッファで コピー、または、カットして、別のバッファへ移動してペーストする。
  6. C-x C-s で、ファイルを保存
  7. C-x b で、カーソルをもう1つのウインドウに移動
  8. C-x C-s で、ファイルを保存
  9. C-x C-c で、Emacs を終了する
手引き 3.3.7 参照。 Emacs のインクリメンタルサーチ機能を使ってみなさい。 C-s (上から下方向の検索)の代わりに、C-r (下から上方向の検索)を利用してみなさい。 インクリメンタル・サーチとカーソル移動(矢印キー、C-v, M-v)とを比較して、 インクリメンタル・サーチの利点を考えなさい。 Emacs で非インクリメンタルな検索機能を使ってみなさい。

練習問題(3119) Emacs query-replace

Emacs で query-replace を利用してみなさい。
  1. 練習用に、内容が破壊されても問題ないファイルを用意する。 たとえば、過去に提出したレポートを cp コマンドでコピーする。
  2. そのファイルを emacs 開く
  3. M-% (Esc %)と打つ
  4. 以後、Emacsの検索と文字列の置換え参照。

練習問題(3120) Emacs query-replace

次のテキストを Emacs のバッファにコピーしなさい。

GNU Emacs is a version of Emacs, written by the author of the original
(PDP-10) Emacs, Richard Stallman.  The primary documentation of GNU
Emacs is in the GNU Emacs Manual, which you can read on line using
Info, a subsystem of Emacs.  Please look there for complete and
up-to-date documentation.  This man page is updated only when someone
volunteers to do so; the Emacs maintainers' priority goal is to
minimize the amount of time this man page takes away from other more
useful projects.  The user functionality of GNU Emacs encompasses
everything other Emacs editors do, and it is easily extensible since
its editing commands are written in Lisp.
Emacs の query-replace の機能を 使って、上の文書の「Emacs」の部分を自分の学籍番号に変えなさい。

練習問題(3121) a: grep、egrepとパイプ

正規表現の検索機能を用いて、次のファイルやコマンドの出力から 目的のもの検索して画面に表示しなさい。選択ではなく、全て実行しなさい。 なお、grepコマンドで OR の機能が必要ならば、-e オプションを複数与える方 法がある。egrep コマンドの「|」を用いれば 1 回で終わることもある。 レポートには、コマンドラインと実行結果を含めなさい。実行結果が10行以上 に渡る時には、途中を省略しなさい。アクセス・ログに自分のページへのアク セスがない場合には、Web ブラウザでアクセスしてログに含ませなさい。

◆Webページの作成、アクセスログ、Webページに対するアクセス制御

練習問題(3122) WebブラウザーでのHTMLの観察

Firefoxブラウザを操作して、 元の HTML (ソース)を表示 しなさい。

  1. HTML を表示したいページを Firefox で普通に表示する
  2. 表示されたページで、何も表示されていない部分(白い部分)にマウスの ポインタを移動して、マウスの主ボタン(左ボタン)でクリックする。(何か選 択している状態だったらこれで解除される。)
  3. マウスの副ボタン(右ボタン)でコンテキスト・メニューを表示する。
  4. コンテキスト・メニューから「ページのソースを表示」を選ぶ。

練習問題(3123) lsコマンドによるディレクトリとファイルの属性の表示

ls -l により、ディレクトリとファイルの属性を表示しなさい。 必要に応じて lsの-dオプションによるディレクトリそのものの表示 を行いなさい。 (ls コマンドに -ld (-dl, -l -dでも可)オプションを付けなさい。)
$ ls -l literacy-a2.txt [←]
(1つのファイルの属性の表示)
$ ls -l literacy-a*.txt [←]
(複数のファイルの属性の表示)
$ ls -ld ~ [←]
(ホーム・ディレクトリの属性の表示)
$ cd [←]
(ホーム・ディレクトリへ移動)
$ ls -ld  [←]
(カレントワーキングディレクトリ==ホーム・ディレクトの属性の表示)

ファイルの属性 を参考にして、ls -l の結果を、解釈しなさい。今日の実習では特に 次の属性について着目しなさい。

r	読込み可
w	書込み可
x	実行可(ディレクトリの場合は探索可)

練習問題(3124) Webページ用のディレクトリ作成

情報科学類での個人のホーム・ページ を作成しなさい。 次のディレクトリを作成し、それ以下にファイルを作成する。

このディレクトリを、mkdir コマンドで作成しなさい。
$ mkdir ~/public_html [←]
作成したディレクトリのその他(others)に対するアクセス許可で x ビットが立っ ていることを確認しなさい。
$ ls -ld ~/public_html [←]
drwxr-xr-x  5 yas  prof  4096  4 10 13:46 /home/prof/yas/public_html
         ^ここ
さらに、ホーム・ディレクトリにもその他(others)に対するアクセス許可で x ビットが立っていることを確認しなさい。
$ ls -ld ~ [←]
drwxr-xr-x  53 yas  prof  7168  5 15 15:25 /home/prof/yas
$ []
         ^ここ

x ビットがたっていない場合には、 ディレクトリのxの働き を理解し、 chmod コマンド で修正しなさい。

練習問題(3125) 単純なテキスト・ファイルの公開

注意:この練習問題は、練習問題 (3124)WWW ページ用のディレクトリ作成の後に行いなさい。

ディレクトリ ~/public_html/ の下に、単純なテキスト・ファイル (HTMLではない)を Emacs 等で作成して置きなさい。ファイル名の拡張子は、 「.text」または「.txt」としなさい。

作成したファイルのモードを調べなさい。file1.textという 名前のテキスト・ファイルを作成した場合、次のようにその他(others)に対す るアクセス許可で r ビットが立っていることを確認しなさい。

$ cd ~/public_html [←]
$ emacs file1.text [←]
(何か簡単な内容を打ち込み、保存して終了する。)
$ ls -l file1.text [←]
-rw-r--r--   1 yas  prof  2 May 22 22:09 file1.text
$ []
       ^ここ
作成したファイルを Web ブラウザで表示しなさい。たとえば、 file1.textという名前のテキスト・ファイルを作成した場合、 次のような URL で参照する。

ユーザ名」を、ログインの時に打つ自分のユーザ名で置き 換えなさい。たとえば、学籍番号が 202194321 の人は、次のような URL を開 きなさい。

HTTP で始まる URL には、public_html は含まれないことに注 意しなさい。

練習問題(3126) サンプルのコピー

注意:この練習問題は、練習問題 (3124)WWW ページ用のディレクトリ作成の後に行いなさい。

次の HTML ファイルを、ディレクトリ ~/public_html の下にコピー し、それを Web ブラウザ表示しなさい。

$ cd ~/public_html [←]
$ ls [←]
(sample1.htmlが存在しないことを確認する。)
$ cp ~yas/public_html/coins/literacy-2018/samples/sample1.html . [←]
$ ls -l sample1.html [←]
-rw-r--r--  1 yas  prof  525  5 14 16:19 sample1.html
$ []
最後のカレント・ワーキング・ディレクトリの意味の「.」を忘れないこと。 ls -l の結果、その他(others)に対するアクセス許可で r ビットが立っている ことを確認しなさい。

コピーした後、Web ブラウザで次の URL を開きなさい。

ユーザ名」を、ログインの時に打つ自分のユーザ名で置き 換えなさい。たとえば、学籍番号が 202194321 の人は、次のような URL を開 きなさい。

HTTP で始まる URL には、public_html は含まれないことに注 意しなさい。

練習問題(3127) 個人のホーム・ページの作成

個人のホーム・ページを作成しなさい)。 各自のホーム・ページは、次の HTML ファイルに対応する。

作成したホーム・ページを、Web ブラウザで開きなさい。 Web ブラウザで次の URL を開きなさい。

練習問題(3128) ディレクトリを指定した時のWebページの内容

URL でディレクトリを指定すると、自動的にそのディレクトリにある 「index.html」という名前のファイルが使われる。この機能を使うと、 各自のホーム・ページは、次のように短く表示できる。

この事を確認しなさい。また、ホーム・ページ以外のディレクトリについても、 この機能が有効なことを確認しなさい。

練習問題(3129) Web サーバ上のデータの観察

次の手順で、Web サーバ上のデータの観察のアクセスログを観察しなさい。

練習問題(3130) アクセスログの観察

情報科学類のWebサーバの Web アクセスログは、Webサーバ(www,www.coins.tsukuba.ac.jp)上の /var/log/httpd/ 以下のファイルにためられる。 これを、次のコマンドを利用しながら観察しなさい。 具体的な方法を以下に示す。
  1. 練習問題 Web サーバ上のデータの観察 と同様に、ssh コマンドで www.coins.tsukuba.ac.jp にログインする。 遠隔ログイン前後で、プロンプトの変化に注意すること。
  2. cd コマンドで、ログがあるディレクトリに移動する。 (hostname の結果が violet03 でない時には、 ssh コマンドで www.coins.tsukuba.ac.jp にログインすること。)
    $ hostname [←]
    violet03
    $ cd /var/log/httpd/ [←]
    $ pwd [←]
    /var/log/httpd
    $ []
    
  3. このディレクトリで、ls コマンドを実行しなさい。以下の例で、 access* の「*」は、 シェルの ファイル名置換 の意味である。
    $ ls [←]
    (多くのファイルが表示される)
    $ ls access* [←]
    (まだ多くのファイルが表示される)
    $ ls ssl_access* [←]
    (まだ多くのファイルが表示される)
    $ ls     access* | tail -1 [←]
    access_log_20230418
    $ ls ssl_access* | tail -1 [←]
    ssl_access_log_20230418
    $ []
    
    この例では、access_log_20230418 (http://のもの) と ssl_access_log_20230418 (https://のもの) が最新のものである。
  4. このファイルを lv コマンドで表示しなさい(スペースキー、bキー、qキーで操作)。
    $ lv     access上のlsの結果で置き換える [←]
    $ lv ssl_access上のlsの結果で置き換える [←]
    
    たとえば、上の例では、次のように打つ。
    $ lv     access_log_20230418 [←]
    
    $ lv ssl_access_log_20230418 [←]
    
  5. このファイルを、tail コマンドで表示しなさい。
    $ tail 上のlsの結果で置き換える [←]
    (表示がなされる。)
    (しばらく待つ。)
    $ tail 上のlsの結果で置き換える [←]
    (表示がなされる。)
    (しばらく待つ。)
    $ tail 上のlsの結果で置き換える [←]
    (表示がなされる。)
    $ []
    
    (しばらく間隔を空けてから)数回 tail コマンドを実行すると、その度に行 が増えているはずである。 たとえば、上の例では、次のように打つ。
    $ tail access_log_20230418 [←]
    $ tail access_log_20230418 [←]
    $ tail access_log_20230418 [←]
    $ []
    
    $ tail ssl_access_log_20230418 [←]
    $ tail ssl_access_log_20230418 [←]
    $ tail ssl_access_log_20230418 [←]
    $ []
    
Webサーバ・アクセスログ を参考にして、アクセスログの意味を解釈しなさい。

練習問題(3131) 学類 Web サーバのアクセス・ログの観察(grep)

自分自身で、情報科学類の Web ページをアクセスした時に、自分が使っている PC の IP アドレスが表示されることを確認しなさい。

  1. まず、Web ブラウザを実行しているコンピュータの の IP アドレスを調べなさい。 自宅のコンピュータでは、NAT (Network Address Translation) の仕組みが動作している ことがある。この場合は、 この講義の 「https://www.coins.tsukuba.ac.jp/~syspro/2023/report/present.cgi,出席ボタン」 を押すと、そこに表示されるので、それを利用する方法がある。 (出席ボタンは、何度押しても問題がない。授業時間外に押しても問題はない。 最終的に、授業時間内のものだけ集計される。 授業を履修していなくても、出席ボタンを押しても良い。 )
  2. 次のように grep コマンドを使って、IP アドレスを検索しなさい。
    $ grep IPアドレス アクセスログのファイル名 [←]
    
    たとえば、IP アドレスが 2001:2f8:3a:1711::230:30 であれば、次のように打つ。
    $ grep 2001:2f8:3a:1711::230:30 アクセスログのファイル名 [←]
    
    たとえば、IP アドレスが 130.158.230.30 であれば、次のように打つ。
    $ grep 130.158.230.30 アクセスログのファイル名 [←]
    
    ここで「アクセスログのファイル名」は、 練習問題 アクセスログの観察 で調べなさい。 たとえば、その練習問題の例では、次のように打つ。
    $ grep 2001:2f8:3a:1711::230:30     access_log_20230418 [←]
    $ grep 2001:2f8:3a:1711::230:30 ssl_access_log_20230418 [←]
    
もし、何も現れなければ、http: でこの講義の Web ページ http://www.coins.tsukuba.ac.jp/~syspro/2023/ をアクセスした後で、アクセスログ access* を検索してみなさい。

あるいは、https: この講義の Web ページ https://www.coins.tsukuba.ac.jp/~syspro/2023/ をアクセスした後で、アクセスログ ssl_access* を検索しなさい。

練習問題(3132) 学類 Web サーバのアクセス・ログの観察(tail-f)

ログのファイルを tail -f で表示してみなさい。
$ tail -f アクセスログのファイル名 [←]
ここで「アクセスログのファイル名」は、 練習問題 学類 Web サーバのアクセス・ログの観察 で調べなさい。 たとえば、その練習問題の例では、次のように打つ。
$ tail -f access_log_20230418 [←]
$ tail -f ssl_access_log_20230418 [←]
-f オプションを指定すると、tail コマンドは終了することなく新しく追加さ れた行を表示する。この tail コマンドは、自動的には終了しないので、終わっ たら、 ^C (Control+C) で強制終了させる。

練習問題(3133) .htaccessによるShibboleth認証の利用

次のドキュメントを参考にして、作成したディレクトリに .htaccess を作成し、 利用してみなさい。

練習問題(3134) .htaccessによるBasic認証のページ(htpasswd)

htpasswd コマンドを使ってパスワード・ファイルを作成しなさい。作成したパ スワード・ファイルを利用して、 Basic 認証 によりアクセス制御を行うように設定しなさい。 。

例:パスワード・ファイル /home1/prof/yas/etc/passwd-doc1 に登録されているユーザだけが、 .htaccess があるディレクトリ以下にあるファイルをアクセスできる。

.htaccess:

AuthType Basic
AuthName "Staff Only"
AuthUserFile /home1/prof/yas/etc/passwd-doc1
require valid-user
このパスワード・ファイルは、サーバ上でhtpasswd というプログラムで作成する。
$ htpasswd -c /home1/prof/yas/etc/passwd-doc1 user1 [←]
Adding password for user1.
New password:user1のパスワードを打ち込む[←]
Re-type new password:user1のパスワードを打ち込む[←]
$ htpasswd /home1/prof/yas/etc/passwd-doc1 user2 [←]
Adding user user2
New password:user2のパスワードを打ち込む[←]
Re-type new password:user2のパスワードを打ち込む[←]
$ []
一番最初は、-c オプション付で実行する。passwd コマ ンドと同様に、打ち込んだパスワードは、画面には表示されず、また、確 認のために2回打つ必要がある。

htpasswd コマンドの結果、次のようなファイルが作られる。

user1:1fjr1tHIgoG7U
user2:qXaeA9Zge7Yqc
ユーザ名と暗号化されたパスワード(正確にはパスワードのハッシュ値)から 構成される。

パスワードによるアクセス制御の例: 設定ファイル .htaccess

AuthType Basic
AuthName "Staff Only"
AuthUserFile /home1/prof/yas/etc/passwd-doc1
require valid-user

練習問題(3135) .htaccessによるBasic認証のページ(dbmmanage)

htpasswd コマンドの代わりに dbmmanage コマンドを使い、パスワード・ファ イルを作成しなさい。作成したパスワード・ファイルを利用して、Basic 認証 によりアクセス制御を行うように設定しなさい。

練習問題(3136) WWWページに対するIPアドレスによるアクセス制御

特定のIPアドレスのコンピュータからしか表示できないような WWW ページを作 成しなさい。逆に、特定のIPアドレスのコンピュータからは表示できないよう な WWW ページを作成しなさい。

◆Coins のメール

練習問題(3137) @coins.tsukuba.ac.jp のメール

情報科学類のコンピュータにアカウントを作成した人は、 次のメールアドレスが使えるようになっている。 coins では新たにメールアドレスを作成する手続きは必要はない。 参考

次のようなことを行ってみなさい。
  1. 全学やその他のメール・アカウントから Coins の自分のアドレスにメー ルを送信する。
  2. 1. で送ったメールを読む。
  3. 1. で送ったメールに対して返信する。
  4. 3. の返信を読む。この時、From: が正しいものか、From に display name が設定されているか確認する。

練習問題(3138) Maildir

coins では各自が受信したメールを、各自のホームディレクト以下の ~/Maildir/ の下に保存する。その様子を ls コマンドや cat コマンドで観察しなさい。
$ ls ~/Maildir/ [←]
$ ls -a ~/Maildir/ [←]
$ ls ~/Maildir/cur [←]
$ ls ~/Maildir/new [←]
$ ls ~/Maildir/tmp [←]
$ cat ~/Maildir/cur/ファイル名 [←]
このようなディレクトリの形式を Maildir 形式や Maildir++ 形式という。

注意: ~/Maildir/ 以下には、IMAP サーバが利用する重要なファイルも ある。削除したり壊さないように、慎重に操作すること。

練習問題(3139) .forwardの設定と確認

この練習問題をする前に、必ず ~/.forwardによる電子メールの転送 を読み、働きと危険性を理解しなさい。失敗すると、電子メールが失われたり、 メールサーバに過大の負荷をかけることになる。

coins 以外に日常的に読み書きするメール・アカウントがある人は、毎日 coins に届いたメールを確認する方法として~/.forward を設定して、転送する 方法が考えられる。そのようにしたい人は、そうしなさい。

~/.forward は、emacs でテキスト・ファイルとして作成するとよい。

$ emacs ~/.forward [←]
$ cat ~/.forward [←]
\s2054321, myaddr@xxx.yyy.zzz
(これは一例なので真似しないように)
$ []
設定が完了したら、必ず自分自身の coins のアドレス (例えば学生番号が 202194321 なら s2054321@coins.tsukuba.ac.jp)にメールを書き、次のことを 確認しなさい。

練習問題(3140) 筑波大学全学計算機の転送機能

筑波大学全学計算機の電子メール機 能(@u.tsukuba.ac.jp, @s.tsukuba.ac.jp)にも、転送機能がある。この機能の 設定方法を確認しなさい。 必要なら、設定しなさい。ただし、 転送におけるループの危険性 を理解した上で、ループが起きないよう設定しなさい。

◆追加

練習問題(3141) pgrep と pkill

練習問題 ps | grep、kill では ps コマンド、grep コマンド、kill コマンドを使って目的のプロセスを 探し、殺していた。同じ事を、次のようなコマンドを使って行うこともできる。 その動作を確認しなさい。

■課題(30) 端末(2)

コマンドを実行するコンピュータとしては、Coins のもの(azlaea, jelly, violet01, www)を用いなさい。そして、レポートの採点者が指定されたことが きちんと行えたことを簡単に確認できるようなレポートを作成しなさい。

レポートには、指定されていなければ、端末の全ての表示を含めなさい。全て の表示とは、シェルのプロンプト、自分が打ち込んだコマンド、コマンドの実 行結果である。端末が持つコピー機能でコピーし、テキストエディタ(のウィン ドウ)にペーストするなどして、テキストをコピーして、レポートに含めること。 レポートとして、画像を提出してはならない。

主専攻実験で K-3 を選択した人は、「[高度]」と印が付いているものも行い なさい。それ以外の人は、やらなくても良い。

(1) 以下の方法で、ps コマンドと kill コマンドを実行し、その結果をレポー トに含めなさい。

  1. 2つのウィンドウ 2つのウィンドウ を開き、コマンドが打てる状態にする。 ssh を使う方法とリモートデスクトップを使う方法、直接 PC にログインする方法がある。 (その他に、必用ならば、レポートを作成するためのウィンドウを開く。)
  2. 2つのウィンドウで、ssh により情報科学類内の「同じ」コンピュータに 遠隔ログインする。 たとえば、ssh で最初のウィンドウで azalea15 にログインたら、2つ目のウィンドウでも azalea15 にログインする。
  3. 最初のウィンドウでは強制終了させてもよいプロセスを作成する。プ ロセスの作成方法としては、たとえば、lv コマンドでテキスト・ファイルを表 示する方法が考えられる。
    $ lv /etc/passwd [←]
    
  4. 2目の端末で ps コマンドを実行し、3. で作成したプロセスを表示する。 grep コマンドと組み合わせることが望ましい。
    $ ps   | grep lv [←]
    $ ps x | grep lv [←]
    (表示)
    $ []
    
  5. kill コマンドを使って、3. で作成したプロセスを殺しなさい。
    $ kill pid [←]
    
  6. ps コマンドの結果を示し、6. でプロセスがきちんと死んだこと(表示さ れないこと)を示する。
    $ ps   | grep lv [←]
    $ ps x | grep lv [←]
    (表示)
    $ []
    
レポートには、3. から 6. の、端末の表示を含めなさい。

(2) シェルが持つ標準入出力の切り替え機能を使って、次のコマンドの結果を 全て含む1つのファイルを作りなさい。

(3) 自分のホーム・ディレクトリとその下にあるファイルについて、次のこと を行いなさい。

  1. ホームディレクトリのモードを ls -ld で表示しなさい。
    $ ls -ld ~ [←]
    
  2. ホーム・ディレクトリの次の属性を示しなさい。
  3. ホームディレクト以下に、次のようなモード rw-r--r-- のファイル file522.txt が存在したとする。課題のためにこのようなファイルを作成して も良い。作成しないで考えるだけでも良い。以下の例で、sXXXXXXX は、自分の ログイン名とする。
    $ cd ~ [←]
    $ ls -l file522.txt [←]
    -rw-r--r--  1 sXXXXXXX  ugrad  4  5 20 10:43 file522.txt
    $ []
    
    このファイルを、coins の「他の利用者」が cat コマンドで読み出そうとした 時に何がおきると考えられるか。簡単に答えなさい。(実際に他の利用者に試 してもらって良い。考えるだけで実際には試さなくても良い。

    他の人の操作

    $ cd ~sXXXXXXX [←]
    $ ls -l ~sXXXXXXX/file522.txt [←]
    $ cat ~sXXXXXXX/file522.txt [←]
    
  4. このファイル file522.txt と同じモードのファイルが、自分のホームディ レクトリにあるか ls -al で調べなさい。あれば、その例を1個以上、5個以内 で答えなさい。なければ無いと答えなさい。

    調べるには、ls -l コマンドとlv コマンド、grep コマンドを使う方法もある。

    $ ls -la | lv [←]
    $ ls -la | grep rw-r--r-- [←]
    

(4) 次のファイル名を次のファイル名やディレクトリを、シェル変数を設定し て短く表現しなさい。

    /usr/bin/awk
    /usr/bin/gcc
    /usr/bin/openssl
短く表現したものを、ls -ld コマンドの引数に与えて実行しなさい。
$ シェル変数の代入1 [←]
$ シェル変数の代入2 [←]
$ シェル変数の代入3 [←]
...
$ シェル変数の代入n [←]
$ ls -l シェル変数の参照を利用短い表現 [←]
lrwxrwxrwx. 1 root root 4  2月 18  2019 /usr/bin/awk -> gawk
$ ls -l シェル変数の参照を利用短い表現 [←]
-rwxr-xr-x 2 root root 768592  3月 25  2020 /usr/bin/gcc
$ ls -l シェル変数の参照を利用短い表現 [←]
-rwxr-xr-x 1 root root 555304  9月  1  2022 /usr/bin/openssl
$ []
ヒント1: シェル変数への代入は、1回以上、何回でもよい。

ヒント2: シェル変数の値に空白が含まれている(可能性がある)ものを参照する 時には、ダブルクォートでくくる("$name")とよい。

ヒント3: 補完機能と組み合わせてもよい。その場合にはどのようなキー操作を したのかをレポートに書きなさい。

(5) echo コマンドを使って、次の文字列を画面に表示しなさい。 なお、3行目では、AとBの間に空白が3個ある。

M*
????dir
A   B
<yes><no>
Let's go
#help
たとえば、次のように回答しなさい。
$ echo 回答内容 [←]
Lib*
$ echo 回答内容 [←]
????top
$ echo 回答内容 [←]
A   B
$ echo 回答内容 [←]
<yes><no>
$ echo 回答内容 [←]
Let's go
$ echo 回答内容 [←]
#help
$ []
注意:これは、 メタキャラクタをエスケープ する課題である。単に echo コマンドに対してこのような文字列を与えればよ いということでない。 練習問題 「*」のエスケープ練習問題 様々なシェルのメタキャラクタのエスケープ 参照。

(6) 練習問題(3073) から 練習問題(3083) まで から2つ選んでシェル・スクリプトを作成しなさい。 作成したシェル・スクリプトを、ディレクトリ ~/bin に起きなさい。 作成したシェル・スクリプトについて、次のことを書きなさい。

(7) quotaコマンドの説明、coins-quota コマンド、 コンピューティング環境のquotaの説明を読みなさい。次の値を確認しなさい。

レポートには、これらの値とともに、それを調べた方法を記載しなさい。

(8) 正規表現の検索機能を用いて、次のファイルやコマンドの出力から 目的のもの検索して画面に表示しなさい。選択ではなく、全て実行しなさい。 なお、grepコマンドで OR の機能が必要ならば、-e オプションを複数与える方 法がある。egrep コマンドの「|」を用いれば 1 回で終わることもある。

(9) [高度] 情報科学類 Coins の Web サーバを用いて、次のような URL で HTML の Web ページを公開しなさい(不用なら、レポートを作成した後で削除す ること。また、chmod コマンド等で、モードを元に戻すこと。)

この例で、sXXXXXXX は、各自自分の Coins でのログイン名とする。また、 randomstring には、ランダムな文字列を指定する。

このファイルを作成し、ls -l でそのモードを表示しなさい。そのファイル名 を「~」を使って指定しなさい。

情報科学類のコンピュータ www.coins.tsukuba.ac.jp では、 (violet03.coins.tsukuba.ac.jp) では、Apache httpd というWeb サーバが UID 48 (ユーザ名 apache) で動作している。 このプロセスを、ps コマンドと grep コマンドを使って表示しなさい。これら のコマンドを打つ前に、ssh で www.coins.tsukuba.ac.jp にログインしてから 行うこと(violet01 や azalea では不可)。端末の表示をレポートに含めなさい。

$ ps オプション | grep 引数 [←]
Web ブラウザで http://www.coins.tsukuba.ac.jp/~sXXXXXXX/randomstring.html という URL を開いた時、Apache Web サーバのプロセスは、ホームディレクト 以下のどのファイルを開いて読もうと試みるか。そのファイル名を「~」を使っ て答えなさい。

Apache Web サーバのプロセスが、そのファイルを読み事ができ、Web ブラウザ にその内容が表示されたとする。そのことから、ホームディレクトリを含む、 いくつかのディレクトリのモードのうち、特定のビットが1になっていることが わかる。

ホームディレクトリ以下の各ディレクトリについて、どのビットが1になって いるかを答えなさい。たとえば、次の例のように、ls -ld の結果を表示し、 その下の行に、1になっている部分に「^」のマークをつけなさい。

$ ls -ld ~ [←]
drwxr-xr-x 41 yas prof 108  4月 21 09:41 /home/prof/yas
         ^
$ []

作成した Web ページを、Web ブラウザで表示しなさい。その後、Web サーバ が生成しているアクセスログから、自分自身がアクセスした記録を抜き出しな さい。 それには、次のような方法がある。

アクセスログのうち、「数行」をレポートに含めなさい。grep コマンドや tail コマンドを利用すること。レポートには、端末に打ち込んだコマンドも 含めなさい。

(10) [高度] 電子メールについて次のことに回答しなさい。
  1. Coinsのアカウントと関連している、あなたのメールアドレスを書きなさ い。
  2. 1. のアドレスをのぞき、tsukuba.ac.jp で終わる、あなたのメールアド レスを全て列挙しなさい。
  3. 2. のアドレスの間で、電子メールの転送機能を使っているか。使ってい る場合には、どのように転送しているか書きなさい。また、これらの間でルー プがあるか、ないかを書きなさい。
  4. 1. のアドレスから2. のアドレス、または、学外のアドレスに電子メー ルを転送するには、どのようにすれば良いか書きなさい。実際にはそのような 転送は行わなくて良い。
  5. 5. で転送する時、Coins にもメールのコピーを残すこともできる。この 時に自分の Coins のアドレスを示す時に使う文字の、ASCII における文字コー ドを答えなさい。

Last updated: 2023/07/04 12:26:37
Yasushi Shinjo / <yas@cs.tsukuba.ac.jp>