Help us understand the problem. What is going on with this article?

Linux勉強会2016冬(第一回) 資料

More than 3 years have passed since last update.

外部の方向けの注記

これはKMC(京大マイコンクラブ)で行った「Linux勉強会2016冬」(第一回)の資料です。

主に次世代のroot(部内サーバの管理者)を養成すること、および部員が部内サーバを有効に使えるようになることを志向しています。

今回は最も基本的なことです(私が高度なことはしらないので)。部内サーバー(ホスト名はringo、ディストリビューションはdevian 8)にsshしたところから始まります。

まずはlsから

lsはディレクトリ(=フォルダ)の中身が何かを出力するコマンドです。

suzusime@ringo:~$ ls
backups    chef-solo  ctf        dotfiles  extlib  infra       maru.zip      projects      test.txt
bushi.txt  codes      documents  download  images  install.sh  private_html  pukiwiki.tar  texmf

-lをつけると詳細がでるようになります。こういうものを(コマンドライン)オプションといいます。

suzusime@ringo:~$ ls -l
合計 195928
drwxr-xr-x  2 suzusime kmc      4096  2月  7  2016 backups
-rw-r--r--  1 suzusime kmc     49272  5月 29  2016 bushi.txt
drwx------  8 suzusime kmc      4096  2月 14  2016 chef-solo
drwxr-xr-x 21 suzusime kmc      4096 11月  8 12:30 codes
drwxr-xr-x  2 suzusime kmc      4096 10月 27 16:44 ctf
drwxr-xr-x  2 suzusime kmc      4096  2月 10  2016 documents
drwxr-xr-x  3 suzusime kmc      4096 11月 25 22:27 dotfiles
drwxr-xr-x  3 suzusime kmc      4096 11月  3 11:21 download
drwxr-xr-x  3 suzusime kmc      4096 12月 13  2015 extlib
drwxr-xr-x  2 suzusime kmc     28672  3月 29  2016 images
drwxr-xr-x  3 suzusime kmc      4096  2月 13  2016 infra
-rw-r--r--  1 suzusime kmc      4149  1月 23  2016 install.sh
-rwxr-x---  1 suzusime kmc   2027510  2月  5  2016 maru.zip
drwxr-xr-x  5 suzusime kmc      4096 10月 15 15:39 private_html
drwxr-xr-x  3 suzusime kmc      4096  4月 21  2016 projects
-rw-r--r--  1 suzusime kmc 198451200  4月 25  2016 pukiwiki.tar
-rw-r--r--  1 suzusime kmc        78  6月 11 14:50 test.txt
drwxr-xr-x  6 suzusime kmc      4096  1月 15  2016 texmf

-aをつけると隠しファイルも含めた全てのファイルが表示されます。Linuxでは先頭に.がついたファイルは隠しファイルとして扱われます。

suzusime@ringo:~$ ls -a
.              .emacs.d              .muttrc          .rbenv           .viminfo.tmp  bushi.txt  infra
..             .forever              .node-gyp        .scala_history   .vimrc        chef-solo  install.sh
.FontForge     .forward              .npm             .sqlite_history  .vimshell     codes      maru.zip
.aptitude      .gem                  .nvm             .ssh             .weechat      ctf        private_html
.bash_history  .gitconfig            .omake           .texmf-config    .zcompdump    documents  projects
.bash_logout   .gnutls               .pip             .texmf-var       .zsh_history  dotfiles   pukiwiki.tar
.bashrc        .kmc-profile          .profile         .tmux.conf       .zshenv       download   test.txt
.cache         .kmc-profile.example  .pyenv           .vim             .zshrc        extlib     texmf
.config        .maildir              .python_history  .viminfo         backups       images

恐らくみなさんのホームディレクトリにも.bashrcなどの隠しファイルや.sshなどの隠しディレクトリ(フォルダ)が入っているはずです。このような設定ファイル類は隠しファイルになっていることがよくあります。

$ ls -alまたは$ ls -l -aのようにオプションをふたつとも指定してやると、全てのファイル/ディレクトリの詳細情報が出力されます。

次はディレクトリを指定してその中身を表示させてみましょう。

suzusime@ringo:~$ ls /home/suzusime/.ssh
authorized_keys  config  id_rsa  id_rsa.pub  known_hosts

このように引数にディレクトリの名前を指定してやることでそのディレクトリの中身を表示してくれます。

Linuxのパス(=場所を表す情報)はスラッシュで区切ります。/が一番上(ルート(根)とよびます)で、その下に/home/etc/binなどなどがあります。

先程のようにlsのあと(引数)になにも指定しなかったときはカレントディレクトリ(=今いるディレクトリ)の情報を表示します。カレントディレクトリの情報はpwdで表示できます。

suzusime@ringo:~$ pwd
/home/suzusime

基本的に端末を起動した直後やsshした直後などは/home/user名というディレクトリがカレントディレクトリになります。これをホームディレクトリといいます。だいたいの私的な作業はこのディレクトリの下でやりましょう。

なお、ホームディレクトリのパスは~で代用することができます(追記:これはLinuxそのものの機能ではなくbash(shell)による機能らしいです)。たとえば~/.sshとかけば、それは/home/user名/.sshを意味します。上の例ではずっとコマンドの左にsuzusime@ringo:~$という文字がでていると思いますが、ここにある~はカレントディレクトリが~であることを意味しています。

上の/home/suzusime/.sshは絶対パスと呼ばれる表示法です。他に相対パスという表示法があります。相対パスは今いるディレクトリからの相対的な位置で表示する方法で、例えばカレントディレクトリが/home/suzusime/ならば.sshと書くだけで/home/suzusime/.sshを指し示すことができます。ひとつ上(親)のディレクトリは../で示します。この場合、..//homeを、../wass80/home/wass80を指すことになります。

カレントディレクトリの移動はcdコマンドです。

suzusime@ringo:~$ cd .ssh
suzusime@ringo:~/.ssh$ pwd
/home/suzusime/.ssh

カレントディレクトリを作業するファイルがある場所に移動しておくとパスが簡単になって作業が楽になります。

ファイル操作いろいろ

mkdir

mkdirは空のディレクトリをカレントディレクトリに生成するコマンドです。

suzusime@ringo:~$ mkdir test
suzusime@ringo:~$ cd test
suzusime@ringo:~/test$ pwd
/home/suzusime/test

touch

touchは空のファイルをカレントディレクトリに生成するコマンドです(本来は別の用途なのですが………)。

suzusime@ringo:~/test$ touch hoge
suzusime@ringo:~/test$ ls
hoge

chmod

chmodはファイルのパーミッション(=アクセス権限)を変更するコマンドです。

suzusime@ringo:~/test$ ls -l
合計 0
-rw-r--r-- 1 suzusime kmc 0 12月  2 12:29 hoge
suzusime@ringo:~/test$ chmod 755 hoge
suzusime@ringo:~/test$ ls -l
合計 0
-rwxr-xr-x 1 suzusime kmc 0 12月  2 12:29 hoge

ls -lをしたときに一番左の列にでているのがパーミッションの情報です。

rが読み取り権限、wが書き込み権限、xが実行権限を示します。例えばrw-であれば読み込みと書き込みの権限があり実行の権限はないことになります。rw-r--r--のように3つ並んでいると思いますが、これは左からそれぞれファイルの所有者(この場合suzusime)、ファイルのグループ(この場合kmc)、それ以外のユーザーの権限を示しています。

rw-のような記法は少し面倒なので、これを数字で表す方法があります。rには4、wには2、xには1を割り当てて数字の和で権限を示します。例えばrw-なら4+2で6です。これを3つ並べて、rw-r--r--644とあらわすことになります。上では$ chmod 755 hogeとしていますが、これによってhogeのパーミッションが755に変わっているのが分かります。なお、$chmod u+x hogeのように数字を使わずに指定することもできます。

だいたいのファイルは644(ディレクトリの場合は755)にしておけばいいと思います(親ディレクトリのパーミッションを引き継ぐのでたいていこうなっています)。ただし、他のユーザーに見られたくないファイル(例えば秘密鍵ファイル~/.ssh/id_rsaは他のユーザーに見られるととてもまずい)は600のようにしておきましょう。また、間違って000のファイルを作ってしまうと自分でも削除や編集ができなくなってrootに頼むしかなくなるので注意してください。(訂正:所有者が自分ならばchmodで修正することができるらしいです)

echo、cat

echoは引数をそのまま返すコマンドです。

suzusime@ringo:~/test$ echo にゃーん
にゃーん

このままだとあまり意味がなさそうに見えますが、リダイレクトという機能を用いるとファイルに書き込むことができます。

suzusime@ringo:~/test$ echo にゃーん > hoge
suzusime@ringo:~/test$ cat hoge
にゃーん

ここででてきたcatコマンドはファイルの中身を出力するコマンドです(本当はファイルを結合するためのコマンドなのですが)。hogeのなかににゃーんと書き込まれていることがわかります。>を使うと、標準出力(この場合端末(画面)に出力されてくる文字だと思ってください)を代わりにファイルのなかに出力することができます。これがリダイレクトです。

>は出力先のファイルの全文を置き換えてしまうのですが、かわりに>>を使うと追記させることができます。また、標準出力とは別の系統でエラー出力というものがあり、これの出力先を変えるときには2>2>>を使います(エラー出力はその名の通りエラーが発生したときの警告文の出力などに主に使われます。何も指定しないときはふつう標準出力とエラー出力の内容はともに端末に表示されるようになっています)。

  • echocatがあればファイルの内容を編集することができます。#shellでは標準的なエディタとしてよく使われていました…… なおheadtailなどをうまく使うと編集効率があがりそうです。

grep

次のようなコマンドを打ってみてください。大量のデータが表示されると思います。

suzusime@ringo:~/test$ ps aux

これはこのコンピュータで動いているプロセス(プログラムの単位みたいなものです)の一覧を表示するプログラムです。動いているプロセスを殺す(止める)際にはここからpid(プロセスのID)を探してその番号をkillコマンドに渡すのが基本なのですが、たくさんあってここから探すのは困難です。

ここからtmuxというプログラムを探したいという場合には次のようにします。

suzusime@ringo:~/test$ ps aux | grep tmux

こうすることでtmuxという文字列が含まれる行だけが表示されたはずです。grepは検索コマンドで、ファイルの中や標準入力から指定されたパターンを含む部分を抽出してくれます。

$ grep [パターン] [ファイル名]だとファイルのなかから、$ grep [パターン]だと標準入力から検索します。

標準入力はふつう端末で入力した文字列になります。例えば$ grep yuを実行してみてください。入力待機画面になると思います。この状態でrikahanyuなどと入力してエンターキーを押してみると、hanyuのときだけhanyuという出力が返ってくると思います。これは、grepが標準入力からhanyuという文字列を受け取ってそれがパターンyuにマッチすることからそれを出力したということです。rikaならば何も返ってこないはずです。

なお、標準入力の待機画面からは^D(Ctrl+Dの意味)を入力すると抜けることができます。ちなみに^Cを入力するとほとんどのプログラムを強制終了させることができるので覚えておきましょう。

さて、先ほどの$ ps aux | grep tmuxでは|が重要な役割を果たしています。|はパイプとよばれ、左側のプログラムの標準出力を右側のプログラムの標準入力に渡します。今回の場合、psの結果が標準出力に出力され、これを標準入力から受け取ったgrepが該当する行だけを出力しているのです。grepの出力も標準出力ですから、もちろん

suzusime@ringo:~/test$ ps aux | grep tmux > hoge

とすればhogeにその内容を書き込むことができます。

(追記:また、<を使うことでファイルの内容を標準入力に与えることができます。忘れていました)

こういう風に、Linuxでは単純な機能のプログラムをパイプやリダイレクトなどをうまく使っていくつか組み合わせて望む機能を実現させることが多いです。このような設計思想は「Unix哲学」と呼ばれています。

テキストエディタ

Linuxでは設定ファイルはふつうすべてテキストデータで書かれることになっています。そのため、何をするにしてもテキストファイルの編集が必要になります。従って、Linuxをまともに使うためにはテキストエディタを使える必要があります。

上で述べたようにcatechoで編集するなんてことも不可能ではないですが、普通はもっとまともなプログラムを使います。代表的なのはvimemacsですが、宗教戦争で有名です。私はvimを使っていますが、ここではnanovimemacsを紹介しておきます。

nano

suzusime@ringo:~/test$ nano hoge

で起動します。操作方法は下にでてくるのでそれを読めばわかります。とても単純です。

vim

suzusime@ringo:~/test$ vim hoge

vimは「モード」の概念がありややこしいです。起動したときは「通常モード」であり、この状態ではカーソルの移動などはできますが文字入力はできません。文字入力のできる「挿入モード」に入るにはiを押します。通常モードに戻るにはEscです。上書き保存は通常モードで:wと入力してエンターを押します。終了は通常モードで:qです。変更を保存しないで終了すると怒られますが、:q!と入力すると無理やり終了させられます。

他にもたくさんの機能がありますが、最低限これを覚えておけば基本的なテキスト編集はできると思います。

emacs

suzusime@ringo:~/test$ emacs hoge

emacsにはモードの概念はないので入力すればそれがそのまま反映されます。上書き保存はC-x C-s(Ctrl+Xのあと続けてCtrl+Sの意)、終了はC-x C-cです。

こちらも他にもたくさんの機能があります。

ネットワーク関連

ip

suzusime@ringo:~$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether **:**:**:**:**:** brd ff:ff:ff:ff:ff:ff
    inet ***.***.***.***/** brd ***.***.***.*** scope global eth0
       valid_lft forever preferred_lft forever
    inet6 ****:****:****:****:****:****/** scope link
       valid_lft forever preferred_lft forever

$ ip addrを引数無しで実行すると現在のIPアドレスなどのネットワークの状態を表示することができます(まずそうなところは伏字にしました)。

2のeth0というのがこのコンピュータに外部からつながっているネットワークカードのアドレス情報です。inetのあとの192.168.0.1のような数字がIPアドレス(IPv4アドレス)です。外部からこのコンピュータに接続する場合にはこのアドレス及びポート(後述)を指定すればよいことになります。

ポートというのは各プログラムが通信する際の窓口のようなもので、1つのIPアドレスにたいして0~65535番のポートがあります。例えば、192.168.0.1:22はIPアドレスが192.168.0.1のコンピュータ(ネットワークカード)の22番ポートを指します。

nc

nc(netcat)はネットワーク関連のいろいろなことができるコマンドです。

suzusime@ringo:~$ nc -l -p 9494

上を実行することでこのコンピュータの9494番ポートに通信を待ち受けるサーバーを立てることができます。別の端末を開き、

suzusime@ringo:~$ nc 127.0.0.1 9494

とすると標準入力の待機画面になるので、そこでなにか入力してエンターキーを押してやると、先ほどサーバーを立てた方の端末にその内容が出力されるはずです。これでサーバーとクライアントのあいだの通信ができているわけです。これだけで簡単なチャットができてしまいます。

127.0.0.1は自分自身を表すIPアドレスです(上の$ip addrの結果のloのところにでています)。localhostという文字列に変えても同じです。ここに代わりに192.168.0.1のようなIPアドレスを入れると、ネットワークにつながっている別のコンピュータに対しても同じように通信ができることになります。ぜひ部員の間で試してみてください。

他にも

suzusime@ringo:~$ nc kmc.gr.jp 80

としてGET /や空白を送ってやるとWebサーバーがどういう応答を返しているのかが分かって面白いと思います。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away