プロンプトの表示形式の環境変数「PS1」をひたすら変えてみた。
プロンプトの表示を変更できる環境変数PS1ですが、いろいろと変更できるようなので、一通り打って表示してみました。
まずは、最後にもとに戻せるように今の値を控えておきました。
[root@host1 ~]# echo $PS1
[\u@\h \W]\$
[root@host1 ~]#
\u :ログインユーザ名 -->root
\h:ホスト名。最初の.(ドット)まで -->host1
\W:カレントディレクトリ(ワーキングディレクトリ) -->~(ユーザホームDir)
が入ってますね。
書式の一覧はこちらを参考にしました。
また、書式はたくさんあるので忘れてしまったときは、bashのmanで確認することもできます。
[root@host1 ~]# man bash
manの中でpromptingで検索して、"n"(次検索)を何回か押してるとと出てきます。
/prompting
基本的には、PS1="書式"と打てばプロンプトに反映されます。
試しに$のプロンプトに変えるには、
[root@host1 ~]# PS1="$ "
$
となります。
以下、他の書式に変えてみた結果です。
$ PS1="\d " ...日付に変更(「曜 日 月 日」の形式)
Tue Nov 14
Tue Nov 14 PS1="\a " ...ベル文字 - Wikipediaを表示する?
...何にも表示されてません。ビープ音鳴らしてくれるみたいです。
PS1="\e " ...エスケープ文字 - Wikipediaを表示する
...何にも表示されてません。特殊文字をプロンプトに出したいときに前につけるのではと。
PS1="\h " ...ホスト名。最初の.(ドット)まで
host1
host1 PS1="\H " ...ホスト名。全部
host1.example.com
host1.example.com PS1="\n " ...改行
...↑改行されて、この行から文字が打てます。
PS1="\r " ...復帰?なんのことかはわかりませんでした。
PS1="\s " ...シェル名を表示
-bash
-bash PS1="\t " ...時刻表示「HH:MM:SS」。24H
21:20:37
21:20:37 PS1="\T " ...時刻表示「HH:MM:SS」。12H
09:20:44
21:20:44 PS1="\@ " ...時刻表示1「am/pm」。12H
09:21 AM
09:21 AM PS1="\u " ...ログインユーザ
root
root PS1="\v " ...bashのバージョン
4.2
4.2 PS1="\V " ... bashのリリース
4.2.46
4.2.46 PS1="\w " ...カレントディレクトリ。絶対バスで表示
~ ...ホーム配下のフォルダーへ移動
~ cd Videos/
~/Videos ...ホームDirからの絶対パスで表示されました。
~/Videos cd /etc .../etcに移動してみると。
/etc ...絶低パスで表示
/etc PS1="\W " ...カレントディレクトリ。絶対パスなし。
etc .../(スラッシュ)が表示されなくなりました。
etc cd ...ホームDirへと。
~
~ PS1="\! " ...このコマンドの履歴番号
493
493 ...改行だけだとカウントアップしません。
493 PS1="\# " ...コマンド番号(現在セッション中の実行回数)
85
85 PS1="\111 " ...8進数nnnに対応する文字
I ...適当に111を入れたらI(インドのアイ)になりました。
I PS1="\\ " ...バックスラッシュを表示(手前の\はエスケープ文字ですね。)
\
\ PS1="[ " ...括弧
[ PS1="] " ...括弧閉じ
]
] PS1="[\u@\h \W]\$" ...もとに戻して終わりです。
[root@host1 ~]$
以上でした。。。
firewalldを使う。
Firewalldは、RHEL 7から採用されたファイアーウォールです。パケットの送受信において、あらかじめ指定したルールに基づいてパケットをフィルタします。ちなみにRHEL 6までは、iptablesが使用されておりました。なんで変えたんだろう。。という気もしなくもないですが、iptablesも引き続き7.xで使えます。
多分デフォルトで入っているかと思いますが、firewalldに関するモジュールを確認して入ってなかったらインストールします。
[root@host1 ~]# yum list installed |grep firewalld
firewalld.noarch 0.4.3.2-8.el7 @anaconda/7.3
firewalld-filesystem.noarch 0.4.3.2-8.el7 @anaconda/7.3
[root@host1 ~]#
firewwalldの起動
firewalldを有効化します。システム起動時に自動起動してくれます。
[root@host1 ~]# systemctl enable firewalld
サービスを立ち上げます。
[root@host1 ~]# systemctl start firewalld
念の為、ステーテスを確認しておきます。
[root@host1 ~]# systemctl status firewalld -l
??irewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2017-10-31 16:01:37 JST; 1 weeks 5 days ago
Docs: man:firewalld(1)
Main PID: 738 (firewalld)
CGroup: /system.slice/firewalld.service
??738 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
Oct 31 16:01:36 host1.example.com systemd[1]: Starting firewalld - dynamic firewall daemon...
Oct 31 16:01:37 host1.example.com systemd[1]: Started firewalld - dynamic firewall daemon.
[root@host1 ~]#
ちなみにfirewalldで使用するConfigファイルは下記のディレクトリに保存されます。
[root@host1 ~]# ll /usr/lib/firewalld/
total 12
drwxr-xr-x. 2 root root 4096 Oct 27 16:38 icmptypes
drwxr-xr-x. 2 root root 20 Oct 27 16:38 ipsets
drwxr-xr-x. 2 root root 4096 Oct 27 16:38 services
drwxr-xr-x. 2 root root 94 Oct 27 16:38 xmlschema
drwxr-xr-x. 2 root root 163 Oct 27 16:38 zones
[root@host1 ~]# ll /etc/firewalld
total 8
-rw-r--r--. 1 root root 1525 Sep 13 2016 firewalld.conf
drwxr-x---. 2 root root 6 Sep 13 2016 icmptypes
-rw-r--r--. 1 root root 271 Sep 13 2016 lockdown-whitelist.xml
drwxr-x---. 2 root root 6 Sep 13 2016 services
drwxr-x---. 2 root root 46 Oct 27 16:42 zones
[root@host1 ~]#
firewalldの管理
firewalldを管理するには、firewall-cmdを使用します。
とりあえず、稼働状況を確認してみます。
[root@host1 ~]# firewall-cmd --state
running
[root@host1 ~]#
デフォルトのZoneを確認します。
[root@host1 ~]# firewall-cmd --get-default-zone
public
[root@host1 ~]#
Windowsでもネットワークを設定するときに、パブリックとか社内とかが設定されますが、Zoneはそれに似てますね。
## ルールの追加
httpをFirewallにサービスベースで追加してみます。
[root@host1 ~]# firewall-cmd --permanent --add-service=http
success
[root@host1 ~]#
--permanentオプションでは、永続的に保持されるConfigに追記されますので、一旦ReloadをするとConfigの設定で読み直します。
[root@host1 ~]# firewall-cmd --reload
success
[root@host1 ~]#
ブラウザで開けることを確認しました。
つぎに、ポートベースで追加するときは次のようにします。
vncのポートとhttpsのポートを開いてみました。httpsの方は--permanetオプションを付けてないので、--reloadすると外れます。
[root@host1 ~]# firewall-cmd --permanent --add-port=5901-5910/tcp
success
[root@host1 ~]# firewall-cmd --add-port=443/tcp
success
##追加されているルールの確認
Firewallに追加されたポートを表示します。
[root@host1 ~]# firewall-cmd --list-port
5901-5910/tcp 443/tcp
ちなみに、サービスを確認するときは、
[root@host1 ~]# firewall-cmd --list-service
dhcpv6-client http ssh
[root@host1 ~]#
iptablesでも確認できます。
[root@host1 ~]# iptables -L -n
:
Chain IN_public_allow (1 references)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 ctstate NEW
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 ctstate NEW
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpts:5901:5910 ctstate NEW
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 ctstate NEW
:
一旦Reloadをして様子をみます。
[root@host1 ~]# firewall-cmd --reload
success
[root@host1 ~]# firewall-cmd --list-port
5901-5910/tcp
[root@host1 ~]#
このように、permanentを指定していない443ポートは消えてしまいます。
permanent指定していない443はConfigファイルには入っていないため、reloadするとルールが消えます。
[root@host1 ~]# cat /etc/firewalld/zones/public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Public</short>
<description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
<service name="dhcpv6-client"/>
<service name="http"/>
<service name="ssh"/>
<port protocol="tcp" port="5901-5910"/>
</zone>
[root@host1 ~]#
##ルールの削除
ポートを削除します。
[root@host1 ~]# firewall-cmd --permanent --remove-port=5901-5910/tcp
success
[root@host1 ~]#
上のコマンドを実行しただけの状態では、まだポートはListenなっています。
[root@host1 ~]# firewall-cmd --list-ports
5901-5910/tcp
[root@host1 ~]#
ただ、Config上はでは5901-5910/tcpのエントリは消えていますので、
[root@host1 ~]# cat /etc/firewalld/zones/public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Public</short>
<description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
<service name="dhcpv6-client"/>
<service name="http"/>
<service name="ssh"/>
</zone>
[root@host1 ~]#
Reloadすれば、削除が反映されます。
[root@host1 ~]# firewall-cmd --reload
success
[root@host1 ~]#
Listenされなくなりました。
[root@host1 ~]# firewall-cmd --list-port
[root@host1 ~]#
長くなったのでこれまで。。
Webサービスを立ち上げる
firewallとか検証しようかと思いまして、webサーバとかがあるといいなぁというので、Apacheを立ち上げてみました。
Apacheのインストール
とりあえずパッケージが入っていないところから。。。
[root@host1 ~]# yum list installed |grep httpd
[root@host1 ~]#
そしてインストールできそうなパッケージを検索してみます。
[root@host1 ~]# yum list |grep httpd
httpd.x86_64 2.4.6-67.el7_4.6 rhel-7-server-rpms
httpd-devel.x86_64 2.4.6-67.el7_4.6 rhel-7-server-rpms
httpd-manual.noarch 2.4.6-67.el7_4.6 rhel-7-server-rpms
httpd-tools.x86_64 2.4.6-67.el7_4.6 rhel-7-server-rpms
keycloak-httpd-client-install.noarch 0.6-1.el7 rhel-7-server-rpms
libmicrohttpd.i686 0.9.33-2.el7 dvd
libmicrohttpd.x86_64 0.9.33-2.el7 dvd
python2-keycloak-httpd-client-install.noarch
[root@host1 ~]#
インストールします。httpdだけで大丈夫でした。-yオプションを付けるといちいちy/nのところで、yと打たなくていいので楽です。
[root@host1 ~]#
[root@host1 ~]# yum -y install httpd.x86_64
Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-managery
:
次の2つのパッケージが入ったことでインストール完了!
[root@host1 ~]# yum list installed |grep httpd
httpd.x86_64 2.4.6-67.el7_4.6 @rhel-7-server-rpms
httpd-tools.x86_64 2.4.6-67.el7_4.6 @rhel-7-server-rpms
[root@host1 ~]#
Apacheで使うフォルダを確認
インストール直後のそれぞれのフォルダの状態を確認しました。
■httpdのコンフィグ関係
[root@host1 ~]# ll /etc/httpd
total 0
drwxr-xr-x. 2 root root 37 Nov 13 16:43 conf
drwxr-xr-x. 2 root root 82 Nov 13 16:43 conf.d
drwxr-xr-x. 2 root root 146 Nov 13 16:43 conf.modules.d
lrwxrwxrwx. 1 root root 19 Nov 13 16:43 logs -> ../../var/log/httpd
lrwxrwxrwx. 1 root root 29 Nov 13 16:43 modules -> ../../usr/lib64/httpd/modules
lrwxrwxrwx. 1 root root 10 Nov 13 16:43 run -> /run/httpd
[root@host1 ~]#
■コンテンツの保存先
[root@host1 ~]# ll /var/www
total 0
drwxr-xr-x. 2 root root 6 Oct 3 22:37 cgi-bin
drwxr-xr-x. 2 root root 6 Oct 3 22:37 html
■ログの保存先
[root@host1 ~]#
[root@host1 ~]# ll /var/log/httpd
total 0
[root@host1 ~]#
その他もろもろ(趣味の領域なのでスキップしても問題ないです。)
チェック用にテキストブラウザをインストール
[root@host1 ~]# yum -y install httpd elinks
Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-manager
Fireallも試してみようかと言うことでfirewalldを起動
[root@host1 ~]# systemctl start firewalld
[root@host1 ~]#
すかさず、firewallにhttpサービスを追加。
[root@host1 ~]# firewall-cmd --permanent --add-service=http ; firewall-cmd --reload
success
success
[root@host1 ~]#
サービス開始
httpdを起動します。
通常立ち上がるサービスとして登録
[root@host1 ~]# systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
[root@host1 ~]#
サービスを起動
[root@host1 ~]# systemctl start httpd
[root@host1 ~]#
サービスの起動状況を確認
[root@host1 ~]# systemctl status httpd
??ttpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2017-11-13 17:18:13 JST; 17s ago
Docs: man:httpd(8)
man:apachectl(8)
Main PID: 21180 (httpd)
Status: "Total requests: 0; Current requests/sec: 0; Current traffic: 0 B/sec"
CGroup: /system.slice/httpd.service
??21180 /usr/sbin/httpd -DFOREGROUND
??21181 /usr/sbin/httpd -DFOREGROUND
??21182 /usr/sbin/httpd -DFOREGROUND
??21183 /usr/sbin/httpd -DFOREGROUND
??21184 /usr/sbin/httpd -DFOREGROUND
??21185 /usr/sbin/httpd -DFOREGROUND
Nov 13 17:18:12 host1.example.com systemd[1]: Starting The Apache HTTP Server...
Nov 13 17:18:13 host1.example.com systemd[1]: Started The Apache HTTP Server.
[root@host1 ~]#
実際ブラウザから開いてみる
開きました。
ちなみに、elinksでは。。
[root@host1 ~]# elinks http://localhost
ログも出ておりました。
[root@host1 ~]# tail /var/log/httpd/access_log
10.206.232.83 - - [13/Nov/2017:17:19:49 +0900] "GET / HTTP/1.1" 403 3985 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"
10.206.232.83 - - [13/Nov/2017:17:19:49 +0900] "GET /icons/apache_pb2.gif HTTP/1.1" 200 4234 "http://192.168.0.251/" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"
10.206.232.83 - - [13/Nov/2017:17:19:49 +0900] "GET /favicon.ico HTTP/1.1" 404 209 "http://192.168.0.251/" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"
10.206.232.83 - - [13/Nov/2017:17:20:40 +0900] "-" 408 - "-" "-"
::1 - - [13/Nov/2017:17:25:44 +0900] "GET / HTTP/1.1" 403 3985 "-" "ELinks/0.12pre6 (textmode; Linux; 161x50-2)"
::1 - - [13/Nov/2017:17:28:25 +0900] "GET / HTTP/1.1" 403 3985 "-" "ELinks/0.12pre6 (textmode; Linux; 161x50-2)"
[root@host1 ~]#
以上でした。
yumを使う。
前回サブスクリプションの登録を紹介いたしましたが、サブスクリプションが登録されるとyumが利用できるようになります。
yumは、パッケージのインストーラがどこにあるかをレポジトリと呼ばれるファイルに記載しておいて、インストールしたいときはそのファイルを参照して、インターネットやローカルファイルを検索して自動でインストールしてくれます。
yumのレポジトリを確認
サブスクリプションがアタッチされているとこのようにRedhatがNet上に公開しているレポジトリが自動で追加されてきます。
[root@host1 ~]# yum repolist
Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-manager
repo id repo name status
rhel-7-server-rpms/7Server/x86_64 Red Hat Enterprise Linux 7 Server (RPMs) 17,474
rhel-7-server-rt-beta-rpms/x86_64 Red Hat Enterprise Linux for Real Time Beta (RHEL 7 Server) (RPMs) 15
rhel-7-server-rt-rpms/7Server/x86_64 Red Hat Enterprise Linux for Real Time (RHEL 7 Server) (RPMs) 240
repolist: 17,729
[root@host1 ~]#
サブスクリプションがない場合は。。。
とりあえずDVDからパッケージを探してrpmでちまちまインストールすることになるのですが、探すのが面倒ですし、せっかく見つけても依存関係がどうのこうのというのでかなりストレスフルな展開になるのが目に見えているので、DVDが持っていいるリポジトリをyumに登録すると楽になります。
dvdを/mntにマウントしたとします。
[root@host1 ~]# mount -o ro /dev/cdrom /mnt
レポジトリの設定ファイルを作成します。
[root@host1 ~]# vi /etc/yum.repos.d/dvd.repo
[root@host1 ~]# yum -v repolist
:
Repo-id : dvd
Repo-name : dvd.repo
Repo-revision: 1476915491
Repo-updated : Thu Oct 20 07:18:13 2016
Repo-pkgs : 4,751
Repo-size : 3.1 G
Repo-baseurl : file:///mnt/
Repo-expire : 21,600 second(s) (last: Mon Nov 13 15:20:36 2017)
Filter : read-only:present
Repo-filename: /etc/yum.repos.d/dvd.repo
:
DVDのレポジトリを読み込んで、yumのリストに追加されました。
このように、yumはレポジトリを参照するためのconfigファイルを持っています。
[root@host1 ~]# ls -l /etc/yum.repos.d/
total 104
-rw-r--r--. 1 root root 62 Nov 13 15:20 dvd.repo
-rw-r--r--. 1 root root 101322 Nov 13 14:46 redhat.repo
[root@host1 ~]#
利用可能なパッケージの確認
yumで使用できるパッケージを参照するには、listオプションを使用します。
[root@host1 ~]# yum list
Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-
: manager
Installed Packages
GConf2.x86_64 3.2.6-8.el7 @anaconda/7.3
GeoIP.x86_64 1.5.0-11.el7 @anaconda/7.3
ModemManager.x86_64 1.6.0-2.el7 @anaconda/7.3
ModemManager-glib.x86_64 1.6.0-2.el7 @anaconda/7.3
NetworkManager.x86_64 1:1.4.0-12.el7 @anaconda/7.3
NetworkManager-adsl.x86_64 1:1.4.0-12.el7 @anaconda/7.3
:
アップデートできるパケージをレポジトリから表示するには、list updatesオプションを使用します。
[root@host1 ~]# yum list updates
Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-
: manager
Updated Packages
NetworkManager.x86_64 1:1.8.0-11.el7_4 rhel-7-server-rpms
NetworkManager-adsl.x86_64 1:1.8.0-11.el7_4 rhel-7-server-rpms
NetworkManager-config-server.noarch 1:1.8.0-11.el7_4 rhel-7-server-rpms
NetworkManager-glib.x86_64 1:1.8.0-11.el7_4 rhel-7-server-rpms
NetworkManager-libnm.x86_64 1:1.8.0-11.el7_4 rhel-7-server-rpms
NetworkManager-libreswan.x86_64 1.2.4-2.el7 rhel-7-server-rpms
NetworkManager-libreswan-gnome.x86_64 1.2.4-2.el7 rhel-7-server-rpms
NetworkManager-team.x86_64 1:1.8.0-11.el7_4 rhel-7-server-rpms
:
レポジトリからインストールできるiptablesのパッケージを確認します。
[root@host1 ~]# yum list |grep iptables
iptables.x86_64 1.4.21-17.el7 @anaconda/7.3
iptables.i686 1.4.21-18.2.el7_4 rhel-7-server-rpms
iptables.x86_64 1.4.21-18.2.el7_4 rhel-7-server-rpms
iptables-devel.i686 1.4.21-18.2.el7_4 rhel-7-server-rpms
iptables-devel.x86_64 1.4.21-18.2.el7_4 rhel-7-server-rpms
iptables-services.x86_64 1.4.21-18.2.el7_4 rhel-7-server-rpms
[root@host1 ~]#
インストールされているパッケージからiptablesを検索します。
[root@host1 ~]# yum list installed |grep iptables
iptables.x86_64 1.4.21-17.el7 @anaconda/7.3
[root@host1 ~]#
パッケージのインストール
iptablesのサービスが入っていなかったので、インストールします。
[root@host1 ~]# yum install iptables-services.x86_64
Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-manager
:
Dependencies Resolved
===================================================================
Package Arch Version Repository Size
===================================================================
Installing:
iptables-services x86_64 1.4.21-18.2.el7_4 rhel-7-server-rpms 51 k
Updating for dependencies:
iptables x86_64 1.4.21-18.2.el7_4 rhel-7-server-rpms 428 k
:
上記のようにyumはインストールの際に必要な依存関係を解消ながらインストールしてくれるので便利ですね。
以上でした。
yumを使いたいので無料のサブスクリプションを手に入れる。
yumを試したいときに利用するサブスクリプションの取得方法とその登録方法をご紹介します。開発者アカウントに登録すると無料で1つサブスクリプションを手に入れることができます。
まずは、開発者アカウントの登録します。
このとき、Redhatのユーザとパスワードを取得しますので、この情報使ってインターネットを経由してホストをアカウントに紐付けます。
[root@host1 ~]# subscription-manager register --username RHアカウント --password パスワード
The system has been registered with ID: cbf0aaf1-7zz4-4425-9898-yyyy636fxxxx
[root@host1 ~]#
ホストが登録されると下記のコマンドで使用できるサブスクリプションが確認できます。開発者アカウントに付与された無料で1つのサブスクリプションの情報が表示されます。また個別のサブスクリプションはPool-IDで識別されます。
[root@host1 ~]# subscription-manager list --available
+-------------------------------------------+
Available Subscriptions
+-------------------------------------------+
Subscription Name: Red Hat Enterprise Linux Developer Suite
Provides: Red Hat Software Collections (for RHEL Server)
:
SKU: RH1234567
Contract:
Pool ID: ff123456789abcdef123456789abcdef
Provides Management: Yes
Available: 100
Suggested: 1
:
また、サブスクリプションの利用状況やPool-IDは、次のカスタマーポータルでも確認できます。
最後は、付与されているサブスクリプションをアタッチしてyumが使用できる状態にします。
[root@host1 ~]# subscription-manager subscribe --auto
Installed Product Current Status:
Product Name: Red Hat Enterprise Linux Server
Status: Subscribed
[root@host1 ~]#
開発者アカウントでのサブスクリプションは基本1つなので、--autoオプションで問題無いですが、正規のライセンスによって、複数個サブスクリプションを使い分けるときには、プールIDを指定してアタッチすることができます。
[root@host1 ~]# subscription-manager subscribe --pool=XYZ01234567
以上です。
今さら聞けない検索
Linuxはファイル名を探すのが大変という印象がありますが、いくつかのコマンドを抑えておけば、そんなに面倒でもないです。
ファイルの中の文字列を検索
馴染みのないファイルを検索するのも何なんで、前にも何度となく取り上げているネットワークのconfigファイルからIPを確認したりするときなんかはgrepが便利だったりします。
構文:grep 検索文字列 ファイル名
[root@host1 ~]# grep IPAD /etc/sysconfig/network-scripts/ifcfg-eth1
IPADDR=192.168.0.251
[root@host1 ~]#
小文字も大文字も関係なしに検出したいときは、-iオプションを付けます。
[root@host1 ~]# grep -i ipad /etc/sysconfig/network-scripts/ifcfg-eth1
IPADDR=192.168.0.251
[root@host1 ~]#
ディレクトリ内のすべてのファイルのIPを確認したいときは、ファイル名のところに*(ワイルドカード)を入れます。
[root@host1 ~]# grep IPAD /etc/sysconfig/network-scripts/*
/etc/sysconfig/network-scripts/ifcfg-eth1:IPADDR=192.168.0.251
/etc/sysconfig/network-scripts/ifcfg-lo:IPADDR=127.0.0.1
:
また出力結果から行を抽出することもできますので、コマンドのあとに|(パイプ)でgrepをつなぐことで、同じ出力結果を表示できます。
[root@host1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1 |grep IPAD
IPADDR=192.168.0.251
どこにConfigファイルが有るかわからない場合でも、-rオプションを付けると、ディレクトリを掘り下げて(再帰的に)検索してくれたりします。(力技ですが。)
[root@host1 ~]# grep -r IPADDR /etc
/etc/ppp/ip-up.ipv6to4: ipv4addr="$IPADDR"
/etc/sysconfig/network-scripts/ifcfg-lo:IPADDR=127.0.0.1
/etc/sysconfig/network-scripts/ifdown-ipv6: ipv4addrlocal="$IPADDR"
/etc/sysconfig/network-scripts/ifdown-ipv6: ipv4addr="$IPADDR"
:
2つの文字列を組み合わせて検索
2つの文字列を組み合わせて検索するときは、egrepコマンドを使います。
まず、ORで検索するときは、’(クォーテーション)で囲んで、文字列の区切りに|(パイプ)を入れます。
[root@host1 ~]# egrep 'IPAD|DNS' /etc/sysconfig/network-scripts/ifcfg-eth1
DNS1=192.168.0.1
IPADDR=192.168.0.251
IPV6_PEERDNS=yes
[root@host1 ~]#
grepでも-Eオプションで同じ結果を出力できます。
[root@host1 ~]# grep -E 'IPAD|DNS' /etc/sysconfig/network-scripts/ifcfg-eth1
DNS1=192.168.0.1
IPADDR=192.168.0.251
IPV6_PEERDNS=yes
[root@host1 ~]#
ANDで検索するときは、’(クォーテーション)で囲んで、文字列の区切りに.*(ドットとアスター)を入れます。
[root@host1 ~]# egrep '192.*168' /etc/sysconfig/network-scripts/*
/etc/sysconfig/network-scripts/ifcfg-eth1:DNS1=192.168.0.1
/etc/sysconfig/network-scripts/ifcfg-eth1:IPADDR=192.168.0.251
/etc/sysconfig/network-scripts/ifcfg-eth1:GATEWAY=192.168.0.1
:
ファイル名に含まれる文字列で検索したいとき
王道としてはfindコマンドですが、一番シンプルな使い方は、find コマンドのあとにディレクトリを指定すれば、配下のファイルとディレクトリを全部表示してくれます。
[root@host1 ~]# find ./
./
./.bash_logout
./.bash_profile
./.bashrc
./.cshrc
./.tcshrc
:
ただ、findはいろいろとできるので、オプションをつけないとなんでも出てきてしまうというのと、対象のファイル名をきっちり覚えていないと行けないのが面倒です。もちろん*(ワイルドカード)をつけて検索も可能ですが、なにかとお作法にうるさい印象があります。
例えば、このようにキーワードの指定だけだと拾ってくれませんので、
[root@host1 ~]# find /etc/sysconfig/network-scripts/ -name ifcfg
[root@host1 ~]#
きっちり*(ワイルドカード)をつけてあげます。
[root@host1 ~]# find /etc/sysconfig/network-scripts/ -name ifcfg-*
/etc/sysconfig/network-scripts/ifcfg-lo
/etc/sysconfig/network-scripts/ifcfg-ens192
/etc/sysconfig/network-scripts/ifcfg-eth1
[root@host1 ~]#
ただ、ファイル名をウル覚えの場合でも、grepとの合わせ技だとキーワードの指定だけでも拾ってくれるので便利です。
[root@host1 ~]# find /etc/sysconfig/network-scripts/ |grep ifcfg
/etc/sysconfig/network-scripts/ifcfg-lo
/etc/sysconfig/network-scripts/ifcfg-ens192
/etc/sysconfig/network-scripts/ifcfg-eth1
[root@host1 ~]#
:
おわり。。
SELinuxの管理方法
SELinuxについてもうちょっと書きたいと思います。
ここでは、SELinuxのユーザとプロセスやファイルに設定されるアクセス権であるコンテクストの管理について話してみます。
SELinuxのユーザについて
前回お伝えしたようにSELinuxでは独自のユーザが存在しますので、通常のLoginユーザとの関係性について例を交えて説明します。
まず、Loginユーザ(userSE)を新規作成して、SELinuxのユーザ(staff_u)マッピングします。
SELinuxのユーザの種類についてはこちらを参照ください。
3.3. 制限のあるユーザーおよび制限のないユーザー - Red Hat Customer Portal
[root@host1 ~]# useradd -Z staff_u userSE
[root@host1 ~]#
ついでにパスワードも変更
[root@host1 ~]# echo pass123 |passwd --stdin userSE
Changing password for user userSE.
passwd: all authentication tokens updated successfully.
passwdコマンドで--stdin(標準入力)をつけると、echoで出力したpass123の文字列を読み取って設定することができます。
作成したユーザとSELinuxのユーザのマッピングを確認します。
[root@host1 ~]# semanage login -l
Login Name SELinux User MLS/MCS Range Service
__default__ unconfined_u s0-s0:c0.c1023 *
root unconfined_u s0-s0:c0.c1023 *
system_u system_u s0-s0:c0.c1023 *
userSE staff_u s0-s0:c0.c1023 *
[root@host1 ~]#
一旦、userSEでログインして、idコマンドで表示するとこんな感じです。
※SELinuxのユーザはPAM モジュールによって割り当てられるのでSSHでログインしています。
[root@host1 ~]# ssh userSE@localhost
:
[userSE@host1 ~]$ id -Z
staff_u:staff_r:staff_t:s0-s0:c0.c1023
ちなみに、 ユーザに特定のSELinuxユーザをマッピングしない場合は、__default__ の値が設定されます。
例)マッピングされていない既存のユーザ(userSE3)での表示
[root@host1 ~]# ssh userSE3@localhost
:
[userSE3@host1 ~]$ id -Z
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
次に、すでに存在するユーザ(userSE2)に、SELinuxのユーザ(user_u)を割り当ててみます。
[root@host1 ~]# semanage login -a -s user_u userSE2
[root@host1 ~]# semanage login -l
Login Name SELinux User MLS/MCS Range Service
__default__ unconfined_u s0-s0:c0.c1023 *
root unconfined_u s0-s0:c0.c1023 *
system_u system_u s0-s0:c0.c1023 *
userSE staff_u s0-s0:c0.c1023 *
userSE2 user_u s0 *
[root@host1 ~]#
ファイルのコンテキスト(ラベルの組み合わせ)について
rootユーザでテストファイル(testfile1)を作成して、ラベル(コンテキスト)を確認します。コンテクストに含まれるラベルは、ユーザ(_u)、ロール(_r)、タイプ(_t)、機密レベル(Sx)になります。
[root@host1 ~]# touch /root/testfile1
[root@host1 ~]#
[root@host1 ~]# ls -Z /root/testfile1
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 /root/testfile1
[root@host1 ~]#
SELinuxユーザ(unconfined_u)とファイルのラベルであるタイプ(admin_home_t)のコンテキストが確認できます。
ここで、コンテキストを別のユーザ(user_u)とタイプ(public_content_t)へ変更してみます。
[root@host1 ~]# chcon -u user_u -t public_content_t /root/testfile1
[root@host1 ~]#
[root@host1 ~]# ls -Z /root/testfile1
-rw-r--r--. root root user_u:object_r:public_content_t:s0 /root/testfile1
[root@host1 ~]#
chconは一時的なコンテキストの変更なので、restoreconを実行すると戻ってしまいます。restoreconコマンドは、Configファイルで予め設定している内容でコンテキストを設定し直します。
※Configファイルはこちら:/etc/selinux/targeted/contexts/files/file_contexts.local
[root@host1 ~]# restorecon -vF /root/testfile1
restorecon reset /root/testfile1 context user_u:object_r:public_content_t:s0->system_u:object_r:admin_home_t:s0
[root@host1 ~]#
-vオプションを付けるとどこをどのように復元したのかも表示してくれます。
->以前の内容が、chconで一時的に変更された内容で、->以降に表示されているコンテキストがConfigファイルの設定になります。-Fは強制的なrestoreになります。
永続的に変更するには、fcontecstのサブコマンドを使用します。
fcontestは、-a(add),-d(delete),-l(list)のオプションがあり、永続的な変更では-aを使用します。前出のConfigファイルに書き込まれます。
[root@host1 ~]# semanage fcontext -a -s user_u -t public_content_t /root/testfile1
実際は、コンテキストを管理しているファイルにエントリーが追加されますので、追加状況は、-lオプションや直接そのファイルを参照することで確認できます。
[root@host1 ~]# semanage fcontext -l |grep testfile1
/root/testfile1 all files user_u:object_r:public_content_t:s0
[root@host1 ~]#
[root@host1 ~]# grep testfile1 /etc/selinux/targeted/contexts/files/file_contexts.local
/root/testfile1 user_u:object_r:public_content_t:s0
[root@host1 ~]#
そのままで開くと大量に表示されますので、grepで絞り込むことをおすすめします。
なお、この状態ではまだ、実際に有効になっているコンテキストは変更されていないので、いったんrestoreconを実行してコンテキストを反映させます。
[root@host1 ~]# restorecon -vF /root/testfile1
restorecon reset /root/testfile1 context system_u:object_r:admin_home_t:s0->user_u:object_r:public_content_t:s0
[root@host1 ~]#
[root@host1 ~]# ls -Z /root/testfile1
-rw-r--r--. root root user_u:object_r:public_content_t:s0 /root/testfile1
[root@host1 ~]#