Webとデザインのあれこれ

プログラミングとUIデザインの学習記録です。

HTTPの基本の基本2

Cookieとセッション管理について

ステートレスとは何か

  • Webサーバがクライアントのアプリケーション状態を保存しないこと

ステートレスでは、クライアントがリクエストメッセージに必要な情報をすべて含めます。そのため、サーバ側はクライアントの状態を覚える必要がないため、サーバ側の処理は非常にシンプルなものになります。サーバは新しく受け取るリクエストの処理に集中すれば問題ありません。

HTTPはステートレスなプロトコルとして設計されており、シンプルなプロトコルゆえの強みを持っています。

HTTP Cookieとは

HTTP Cookieとは、Webサーバよりクライアントに送られる情報の一部で、HTTPヘッダで送信され、「Webブラウザ」に保存されます。

HTTP Cookieの仕組み

  1. クライアントがリクエス
  2. WebサーバがSet-Cookieというフィールドをヘッダに載せて、レスポンスを返す
  3. クライアントはこのCookieをブラウザに保存する
  4. これ以降、クライアントはサイトにアクセスする際、保存したCookieを自動的にWebサーバにリクエストする(Cookieというフィールドに変わります)

前回のブログで記載した通り、HTTPメッセージのヘッダは「名前:値」の形式です。WebサーバはSet-Cookieの値に、ブラウザに保存して欲しい情報を設定します。

  • Cookieの有効期限は、デフォルトではブラウザを閉じるまでです。 ただ、ヘッダで有効期限を設定することも可能です。有効期限が切れたCookieはリクエストからも消えます。

  • Set-Cookieの値はサーバーが更新して、ヘッダに載せて再度クライアントに返したりします。

HTTP Cookieの種類

HTTP Cookieは2種類に大別されます。

Session Cookieは、インターネットのメールプロバイダを利用する際やオンラインバンクの認証などに使用されています。

別のメールを表示する際などにログインをわざわざしなくていいのは、Sessin Cookieのお陰なのです。ブラウザを終了した時点でこのCookieは破棄されます。

Persistent CookieはSession Cookieに比べると有効期限の長いCookieです。フォーラムなどに1回ログインすると、2週間や場合によっては2ヶ月程ログインなしでアクセスできるのはこのCookieによるものです。

Session Cookieと異なりPersistent CookieWebブラウザを終了してもWebブラウザ内部に保存されています(※削除できる設定があります)。

セッションについて

セッションとは、接続/ログインしてから切断/ログアウトするまでの一連の操作のことを指し、基本的にクライアントとサーバ間の通信のことです。

例えば、ショッピングサイトにユーザーがアクセスし、商品を探し、カートに入れ、購入するという一連の流れがありますね。

このように同一利用者からのアクセスを関連性のある一連のアクセスとして扱いたい場合、Cookieを使ったセッション管理が行われる。

セッション(管理)の仕組み

Cookieにセッションの情報を乗せることで、セッション管理を行います。

  1. ユーザーはサイトにログインし、サーバに送信(リクエスト)
  2. WebサーバはセッションIDを生成し、Set-Cookieに載せてレスポンスを返す
  3. これ以降クライアントはセッションIDをヘッダに載せてアクセスする

Cookieとの違いは、「サーバ側」がセッションIDを保存している点です。

したがって、クライアント側でIDを改竄することが難しく、安全な通信が可能になります。

WebサーバはセッションIDより得たユーザーのセッション情報をDBやファイルに保存し、管理しています。

最後に

以上となります。

参考

www.hippo.azimech.net

qiita.com

「Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus) 」

HTTPの基本の基本1

HTTPについて

HTTPとは

HTTP(HyperText Transfer Protocol)は、TCP/IPベースのプロトコルです。

クライアント(Webブラウザ)とサーバ間でWeb上のリソースをやりとりします。

最新のバージョンは1.1でほとんどのHTTPクライアントライブラリやWebサーバはHTTP1.1をサポートしています。

クライアントとサーバ

クライアント(Webブラウザ)がサーバ(Webサーバ)に接続し、各種のリクエストを出してレスポンスを受け取ります。

ハイパーテキストの転送用プロトコルのため、基本的にはテキストデータをやりとりしますが、Webで扱うデータは全て送ることが可能です。

クライアントが出したリクエストをサーバで処理してレスポンスを返す、このようなプロトコルのことをリクエスト/レスポンス型のプロトコルと言います。

HTTPメッセージ

例えば、ブラウザでWebページを開く際に、クライアントは以下のようなメッセージをサーバーに送信しています。

GET / HTTP/1.1  #GETはメソッド、/はリクエストURI、HTTP/1.1は HTTPのバージョンです。

これはクライアントによるリクエストメッセージのうち、1行目にあるリクエストラインと呼ばれるものです。

クラインアントによるメッセージとWebサーバによるメッセージを合わせてHTTPメッセージと呼びます。

HTTPメッセージ

  • リクエストメッセージ(クライアントによるリクエスト)
  • レスポンスメッセージ(Webサーバによる応答)

HTTPメッセージの構成要素は以下の4つです。

  • スタートライン(1行目)
    • リクエストライン
    • ステータスライン
  • ヘッダ
  • 空行(ヘッダの終了は空行で判断します)
  • ヘッダ

リクエストメッセージ

GET /test HTTP/1.1  #リクエストライン(メソッド、リクエストURI、プロトコルバージョン)
Host: abc.jp #Hostヘッダ(必須)

ヘッダは、基本的に「名前:値」という構成です。

仮想ホスト

HTTP/1.1では仮想ホストがサポートされています。

仮想ホストとは、1台のサーバーで複数のドメインを運用する技術のことです。

HTTP/1.1 のクライアントはリクエストメッセージの ヘッダ内で必ずホスト名を指定する必要があります。

サーバーはこのホスト名を元に対応したコンテンツを送信します。

GET / HTTP/1.1
Host: www.abc.com

メソッドについて

HTTP 1.1は以下の8種類をサポートしています。

メソッド

名称 説明
GET 最も一般的に使用されるメソッドです。ブラウザはサーバに対してページ(リソース)の取得を要求します。
HEAD ヘッダ(メタデータ)のみの情報を要求します。
POST CGI でよく使用されるメソッドです。method="POST" を指定したフォームに入力したデータをサーバに転送する際に使用されます。
PUT ページ(リソース)の更新、ページの作成、ファイルをサーバにアップロードする際になどに用います。
DELETE 指定したリソースを削除することをサーバに要求します。
OPTIONS サーバがサポートするメソッドの調査し、取得します。
CONNECT プロキシ動作のトンネル接続への変更(プロキシサーバを経由して SSL 通信する際などに使用します。)
TRACE 自分宛にリクエストメッセージを返す(ループバック)試験
  • GET メソッドと HEAD メソッドについては、サーバーは必ずサポートしなければなりません。

レスポンスメッセージ

HTTP/1.1  200 OK   #ステータスライン(プロトコルバージョン、ステータスコード、補足メッセージ(テキストフレーズ))

ステータスコードについては、

  • 1xx: 通信エラー、処理中
  • 2xx: 正常終了
  • 3xx: リダイレクト
  • 4xx: クライアントエラー
  • 5xx: サーバエラー

200番が表示されたら、成功ですね。

ステータスコードは先頭の数字で分類されているため、クライアントはとりあえず先頭の数字によってサーバがどのようなレスポンスを返してきたのかを理解できます。

補足メッセージには、OK や Bad Request、Not Found など、ステータス番号の意味や詳細を補足するメッセージが返信されます。

telnetとは

telnetはざっくり言うと、外部のコンピューターにアクセスするコマンドです。

webサーバーとhttpプロトコルでやりとりする場合、以下のコマンドで実行できます。

$telnet サーバ名 80 #ポート番号は80番です。

後は、リクエストメッセージを送るだけです。

最後に

以上です!

参考資料

www.tohoho-web.com

developer.mozilla.org

ash.jp

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

Linuxコマンドまとめ

コマンド系の追記

「Linuxゲリラ戦記」および「UNIXの使い方」の備忘録です

lsコマンド

$ls -a #隠しファイル(.で始まる)まで表示
$ls -F #ディレクトリには/、実行可能ファイルには*がつく
$ls -l #ファイルおよびディレクトリの詳細表示を表示
$ls -ld dir1 #ディレクトリのみの詳細情報を表示
$ls -l dir1 #ディレクトリの中身のファイルの詳細情報を表示する

passwdコマンド

UNIXはパスワードに関して、作成ルールを厳しく設けています。また、変更やログインの際にもパスワードは表示されません。

$passwd #一般ユーザーのパスワード変更
#passwd #rootユーザーのパスワード変更
$passwd ユーザー名 #特定のユーザーのパスワード変更

プロセス管理系コマンド(pstree, ps, top)

プロセス管理に関するコマンドです

$pstree  #プロセスをツリー上に表示します
$ps aux  #psコマンド実行時のプロセスを表示します。全てのプロセスを表示したい場合、オプションにauxを渡します

aは端末を持つ全てのプロセス、uは実行ユーザー、xは端末を持たない全てのプロセスです。

f:id:b_leiu:20190221233639p:plain:w200

PID:プロセス番号で、全てのプロセスに番号があります。

$top #プロセスの状況をずっとリアルタイムで表示し続ける 

これらを応用すると、以下のように特定のプロセスを検索できます。

$ps aux | grep プロセス名
$ps aux | less #プロセスの名称がわからない場合、プロセスを1行ずつ表示

プロセスを止めたい場合は、

$kill プロセス番号

ユーザー管理系(adduser, userdel)

$adduser  #ユーザーの追加
$userdel -r ユーザー名 #ユーザーの削除

-rオプションは、$rm -r ディレクトリディレクトリを指定すると中のファイルまで丸ごと削除するように、 userdelで使用すると特定ユーザーのホームディレクトリも削除します。

mvコマンド

$mv ./Desktop/cat.jpg private/ #Desktopディレクトリ内のcat.jpgをprivateディレクトリに移動
$mv dog.jpg wanko.jpg #同じディレクトリ内で指定すると、名称を変更します(dog.jpgは消えます)
$mv kitten.jpg ../nekotan.jpg #kitten.jpgを一つ上の階層に移動させ、名称をnekotan.jpgに変更します

名称変更時、移動先に同じ名前のファイルがある場合、自動で上書きされます。注意です!

ワイルドカード(正規表現)まとめ

*  #任意の文字列です、空文字を含みます
?  #任意の1文字
[] #カッコ内の任意の1文字
[^] #カッコ内の文字列に一致しない任意の文字列

ファイル関連(ファイル作成と権限)

touchコマンド

$touch foo #fooという空ファイルの作成
$touch a #既存ファイルを修正することなく、更新日時のみ反映します。psコマンドで確認すると更新時間が変更されています。

chmodコマンド

$chmod 保護モード ファイル名 #権限の付与・削除

保護モードは、「オクタル・モード」と「シンボリック・モード」の2種類存在します。

$chmod 700 ファイル名 #オクタル・モード
$chmod u+rwx ファイル名 #シンボリック・モード

f:id:b_leiu:20190222001619p:plain:w400

左の「-rw- r-- r--」が権限を表しており、左(rw-)からファイルの所有者、ファイルのグループ内ユーザー(そのファイルに設定されているグループに属しているユーザたち)、その他です。

0 1 2 3 4 5 6 7
--- --x -w- -wx r-- r-x rw- rwx
オプションの意味
オプション 意味
u そのファイルの所有者
g そのファイルの所有グループ
o その他の人
w 書き込み権限
r 読み込み権限
x 実行権限
+ 権限を与える
- 権限を拒否する

ファイルの権限を変更できるのは、そのファイルの所有者とrootユーザーのみです。

diffコマンド

$diff foo.sh foo2.sh #foo.shとfoo2.shの差異を表示してくれます。実行結果を見る限り、「7c5」より7行目の構文に問題があるとわかります。
1,3c1
< #!/bin/sh
< 
< a=1
---
> =1
7c5
<              a=`expr $a + 1`
---
>              a=`expr $a+ 1`

exprはシェル画面上で計算するためのコマンドです。上記の例は、foo2.shのスクリプト内で、$aと+の間に必要なスペースが足りないためにエラーを起こしていることを示しています。計算する場合は、スペースは必須です。

ファイル検索(find, file, locate)

$find / -name *nanorc* #find 検索を始めるディレクトリ -name ファイル名で特定のファイルの居場所を特定
$file /usr/share/nano/nanorc.nanorc #file ファイル名でどのようなファイルかを調べる、実行結果を見るとテキストファイルであることがわかりますよね。
/usr/share/nano/nanorc.nanorc: ASCII text, with very long lines

$updatedb #locateコマンドは、事前に全てのファイルやディレクトリの場所の情報をデータベースに登録しておく事で使います。
$locate ファイル名 #ファイルの居場所を特定

設定ファイルは通常etcディレクトリ以下にあることが多いですが、この設定ファイルをいじると、使用しているLinuxユーザー(兼用している場合など)にも影響を与えます。

自分のホームディレクトリに設定ファイルの名前でコピーして、そこで編集するのが無難かと思います。

ネットワーク系(lwp-request, ping, whois, ifconfig, traceroute)

$lwp-request アドレス #サーバーに情報を要求
$nslookup ホスト名(またはアドレス) #ホスト名からアドレスを、アドレスからホスト名を探す
$whois  ドメイン名(またはアドレス) #ドメイン情報を取得
#ifconfig #自分のローカルIPアドレスを取得
$ping ホスト名(またはアドレス) #相手のネットワークがきちんと接続されているかのチェック
$traceroute リモートホスト名(またはアドレス) #ドメインにたどり着くまでの経路を示す

エンコード化とデコード化

$echo 犬は可愛いね  | nkf -wMQ | tr =%  #nkfコマンドを使用して変換、さらにパイプでtrコマンドを使用して=を%に置換しています。
=E7=8A=AC=E3=81=AF=E5=8F=AF=E6=84=9B=E3=81=84=E3=81=AD=E3=80=80

$echo =E7=8A=AC=E3=81=AF=E5=8F=AF=E6=84=9B=E3=81=84=E3=81=AD=E3=80=80 | tr % = | nkf -WwmQ # デコードできていますね。
犬は可愛いね

パイプはいくらでも繋げてOKです。

情報取得コマンド(wget, curl)

$wget アドレス #指定したアドレスのサイト情報を取得する
$wget -i ファイル名 #指定したファイルからurlのみを取得する
$wget -T  時間 #タイムアウトする時間(秒)を指定する
$curl -e http://www.my-ajax-site.com \
        'http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=Paris%20Hilton' #サーバーから情報を取得したり、情報を送ったりできます。

置換コマンド(tr, sed)

$tr % = #tr 置換前 置換後の順に指定します
$sed -e 's/"url"://g' -e 's/"//g'  #sed -e 's/置換前/置換後/g'、一度に何回も置換できます。

 検索コマンド(grep)

$cat /etc/group | grep sudo #grepは指令した文字列を検索します。この場合、グループからsudoを検索しています。

ファイル操作応用(tar, gzip)

$tar cvf peace.tar *   #tar cvf アーカイブ [ファイル名|ディレクトリ名]でファイルなどを一箇所に集約します。アーカイブ名は自由、この例文はファイルを*で指定しています。

$gzip ファイル #ファイルを圧縮する、このコマンドで圧縮したファイルはgzという拡張子がつきます。
$gzip -d ファイル #ファイルを解凍する

補足: UNIXは拡張子なしでもファイルの内容を確認できるような仕組みがあるため、ファイルは基本拡張子がありません。 ただ、人間が識別しづらいので、拡張子をつけたほうが管理しやすいです。

コンパイラ

$gcc moji.c -o moji #c言語で作成したファイル(moji.c)をコンパイル(機械語に変換)し、mojiという実行可能なファイルが作成される。

-oオプションの指定がない場合、a.outというファイルが作成されます。

tmpディレクトリ関連

テンポラリ領域、つまり一時的に使用するファイルなどを保存するディレクトリです。/tmp/以下のファイル名やディレクトリ名が被らないように、以下のコマンドを使用できます。

$mktemp #ファイル作成
/tmp/tmp.ytR1OW9yLa
$mktemp -d #ディレクトリ作成

最後に

以上となります。

SSHについて

MacからLinuxサーバーにSSH接続してみよう!

SSH接続ってなに?

ネットワークを介して、別のコンピュータにログインして操作するためのソフトウェアの一つです。 通信経路が暗号化されているので、インターネット上でも、安全にアクセスすることが可能となります。

SSHはセキュア・シェルの略で、公開鍵認証という仕組みを用いて安全な通信を実現します。

定義だけだと少しわかりづらいですね。今回は、Macのクライアント(*sshクライアント)からサーバー(用のOS)にログインするためにSSHを利用します。

なぜSSH接続をわざわざするのか

以下の2つの観点ですね。

  • 保守性
  • 利便性

サーバーは実はすごく簡単にログインできてしまいます。セキュリティの観点からより通信上リスクの低い方法でログインした方が良いという面があります。

また、リモートのサーバーにsshクライアントからログインできたらすごく便利ですよね。

保守性と利便性の双方を高めるために、SSH接続を行います。

主な仕組み(公開鍵認証)

公開鍵認証という仕組みは、RSA暗号というアルゴリズムに基づいていますが、暗号の話は割愛します。

要するに「鍵を持っているユーザーからのみ、ログインを許可する。」ということです。

鍵はサーバー側に置く公開鍵とクライアント側にある秘密鍵の2種類に分かれます。この2つがセットになって初めて認証されます。

クライアント側は2種類の鍵を生成し、公開鍵のみをサーバーの送ります。公開鍵は誰に知られても良いものです。

公開鍵より秘密鍵を推測することはほぼ不可能に近く、ユーザーは秘密鍵を用いてログインをします。

かなりざっくりした話なので、詳細は以下をご確認ください。

knowledge.sakura.ad.jp

手順

  1. (クライアント側)公開鍵と秘密鍵を生成
  2. ( クライアント→サーバー側)公開鍵をコピー、サーバー側に設置

大まかに言うと、手順はこの2つですね。鍵の生成とサーバーへの送付です。そのほかにもいくつか気をつけないといけない点があるので、見ていきましょう。

Debian側(サーバー側)

sudo apt update
sudo apt install ssh #OpenSSHというSSHプロトコルを利用するために必要なソフトウェアのインストールです

次は、/etc/ssh/sshd_configというファイルを編集します。

Debian側(サーバー側)

$sudo vim /etc/ssh/sshd_config 

$sudo /etc/init.d/ssh restart #これを忘れると反映されません

vimで開くと#でコメントアウトされた文字列が並んでいます。変更する箇所は、

  1. ポート番号を22以外に
  2. PermitRootLoginをnoに変更
  3. PasswordAuthenticationのyesを後ほどnoにします。

2と3はRootログインの禁止とパスワード認証の禁止を設定します。 2については公開鍵を送った後にnoにしましょう。

1のポート番号については、推奨になりますが変更した方がおすすめです。

インターネットなどのTCP/IPネットワークに接続されたコンピュータは、通信プロトコル(通信規約)のTCP(Transmission Control Protocol)やUDP(User >Datagram Protocol)を使用する際に、0番から65535番までの番号で識別される「ポート」(port)と呼ばれる接続の窓口を利用する。

ウェルノウンポート(well-knownポート)とは - IT用語辞典 e-Words

通信の窓口の役割を果たすポート番号ですが、その中でも0から1023番までは著名なサービスやプロトコルが利用するため予約番号となっています。これを「ウェルノウン・ポート」と言います。

sshの場合、22番がポート番号です。無差別なIPアドレスへポート22固定でサイバー攻撃をするマシンなども存在するため、変更した方が無難です。

Debian側(サーバー側)

$mkdir ~/.ssh #sshのディレクトリ作成です。ここに公開鍵を置きます。
$chmod 700 ~/.ssh

ディレクトリのアクセス権限は、所有者(本人)のみフルコントロールとなる権限(700)にします。

Macターミナル(クライアント側)

$ssh-keygen  -t rsa -b 2048 #rsa鍵を生成します。-tは鍵の種類を指定します。rsa、dsa、ecdsa、ed25519などを指定できます。-bは暗号化強度を指し、鍵の種類によって指定できる数値が変わります。

秘密鍵にアクセスするためのパスフレーズをここで設定します。

確認すると、.sshディレクトリにid_rsaid_rsa.pub ができているのが確認できます。 公開鍵のid_rsa.pubをサーバー側に送りましょう!

scp -P  ポート番号 ~/.ssh/id_rsa.pub サーバのユーザ名@サーバのアドレス:~/.ssh/authorized_keys #scpコマンドを使用して、鍵をコピーし、サーバーのディレクトリ内に送付します

また、コピーされた公開鍵はauthorized_keysというファイルに入ります。正しくコピーされたか確認をして、権限を600(rwのみ)に変更します。

Debian側(サーバー側)

$cd ~/.ssh
$chmod 600 ~/.ssh/authorized_keys 

ここで、SSHの設定ファイルを編集して、PasswordAuthenticationのyesをnoにします。

$sudo vim /etc/ssh/sshd_config 

Macターミナル(クライアント側)

$ssh -p ポート番号 ユーザ名@サーバーのipアドレス #ログインです

設定したポート番号で正しくログインできるかどうか確認しましょう。

以上です。

最後に

参考:

joker.hatenablog.com

qiita.com

CSSのpositionと擬似要素について

CSSの課題

  • Fjord Boot Campの課題で難しかったポイントを整理します。

positionの扱い方

positionといえば、「要素の位置を決めるプロパティ」のことですね。

値として、以下の4種類があります。

  • static
  • absolute
  • relative
  • fixed

また、positionはtopleftrightbottomというプロパティをセットで使用します。

  1. positionで基準を決定する
  2. topleftrightbottom で数字を調整する

というイメージです。

staticについては、初期値であることやtopなどを指定しても効かないため、ほとんど使用しません。

また、fixedは画面からの位置を固定する場合に用い、ヘッダーなどに使用することが多いです。

恐らく、誤解しやすいといえば、relativeとabsoluteの使用方法ですね。

まず、relativeは「本来の表示位置を基準とした相対的位置」を示します。

See the Pen relative by Tomo (@tomomik9) on CodePen.


指定ありの方のパラグラフは本来の位置(ブロック要素なので指定なしのパラグラフの下)に比べて、少しずれていますね。

これは、position:relativeを設定し、top:20pxleft:20pxを指定したからです。

absoluteはどうでしょう。absoluteは、「親要素を基準」に、絶対的な位置を指定します。

See the Pen CSS absolute by Tomo (@tomomik9) on CodePen.


要素2が要素1より上に来ているのは、要素2のクラスにposition:absoluteを記載し、親要素からの絶対的な位置を設定したためです。

親要素にposition:relativeを設定するのを忘れないようにしましょう。

このabsoluteをうまく使えば、親要素の画像の上にラベルをつけたり、表現の幅が広がりますね。

擬似要素の使い方

CSS3のセレクタはかなりの数に上りますは、その中でも擬似要素は使えると非常に便利ですね。

  • E::before
  • E::after

E要素の前あるいは後にコンテンツを挿入します。

See the Pen before and after by Tomo (@tomomik9) on CodePen.


注意点は、挿入コンテンツがインライン要素であることです。

本題の課題

これらの知識を総動員して、アイコンをCSSだけで作りました。もちろん、課題の一部です。

ポイントは、

  1. 擬似要素を使い、見出しの前と後に空のコンテンツ(content:"")を作ります。
  2. 空のコンテンツはインライン要素なのでdisplay:blockに直し、色や幅を設定します。インライン要素の場合、空ではコンテンツとしてスペースの確保ができない状態になります。

f:id:b_leiu:20190216222111p:plain:w450

見出しの前と後ろ(ブロック要素なので縦に並んでますね)に色がついたコンテンツが2つ確認できますね。

  1. それぞれの領域にborder-rightで右側に同じ大きさのボーダーをつけます。

f:id:b_leiu:20190216221825p:plain:w400

  1. 位置を動かすために、見出しを親要素として、擬似要素にpositionを設定します。

最終的にはこのようなアイコンが作成されます。

See the Pen CSS PRACTICE by Tomo (@tomomik9) on CodePen.

最後に

インライン要素とブロック要素は以下の記事がおすすめです。

saruwakakun.com

また、セレクタについてはこのまとめがわかりやすいです。

wp-e.org

以上となります!

sudoのインストール

sudoの初期設定をしましょう

なぜsudo?

sudoってなんでしょうね。

一般ユーザーとしてログインしているけど、スーパーユーザー(rootユーザー)の権限を使って操作したいときってありませんか? ファイルを削除したり、中身を編集したいときとか・・

sudoコマンドを使うと、rootユーザーとしてログインしなくても、必要な時にroot権限を持った状態で操作ができるようになります!

sudoのインストール

インストール自体は、かなり簡単です。rootユーザーでログインし、

#apt install sudo

ここからある作業が必要となります。これだけではsudoコマンドは使えないんです。

visudoコマンドの実行

sudoの設定ファイルがあるので、rootユーザーでvisudoを実行しましょう。

このコマンドを実行すると自動的にnanoエディタでsudoの設定ファイルが開きます。

#が頭にある文字列の羅列が続きます。下記画面に記載されているUser Prvilege specificationという項目を探します。

f:id:b_leiu:20190215194356p:plain

root ALL=(ALL:ALL) ALLの下にユーザーを追加しましょう!

ユーザー名 ALL=(ALL:ALL) ALL #ユーザ名は変更しましょう。

この権限を表す式は「ユーザー ホスト=(誰々として) コマンドパス」という意味です。 コマンドパスの部分については、ALLの場合、すべてのコマンドを実行可能という意味になりますね。 したがって、

test ALL=(ALL) /usr/sbin/useradd #ユーザー(test)は、useraddコマンドをsudoで実行可能という意味

このような設定も可能です。

これでユーザーの追加は終了です。ところが、最後に編集の終了の仕方がわからない・・・ 画面の後半が文字化けしていて、何を押したら良いのか不明なのです。

f:id:b_leiu:20190215201056p:plain

^G ヘルプ      
^O 書き込み    
^W 検索        
^K 切り取り    
^J 均等割付    
^C カーソル位置^Y 前のページ
^X 終了        
^R 読み込み    
^\ 置換        
^U 貼り付け    
^T スペル確認  
^_ 行を指定    
^V 次のページ

「Ctrl + X」で終了できます。最後、YesかNoを聞かれますが、YでOK

今回は、rootユーザーとしてファイルをいじったので、su -で一般ユーザーに戻って、sudoコマンド実行できるか試してみましょう。

また、Rootユーザーでvi /etc/sudoersを実行すると同じファイルをviで修正することも可能です。

(補足)パスワードの制御

実は、visudoコマンドでファイルを編集する際に、パスワードの入力の制御も設定可能です。

test ALL=NOPASSWD:  /usr/sbin/useradd

例えば、これでユーザー(test)はuseraddコマンドを実行した際に、パスワードの入力が必要なくなります。

便利ですね。

最後に

sudoのインストールはこれで終了です。

APTについて

パッケージ管理システムAPTについて

  • APTとdpkg
  • Debianのパッケージとsources.listの編集について

APTとは?

APTとは、Debian用に開発されたパッケージ管理システムです。同じようにパッケージ管理システムとしてdpkgというソフトウェアがあるのですが、一応下記のように区別されています。

  • APT(パッケージ間の依存関係を解消、個別のパッケージを「統合管理」する= dpkgを管理する)
  • dpkg(個々のパッケージを管理)

dpkgの方が先に開発され、そのdpkgを管理するために「APT」が開発されたという経緯があります。APTとは「Advanced Packaging Tool」の略です。

また、CUIのフロントエンドツールとしてaptitudeがあります。

APTの役割について

APTは、パッケージの依存関係を管理するのが主な役割です。パッケージとは「ソフトウェア」のことです。

コンパイル済みパッケージ(バイナリパッケージと呼ぶ)同士の関係を主に下の4つにわけて管理します。

これらの関係を用いて、目的のパッケージをインストールするために必要なパッケージもしくは削除する必要があるパッケージを自動計算してくれます。

  • 依存
    • パッケージを導入するのに欠かすことのできないパッケージ。
  • 推奨
    • 無くてもよいが、プログラムの機能を利用するために通常は導入するパッケージ。
  • 提案
    • 無くてもよいが、導入することによってプログラムの機能を向上させるパッケージ。
  • 衝突
    • パッケージを導入することで、同一の機能を有するなどの理由で削除されるパッケージ。

代表的なコマンドまとめ

コマンドが実はaptapt-getaptitudeと3種類あります。apt-getの設計ミスを克服するためにaptが開発された経緯があるそうです。

とりあえず、aptが推奨されているようなのでaptを使います。

sudo apt update #リポジトリの更新(sources.listで設定されたすべての取得元からパッケージ情報をダウンロードするために使用される)

searchコマンドなどの検索系やupgradeコマンドなどの更新系はこのコマンドを前提にしています。

sudo apt upgrade  #インストール済みソフトウェアの更新
sudo apt full-upgrade #upgradeコマンドと異なり、システム全体をアップグレードするために必要とされる場合には、現在インストール済みのパッケージを削除することができる。

更新系のコマンドは、最新のパッケージをインストールするために、他のパッケージのインストールも必要な場合は合わせてインストールします。 ただ、upgradeコマンドの場合、他のインストール済みパッケージを削除する必要があるパッケージについてはアップグレードをしません。

updateやupgradeコマンドは、root権限で実行します。上記はsudoコマンドで実行している例になります。

$apt search  検索ワード #キーワードに合わせてソフトウェアを検索
$apt show パッケージ名 #特定パッケージの情報を開示
sudo apt install パッケージ名 #新規パッケージのインストール
sudo apt remove パッケージ名 #パッケージの削除
sudo apt purge パッケージ名 #設定ファイルも削除したい場合

Debianのパッケージについて

Debianのパッケージの入手先は/etc/apt/sources.listにて設定されています(設定ファイルということですね)。下記のようにバイナリとソースファイルの入手先がそれぞれ記載されています。

deb http://site.example.com/debian distribution component1 component2 component3
deb-src http://site.example.com/debian distribution component1 component2 component3
ただ、mainディストリビューションに含まれていないパッケージについてはこれらの記載がないため、ダウンロードしたい場合は別途対応が必要となります。 以下はDebian公式の引用です。

公式 Debian ディストリビューションに含まれているすべてのパッケージは、 Debian フリーソフトウェアガイドライン にしたがい、パッケージとそのソースコードの自由な利用および再配布が保証されています。 公式 >Debian ディストリビューションとは、Debian アーカイブの main セクションに含まれているものです。

ユーザへのサービスとして、フリーではないライセンスや法律上の問題のために main ディストリビューションに含むことができないパッケージも、独立 したセクションとして提供します。セクションには以下のようなも>のがあります。

Contrib このディレクトリにあるパッケージは、著作権所有者によってフリーに ライセンスされていますが、他のフリーではないソフトウェアに依存します。 Non-Free このディレクトリにあるパッケージは、 そのソフトウェアの利用や再配布になんらかの煩わしい制限があるものです。 同一のパッケージが、異なるバージョン番号で複数のディストリビューション に現れることもあります。

上記公式ページ内に記載されているContribや Non-Free、また安定版にはない新しいバージョンのソフトウェアを入手するために必要なBackportsリポジトリはデフォルトでは提供されていないため、sources.listを直に編集して追記する必要があります。

Vimなどのテキストエディタで立ち上げ、sources.list内で以下のようにmainの後に半角空白スペースでnon-freecontribを追加するだけです。

deb http://deb.debian.org/debian stretch main contrib non-free
deb-src http://deb.debian.org/debian stretch main contrib non-free

deb http://deb.debian.org/debian-security/ stretch/updates main contrib non-free
deb-src http://deb.debian.org/debian-security/ stretch/updates main contrib non-free

deb http://deb.debian.org/debian stretch-updates main contrib non-free
deb-src http://deb.debian.org/debian stretch-updates main contrib non-free

これだけで検索・インストールできるパッケージがかなり増えますね。

詳細はこちらをご確認ください。

最後に

以上となります!