20201124のLinuxに関する記事は5件です。

Apache について纏めてみる

Linuc2の学習のために、Apache について纏めてみる。
正直今まで、yum でインストールすれば利用できてしまうため、細かな設定はあまり気にしたことがなかった。
httpd.conf を編集し、apache configtest などで確認すると基本 AH〜始まるエラーが表示されるので、比較的とっつきやすい。

インストール

ソースからコンパイルする

個人的にはいつも、yum でしかインストールしないため、↓の記事を参考にしていただきたい。
コンフィグ,コンパイル,インストール

なお、ソースからコンパイルするには、APR および APR-util のインストールも必要です。

パッケージを利用する

# yum install -y httpd

設定ファイル

ディレクティブ 説明
/etc/httpd/conf/httpd.conf メイン設定ファイル
/etc/httpd/conf.d 補助設定ファイルを格納するディレクトリ
ssl.conf SSL/TLSの設定
php.conf PHPモジュールの設定
perl.conf Perlモジュールの設定

htpd.conf

  • 基本的な書式

ディレクティブ名 設定値

  • 適用範囲を指定する場合

<Files ファイル名>... </Files>
<Directory ディレクトリ名>...</Directory>
<LOcation URL>...</Location>

ディレクティブ 説明
ServerTokens バージョン情報
ServerRoot トップディレクトリ
ServerName ホスト名
ServerAdmin メールアドレス
StartServers 起動時の数
MinSpareServers 待機子プロセスの最小数
MaxSpareServers 待機子プロセスの最大数
ServerLimits 子プロセスの設定可能な上限数
Timeout クライアントからの接続がタイムアウトになる時間
KeepAlive キープアライブの有効/無効
KeepAliveRequests 1回のTCP接続における上限リクエスト数
KeepAliveTimeout 1回のTCP接続におけるタイムアウト時間
Listen 待ち受けポート
User 子プロセスの実行ユーザー
Group 子プロセスの実行グループ
DocumentRoot ドキュメントルートとなるディレクトリ
UserDir 一般ユーザーの公開ディレクトリ
DirectoryIndex ディレクトリのインデックスとして返すファイル名
ErrorLog エラーを記録するログファイル
LogLevel エラーログのログレベル
LogFormat ログに記録する項目と書式
CustomLog アクセスログ
HostnameLookups DNSの逆引きを行い、アクセス元のIPアドレスからホスト名を取得する
Alias ドキュメントルートツリー以外の場所を参照できるようになります。
ScliptAlias CGIスクリプト用ディレクトリ
ErrorDocument エラーが発生した場合の処理を指定する

外部設定ファイル

外部ファイル(.htaccess)を使って、httpd.conf の設定を上書きするには、AccessFileNameディレクトリブを使います。

httpd.conf
AccessFileName .htaccess

外部設定ファイルの利用を許可するには、AllowOverrideディレクトリブで指定する。

次の例は、.htaccess で認証とアクセス制御を利用可能にする。

httpd.conf
AllowOverride AuthConfig Limit
サブコマンド 説明
AuthConfig 認証
Indexes DirectoryIndex
Fileinfo ファイルタイプの制御
Limit Order,Allow,Deny
Options Options
None .htaccessでの変更を無効
All .htaccessで変更可能なすべての設定を有効にする

apachectl

サブコマンド 説明
start 起動
stop 停止
restart 再起動
graceful 停止中なら起動し、リクエストを再起動中なら再起動を待つ
reload 設定ファイルを読み込む
configtest 設定ファイルの構文をチェックする

モジュール

モジュール一覧

モジュールをロードするには、次のように指定します。

httpd.conf
LoadModule perl_module modules/mod_perl.so

Apache のインストール後に、モジュールを組み込むには、apxs を利用します。
その後、↑と同じように LoadModuleディレクトリブで追加します。
なお、apxs のインストールには、httpd-develパッケージをインストールする。

# yum install httpd-devel
# apxs -i -c mod_foobar.c

組み込み済みモジュールは、httpd -l
組み込み済みモジュールとDSOモジュールの一覧を表示し、設定ファイルの文法もチェックするには、httpd -M
を利用します。

# httpd -l
# httpd -M

スクリプト言語

WEBアプリケーションとして良く使われている php を取り上げます。

# yum install -y php

/etc/httpd/conf.d/php.conf ファイルが追加されます。

以下のようなファイルを作成し、Apacheを再起動させると、表示されます。

/var/www/html/phpinfo.php
<?php
  phpinfo();
?>

クライアントアクセスの認証

BASIC認証

BASIC認証を利用するには、httpd.conf にユーザー認証設定を追加し、専用のパスワードファイルを用意する。

ディレクティブ 説明
AuthType Basic
AuthName 認証の際にダイアログボックスに出力させるメッセージ
AuthUserfile パスワードファイル名
AuthGroupfile 認証するグループファイル名
require アクセス可能なユーザー、valid-userを指定するとパスワードファイルにエントリのあるユーザーがアクセスを許可されます。
httpd.conf
<Directory "/var/www/html/private-area">
AuthType Basic
AuthName "Please enter your ID and password"
AuthUserfile /etc/httpd/conf/.htpasswd
require valid-user
</Directory>

認証に用いられるユーザーとパスワードを設定するには、htpasswd を利用します。

# htpasswd -c /etc/httpd/conf/htpasswd linuc1
New password: 
Re-type new password: 
Adding password for user linuc

# cat /etc/httpd/conf/.htpasswd
linuc:$apr1$szHx1lmc$PVMPwHwo/7T0bnlbRhAFP0

グループ単位で、BASIC認証を設定するには、AuthGroupfile でグループパスワードファイルを指定します。

パスワードファイルの書式は次の通りです。
グループ名: ユーザー名1 ユーザー名2...

指定したユーザーは、それぞれ htpasswd でパスワードを設定しておきます。

require では、次の書式でグループ名を指定します。
require group グループ名

ダイジェスト認証

ディレクティブ 説明
AuthType Digest
AuthName 認証の領域
AuthUserfile パスワードファイル名
AuthDigestGroupfile 認証するグループファイル名
require アクセス可能なユーザー、valid-user を指定するとパスワードファイルにエントリのあるユーザーがアクセスを許可されます。
httpd.conf
<Directory "/var/www/html/secret-area">
AuthType Digest
AuthName "secret-area"
AuthUserfile /etc/httpd/conf/.htdigestfile
require valid-user
</Directory>

ダイジェスト認証のためのユーザー作成やパスワード変更には、htdigest を利用します。

# htdigest -c /etc/httpd/conf/.htdigest secret-area linuc2
Adding password for linuc2 in realm secret-area.
New password: 
Re-type new password: 

# cat /etc/httpd/conf/.htdigest
linuc2:secret-area:2b2b3ade579cc9e0121b4f1df227db6b

ホストベースのアクセス制御

IPアドレスやホスト名、ドメイン名などでアクセス制御をしたい場合は、requireディレクティブをを使います。
この機能は、authz_host_module で提供されます。

例えば、172.31.0.0/16 からのアクセスは拒否し、それ以外のホストからのアクセスを許可させるには次の通り指定します。

require all granted
require not ip 172.31.0.0/16

バーチャルホスト機能

1つのホストで複数のWebサイトを管理することができます。

名前ベースのバーチャルホスト

1つのホストに1つのIPアドレスと複数のドメインを設定する。
VirtualHostディレクティブ内に記述します。
DNSを適切に設定すれば、それぞれのWebサイトを独立して運用することができます。

<VirtualHost *:80>
  ServerName web.example.com
  DocumentRoot /var/www/virtual/web

<VirtualHost *:80>
  ServerName www.example.net
  DocumentRoot /var/www/virtual/example
</VirtualHost>

IPベースのバーチャルホスト

1つのホストに複数のIPアドレスと複数のドメインを設定する。
VirtualHostディレクティブ内に記述します。
ListenディレクティブでそれぞれのIPアドレスを指定しておく必要があります。

Listen 192.168.1.10:80
Listen 192.168.1.11:80

<VirtualHost 192.168.1.10:80>
  ServerName web.example.com
  DocumentRoot /var/www/virtual/web

<VirtualHost 192.168.1.11:80>
  ServerName www.example.net
  DocumentRoot /var/www/virtual/example
</VirtualHost>

監視とメンテナンス

mod_status : サーバの稼働状況についての情報

LoadModule status_module modules/mod_status.so

<Location /server-status>
  SetHandler server-status
</Location>

mod_info : サーバの設定に関する情報

LoadModule info_module modules/mod_info.so

<Location /server-info>
  SetHandler server-info
</Location>

SSL/TLS

mod_ssl を利用することで、SSLに対応します。

サイト証明書を認証局から入手する必要があります。

①公開鍵と暗号鍵を作成する。
②作成した公開鍵を、利用企業の身元を証明する書類などとともに、認証局(CA)へ送付する。
③CAでは証明書を発行して返送する。(この証明書を使って、Webサーバーは、Webブラウザに対して身元を明らかにする。)
④送られてきた証明書を、Webサーバーにインストールする。

サーバー証明書は、IPアドレスまたはドメイン名に対して発行されます。
ここでは、自己署名証明書(自身を独自の認証局として、その認証局によって証明書に署名を行う方法)を取り上げます。
CentOSでは、SSLがインストールされたディレクトリ内にCA.shというスクリプトが用意されているので、それをコピーして対話的に作成します。

# cd /etc/pki/tls/misc
# ./CA -newca

秘密鍵:/etc/pki/CA/private/cakey.pem
公開鍵:/etc/pki/CA/cacert.pem
のように作成されます。

SSL対応HTTPサーバーを構築するために必要となるサーバー秘密鍵 server.key を作成します。

# openssl genrsa -out server.key 2048

認証局に対しての証明書の発行を要求する証明書発行要求書(CSR) server.csr を作成します。

# openssl -req -new -key server.key -out server.csr

証明書発行要求ファイルに対して証明書が署名を行いサーバー証明書 server.crt を作成します。

# openssl ca -out server.crt -infiles server.csr

サーバー秘密鍵とサーバー証明書を適切なディレクトリに移動し、httpd.conf に必要な設定を記述します。

SSL/TLS関連のディレクティブ 説明
SSLEngine 有効/無効
SSLProtocol バージョン
SSLCipherSuite 暗号アルゴリズム
SSLCertificateFile サーバー証明書ファイル
SSLCertificateKeyFile サーバー秘密鍵ファイル
SSLCertificateChainFile 中間CA証明書ファイル
SSLCACertificateFile クラアイント証明書発行のCA証明書発行ファイル
SSLCACertificatePAth クラアイント証明書発行のCA証明書発行ディレクトリ
SSLVerifyClient クライアント認証のレベル
LoadModule ssl_module modules/mod_ssl.so
Listen 443 https

<VirtualHost _default_:443>
  ServerName www.example.net:443
  DocumentRoot "/var/www/html"
  ErrorLog logs/ssl_errorlog
  TransferLog logs/ssl_access_log
  LogLevel warn
  SSLEngine on
  SSLProtocol all -SSLv2 -SSLv3
  SSLCipherSuite HIGH:3DES:!aNULL:!MD5:!SEED:!IDEA:!DH
  SSLCertificateFile /etc/httpd/conf/ssl.crt/server.crt
  SSLCertificateKeyFile /etc/httpd/conf/ssl.key/server.key
</VirtualHost>

※検証などで、試したい場合は、Let's Encrypt で、無償でデジタル証明書を発行してもらえます。

ログファイル

アクセスログファイル

/var/log/httpd/access_log

LogFormat ディレクティブでフォーマットを指定し、
CustomLog ディレクティブでログファイル名とフォーマットを結びつけます。

httpd.conf
LogFormat

CustomLog logs/access_log combined

エラーログファイル

/var/log/httpd/error_log

LogLevel ディレクティブで、記録するログレベルを指定することができます。

httpd.conf
LogLevel
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

初心者だからわかること ファイルの作り方(初投稿)

ファイルの作り方 (始めたて向けの記事です)

1 ターミナルを起動する
2 cd deskTop ☜Tは大文字にしてください

3 mkdir 付けたいファイル名

4これでデスクトップにファイルが出来上がりました!!

初投稿なので至らない部分があると思いますがそこは注意してくださったら幸いです!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

初めて、Unix(Linux)について学びました。

今回の記事

初心者が初めて、Unixを学びましたので重要な要点をまとめて、定着を兼ねてアウトプットしていきます。同じような初心者の方に微力ながらお力に慣れたら幸いです。

Unixとは?Linuxとの違いは何?

Unixと勉強するとLinuxという言葉も目にすると思います。根本的には同じOSです。ここで初心者からしたらそもそも"OS"って何?という感じだと思うのでその説明からしたいと思います。

  • OS
    • Operation System(オペレーション・システム)の略で、アプリやデバイスを動作させるための基本となるものである。
    • これがないとパソコンやスマホは動かないもの、身体でいう脳のような役割を担っているものです。

OSには様々な種類があり、以下の表でまとめてました。

OS名 用途
android スマートフォンをハードウェアとする
iOS iphoneをハードウェアとする 
Windows PCをハードウェアとする
Mac OS PCをハードウェアとする
Unix サーバーをハードウェアとする
Linux PCまたは、サーバーをハードウェアとする

何個か聞いたことがあるものがあったと思います。これらの1種にUnixやLinuxは含まれます。それぞれで特徴を持っています。

  • Unix

    • 現存するOSの中でもっとも古いOSです。
    • OSの安定性は高く、ネットワーク機能に優れている。なので、大型な計算機やネットワークサーバーのOSとしてはUnixが圧倒的に多くなっています。
    • CUIベースのOS
  • Linux

    • Unixを参考に0から作られているOSです。パソコン、スマホなど多くに使用されている。
    • フリーソフトウェアとして公開されていて、誰でも自由に開発したり、配布したり、使ったりできます。
    • 独自の構成や設定で配布している企業などが多く、その配布形式をディストリビューションと呼ばれています。
    • 低い性能のコンピューターでも軽快に動作します。
    • CUIベースのOS

2つの紹介の中であったCUIとはインターフェイスのことでGUIの2種類があります。
GUI : ファイル操作がグラフィカルに表現されているインターフェイスのことです。マウスやトラックボード、タッチパネルなどを用いて操作を可能にします。

CUI : 情報の表示を文字によって行い、全ての操作をキーボードを用いて行うインターフェイスのことです。命令コマンドを打つことによって、ファイルの操作やアプリケーションの起動を行います。

今まで述べた2つの特徴の共通点をまとめると

  • 高い信頼性と安定性
  • CUIベースのOS
  • 企業のサーバーOSとして使用されている

ということがわかる。最後に異なる点は?だが大きく言えるのは、

  • Unixは企業が開発して、知的財産権が企業に属しているということ
  • Linuxはオープンソースソフトフェアで配布や使用は自由

という点が挙げられるということがわかりました。

カーネルとシェル

  • カーネル

Unixとは、CUIベースのOSと説明しましたが、コマンドを入力しそこで表示された結果からまたコマンドを入力するというサイクルで操作します。これらの様々な処理を行なっているのがカーネルです。カーネルが管理している機能を用いて、ユーザーは様々なことができているのです。しかしカーネルは処理を行なっているだけで、解釈や実行を行なっているのは別にあります。それがシェルです。

  • シェル

ユーザーとカーネルの間に存在していて、カーネルの周りを覆うようにいるためシェルと呼ばれています。何をしているのかというと、ユーザーが操作を行い入力したコマンドは一旦、シェルが受け取り解釈しカーネルがわかるようにコマンドを実行し処理を依頼している。そして、その結果を解釈し、画面に出力するという役割を持っています。

ユーザーとグループ

  • ユーザー
    • 管理者(root)ユーザー
    • 一般ユーザー

Unixは、1台のコンピューターで複数のユーザーが利用でき、最初にログインしなければなりません。そのため、特定のユーザーを識別するために、ユーザーIDがある。そしてこれは、ログイン名やアカウント名が割り当てられ、それによってもユーザーを識別することができます。また、ユーザーは管理者ユーザー一般ユーザーに分けられます。管理者ユーザーはコンピューターの最大権限を持っており、全てのコマンドの実行、ディレクトリへのアクセス権、システムの管理、設定を行うことができる。そのため、ミスをしないように、役割ごとに一般ユーザーを設定するのが一般的です。

  • グループ

上記で述べた通り、ユーザーは複数あります。また、ユーザーごとに持っている権限が異なったり、使用できるディレクトリが異なります。そのためシステム上管理しやすくするためにグループという機能があります。ユーザーは必ず1つのグループに所属していて、また複数のグループに所属することもできます。

アクセス権

アクセス権とは、全てのファイルやディレクトリにはどのユーザーに対してどのような操作が行えるかという設定のことです。アクセス権には3種類ありファイル、ディレクトリのアクセス権限が表記により異なります。

アクセス権 概要
r read。ファイル、ディレクトの読み取りが可能という意味。(内容の表示、ファイル名の表示など)
w write。ファイル、ディレクトリの書き込みが可能という意味。(編集やコピー、新規ファイル作成など)
x execute。ファイルの実行が可能という意味。ただしディレクトリは実行ではなく、開くことが可能という意味になる。
$ ls -l : アクセス権の確認をする

上記のlsコマンドのオプション-lで表示されるアクセス権は以下の通りです。

-rx-r--r--

上記のアクセス権の見方ですが、1番左の-はファイルの種別、そこから続く9文字は3文字区切りにで分けられます。左から所有者のアクセス権、グループのアクセス権、その他ユーザーのアクセス権となります。

  • ファイルの種別
    • -はファイル
    • dはディレクトリ
    • lはリンク

PATHとは?

PATHとは環境変数の名前です。じゃあ環境変数って何?という感じだったので調べました。環境変数を理解するにはまず、Unixの変数について理解する必要があるのでこちらから説明したいと思います。

  • まずそもそも変数とは?

変数とは、プログラムを実行する際、シェルからプログラムへ情報を渡す1つの方法です。プログラムに置いてメモリなどに用意するデータを記憶させるための箱のようなものができます。すなわち、プログラムによって値を記憶させた箱が変数であると言えます。

  • Unixの変数

Unixの変数は、大まかに環境変数シェル変数に分かれます。プログラムでは特定の変数を見つけるためにある環境の中で見つけます。それがこの2種類となる。

  • シェル変数

一時的な作業のためにその場のシェルで使用されるもの。

  • 環境変数

こちらはより重要な役割を持ち、その他の変数はそのプロセス内でのも有効なのに対して、環境変数はその他のプロセスと共有できるという特徴があります。また環境変数の名前は大文字で作成するのが慣習的であります。そしてこの環境変数の中にPATHというディレクトリがあります。
ここからが最初の疑問のPATHとは何かの説明をしたいと思います。

  • PATH

PATHとは、シェルがコマンドを検索するべきディレクトリのことです。Unixではコマンドを打った時そのコマンドを実行ファイルから検索し、特定の値を見つけ実行しています。例えば、以下のような時

$ pwd

これは現在のディレクトリの位置を示すコマンドですが、これは省略された書き方であって本来は

$ /bin/pwd

というように書きます。これはPATHの中にあるbinのディレクトリの中のpwdを実行してねという意味を表しています。しかし、PATHの中にあるものは省略して書いてもいいので$ pwdと書いているのです。また、PATHは新たに追加したりすることができます。その時使用するコマンドが下記になります。

$ export PATH=/***/user/
$ export PATH=/***/user/:$PATH

まず1つ目が上書きするコマンドで他のものは削除され、上書きする形なので使用に注意が必要です。2つ目は既存のものを残しつつ、文末に追加するというコマンドです。なので通常、使用する時はほとんどの場合、2つ目が多いと思います。

リダイレクション

Unixのシェルはコマンドの入力や出力を切り替えるリダイレクション機能を持っている。Unixでは入力は普通はキーボードからされて、出力は普通は画面からされる。これが各々、標準入力と標準出力と呼ばれている。

  • 標準入力と標準出力

わかりやすいように実際の例で説明すると

$ echo Hello_World
Hello_World

文字列を表示する~$ echoを使用し、2行目で表示されている文字列が標準出力となります。標準入力はそのままの入力です。
次に標準出力のリダイレクトについての説明をしていきたいと思います。

$ echo Hello_World > Hello_World.txt

上記のようにすると何も表示されずにプロンプトが戻ってきます。そして

$ cat Hello_World.txt

とすると中身に文字列が保存されて標準出力を.txtにリダイレクトしたことになります。さらにここから同じように>を使用して文字列を入れると既存の文字列は消え、上書きされる。なので既存のデータを残しつつ、追加したい場合は>>を使用します。
次に標準入力のリダイレクトについて説明いきます。

$ cat Hello_World.txt
aaaa
bbbb
cccc
dddd

というファイルがあるとします。

$ grep "cccc" < Hello_World.txt
cccc

とすると.txtからccccの文字列を探し出してくれる。これはコマンドの標準入力にファイルを流し込んでいるということになります。

パイプライン

パイプラインとは、コマンドの入出力を次のコマンドに引き渡すという処理を行うことを指します。コマンドとコマンドをつなぐ際は|を間に入れ使用します。例えば、以下のような例が挙げられます。

$ ls -l | sort -r

これはlsコマンドの結果をsortコマンドで逆順した結果を返してくれます。パイプラインは、コマンドをつなげていくだけで、数に限りはないためいくつでも連結ができるが、だいたい3つくらいで事足りることがほとんどです。

学習を終えて

これまで使用してきたOSとは違い、コマンドで全ての処理を行うということにあまりイメージが湧きませんでしたが一通り終えてみて自分でも扱えるかもしれないと思えて来れて、これからの業務の幅が広げられる可能性が増えてとても達成感がありました。学習をしてきた中で一番苦労したのは、PATHの部分です。コマンドが数あるディレクトリの中の特定のファイルの1つから検索されて、なおかつexportを使い新たなものを追加し、使用できるというが想像できず理解に苦しみました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

初めてUnix(Linux)について学びました。

今回の記事

初心者が初めて、Unixを学びましたので重要な要点をまとめて、定着を兼ねてアウトプットしていきます。同じような初心者の方に微力ながらお力に慣れたら幸いです。

Unixとは?Linuxとの違いは何?

Unixと勉強するとLinuxという言葉も目にすると思います。根本的には同じOSです。ここで初心者からしたらそもそも"OS"って何?という感じだと思うのでその説明からしたいと思います。

  • OS
    • Operation System(オペレーション・システム)の略で、アプリやデバイスを動作させるための基本となるものである。
    • これがないとパソコンやスマホは動かないもの、身体でいう脳のような役割を担っているものです。

OSには様々な種類があり、以下の表でまとめてました。

OS名 用途
android スマートフォンをハードウェアとする
iOS iphoneをハードウェアとする 
Windows PCをハードウェアとする
Mac OS PCをハードウェアとする
Unix サーバーをハードウェアとする
Linux PCまたは、サーバーをハードウェアとする

何個か聞いたことがあるものがあったと思います。これらの1種にUnixやLinuxは含まれます。それぞれで特徴を持っています。

  • Unix

    • 現存するOSの中でもっとも古いOSです。
    • OSの安定性は高く、ネットワーク機能に優れている。なので、大型な計算機やネットワークサーバーのOSとしてはUnixが圧倒的に多くなっています。
    • CUIベースのOS
  • Linux

    • Unixを参考に0から作られているOSです。パソコン、スマホなど多くに使用されている。
    • フリーソフトウェアとして公開されていて、誰でも自由に開発したり、配布したり、使ったりできます。
    • 独自の構成や設定で配布している企業などが多く、その配布形式をディストリビューションと呼ばれています。
    • 低い性能のコンピューターでも軽快に動作します。
    • CUIベースのOS

2つの紹介の中であったCUIとはインターフェイスのことでGUIの2種類があります。
GUI : ファイル操作がグラフィカルに表現されているインターフェイスのことです。マウスやトラックボード、タッチパネルなどを用いて操作を可能にします。

CUI : 情報の表示を文字によって行い、全ての操作をキーボードを用いて行うインターフェイスのことです。命令コマンドを打つことによって、ファイルの操作やアプリケーションの起動を行います。

今まで述べた2つの特徴の共通点をまとめると

  • 高い信頼性と安定性
  • CUIベースのOS
  • 企業のサーバーOSとして使用されている

ということがわかる。最後に異なる点は?だが大きく言えるのは、

  • Unixは企業が開発して、知的財産権が企業に属しているということ
  • Linuxはオープンソースソフトフェアで配布や使用は自由

という点が挙げられるということがわかりました。

カーネルとシェル

  • カーネル

Unixとは、CUIベースのOSと説明しましたが、コマンドを入力しそこで表示された結果からまたコマンドを入力するというサイクルで操作します。これらの様々な処理を行なっているのがカーネルです。カーネルが管理している機能を用いて、ユーザーは様々なことができているのです。しかしカーネルは処理を行なっているだけで、解釈や実行を行なっているのは別にあります。それがシェルです。

  • シェル

ユーザーとカーネルの間に存在していて、カーネルの周りを覆うようにいるためシェルと呼ばれています。何をしているのかというと、ユーザーが操作を行い入力したコマンドは一旦、シェルが受け取り解釈しカーネルがわかるようにコマンドを実行し処理を依頼している。そして、その結果を解釈し、画面に出力するという役割を持っています。

ユーザーとグループ

  • ユーザー
    • 管理者(root)ユーザー
    • 一般ユーザー

Unixは、1台のコンピューターで複数のユーザーが利用でき、最初にログインしなければなりません。そのため、特定のユーザーを識別するために、ユーザーIDがある。そしてこれは、ログイン名やアカウント名が割り当てられ、それによってもユーザーを識別することができます。また、ユーザーは管理者ユーザー一般ユーザーに分けられます。管理者ユーザーはコンピューターの最大権限を持っており、全てのコマンドの実行、ディレクトリへのアクセス権、システムの管理、設定を行うことができる。そのため、ミスをしないように、役割ごとに一般ユーザーを設定するのが一般的です。

  • グループ

上記で述べた通り、ユーザーは複数あります。また、ユーザーごとに持っている権限が異なったり、使用できるディレクトリが異なります。そのためシステム上管理しやすくするためにグループという機能があります。ユーザーは必ず1つのグループに所属していて、また複数のグループに所属することもできます。

アクセス権

アクセス権とは、全てのファイルやディレクトリにはどのユーザーに対してどのような操作が行えるかという設定のことです。アクセス権には3種類ありファイル、ディレクトリのアクセス権限が表記により異なります。

アクセス権 概要
r read。ファイル、ディレクトの読み取りが可能という意味。(内容の表示、ファイル名の表示など)
w write。ファイル、ディレクトリの書き込みが可能という意味。(編集やコピー、新規ファイル作成など)
x execute。ファイルの実行が可能という意味。ただしディレクトリは実行ではなく、開くことが可能という意味になる。
$ ls -l : アクセス権の確認をする

上記のlsコマンドのオプション-lで表示されるアクセス権は以下の通りです。

-rx-r--r--

上記のアクセス権の見方ですが、1番左の-はファイルの種別、そこから続く9文字は3文字区切りにで分けられます。左から所有者のアクセス権、グループのアクセス権、その他ユーザーのアクセス権となります。

  • ファイルの種別
    • -はファイル
    • dはディレクトリ
    • lはリンク

PATHとは?

PATHとは環境変数の名前です。じゃあ環境変数って何?という感じだったので調べました。環境変数を理解するにはまず、Unixの変数について理解する必要があるのでこちらから説明したいと思います。

  • まずそもそも変数とは?

変数とは、プログラムを実行する際、シェルからプログラムへ情報を渡す1つの方法です。プログラムに置いてメモリなどに用意するデータを記憶させるための箱のようなものができます。すなわち、プログラムによって値を記憶させた箱が変数であると言えます。

  • Unixの変数

Unixの変数は、大まかに環境変数シェル変数に分かれます。プログラムでは特定の変数を見つけるためにある環境の中で見つけます。それがこの2種類となる。

  • シェル変数

一時的な作業のためにその場のシェルで使用されるもの。

  • 環境変数

こちらはより重要な役割を持ち、その他の変数はそのプロセス内でのも有効なのに対して、環境変数はその他のプロセスと共有できるという特徴があります。また環境変数の名前は大文字で作成するのが慣習的であります。そしてこの環境変数の中にPATHというディレクトリがあります。
ここからが最初の疑問のPATHとは何かの説明をしたいと思います。

  • PATH

PATHとは、シェルがコマンドを検索するべきディレクトリのことです。Unixではコマンドを打った時そのコマンドを実行ファイルから検索し、特定の値を見つけ実行しています。例えば、以下のような時

$ pwd

これは現在のディレクトリの位置を示すコマンドですが、これは省略された書き方であって本来は

$ /bin/pwd

というように書きます。これはPATHの中にあるbinのディレクトリの中のpwdを実行してねという意味を表しています。しかし、PATHの中にあるものは省略して書いてもいいので$ pwdと書いているのです。また、PATHは新たに追加したりすることができます。その時使用するコマンドが下記になります。

$ export PATH=/***/user/
$ export PATH=/***/user/:$PATH

まず1つ目が上書きするコマンドで他のものは削除され、上書きする形なので使用に注意が必要です。2つ目は既存のものを残しつつ、文末に追加するというコマンドです。なので通常、使用する時はほとんどの場合、2つ目が多いと思います。

リダイレクション

Unixのシェルはコマンドの入力や出力を切り替えるリダイレクション機能を持っている。Unixでは入力は普通はキーボードからされて、出力は普通は画面からされる。これが各々、標準入力と標準出力と呼ばれている。

  • 標準入力と標準出力

わかりやすいように実際の例で説明すると

$ echo Hello_World
Hello_World

文字列を表示する~$ echoを使用し、2行目で表示されている文字列が標準出力となります。標準入力はそのままの入力です。
次に標準出力のリダイレクトについての説明をしていきたいと思います。

$ echo Hello_World > Hello_World.txt

上記のようにすると何も表示されずにプロンプトが戻ってきます。そして

$ cat Hello_World.txt

とすると中身に文字列が保存されて標準出力を.txtにリダイレクトしたことになります。さらにここから同じように>を使用して文字列を入れると既存の文字列は消え、上書きされる。なので既存のデータを残しつつ、追加したい場合は>>を使用します。
次に標準入力のリダイレクトについて説明いきます。

$ cat Hello_World.txt
aaaa
bbbb
cccc
dddd

というファイルがあるとします。

$ grep "cccc" < Hello_World.txt
cccc

とすると.txtからccccの文字列を探し出してくれる。これはコマンドの標準入力にファイルを流し込んでいるということになります。

パイプライン

パイプラインとは、コマンドの入出力を次のコマンドに引き渡すという処理を行うことを指します。コマンドとコマンドをつなぐ際は|を間に入れ使用します。例えば、以下のような例が挙げられます。

$ ls -l | sort -r

これはlsコマンドの結果をsortコマンドで逆順した結果を返してくれます。パイプラインは、コマンドをつなげていくだけで、数に限りはないためいくつでも連結ができるが、だいたい3つくらいで事足りることがほとんどです。

学習を終えて

これまで使用してきたOSとは違い、コマンドで全ての処理を行うということにあまりイメージが湧きませんでしたが一通り終えてみて自分でも扱えるかもしれないと思えて来れて、これからの業務の幅が広げられる可能性が増えてとても達成感がありました。学習をしてきた中で一番苦労したのは、PATHの部分です。コマンドが数あるディレクトリの中の特定のファイルの1つから検索されて、なおかつexportを使い新たなものを追加し、使用できるというが想像できず理解に苦しみました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

でかすぎる改行なしのsitemap.xml内のURLをLinuxコマンドで調べる

でかすぎる改行なしのsitemap.xml内にurlがいくつ書いてあるか調べたくて、Linuxコマンドでサクッとやってみた。

</url> の後に改行コード入れて、行数を調べることで判定してみる。

sedの出力で改行コードを出すのに\nとか入れてみてもnと文字が出てしまうので、結局コマンドラインから改行そのものを入れた。ダブルクオートではなくシングルクオートで囲まないとうまくいかない。改行前の\も忘れずに。

$ cat sitemap.xml | sed -e 's/<\/url>/<\/url>\
/g' | wc -l

出てきた数値−1がurlの数、のはず。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む