20191012のLinuxに関する記事は17件です。

Vimの使い方

Vimは,Linuxのテキストエディタのひとつ.
操作方法が特殊なので,勉強したことを備忘録として残しておく.

起動と終了

起動

$ vim
  • vimを実行すると,Vimが起動する.
  • vim <ファイル名>で,Vimが起動し,指定したファイルを編集できるようになる.

ファイルの保存

:w
  • :wでファイルを保存できる.
  • 既存のファイルを開いていた場合には上書き保存され,新しいファイルを開いていた場合にはファイルが新規作成される.
  • :w <ファイル名>で,指定したファイル名で保存することができる.

Vimの終了

:q
  • :qでVimを終了する.
  • :wqで,保存してからVimを終了する.
  • :q!で,現在の編集内容を破棄してVimを終了する.

操作方法

文字の入力

  • Vimにはノーマルモードインサートモードが存在する.
    • ノーマルモードは,起動直後の画面で,カーソルの移動や削除,コピー&ペースト,検索を行う.
    • インサートモードは,ファイルに文字の入力を行う.
  • aまたはiコマンドで,ノーマルモードからインサートモードに変わる.
  • Escキーで,インサートモードからノーマルモードに戻る.
コマンド 実行内容
i 元のカーソル位置の左側に文字を追加
a 元のカーソル位置の右側に文字を追加

カーソル移動

  • Vimでは,ノーマルモードの状態でコマンドを入力することでカーソル移動ができる.
  • 文字単位での移動は,h, j, k, lコマンドを使用する.
コマンド 実行内容
h 左に移動
j 下に移動
k 上に移動
l 右に移動
  • 単語単位での移動は,w, bコマンドを使用する.
  • 行頭への移動は0コマンド,行末への移動は$コマンドを使用する.
コマンド 実行内容
w 前方に単語1つぶん移動
j 後方に単語1つぶん移動
W スペース区切りで前方に単語1つぶん移動
B スペース区切りで後方に単語1つぶん移動
0 行頭に移動
$ 行末に移動
  • 行単位での移動は,gコマンドを使用する.
コマンド 実行内容
gg 1行目に移動
G 最後の行に移動
<数字>G <数字>行目に移動

切り取り

  • Vimでは,切り取りをデリート(delete)と呼ぶ.
  • xまたはdコマンドでデリートを行う.
  • dコマンドは,どの範囲までをデリートするかを指定できる.dコマンドはの後ろにカーソル移動コマンドを合わせて指定する必要がある.
コマンド 実行内容
x, dl 現在位置から1文字を切り取り
dw 現在位置から1単語を切り取り
dd 現在カーソルのある行を切り取り
d0 現在位置から行頭までを切り取り
d$ 現在位置から行末までを切り取り
dgg 現在位置から最初の行までを切り取り
dG 現在位置から最後の行までを切り取り

コピー

  • Vimでは,コピーをヤンク(yank)と呼ぶ.
  • 切り取りではなく,単にコピーしたいときはyコマンドを使用する.
  • yコマンドもdコマンドと同じく,後ろにカーソル移動コマンドを合わせて指定する必要がある.
コマンド 実行内容
yl 現在位置から1文字をコピー
yw 現在位置から1単語をコピー
yy 現在カーソルのある行をコピー
y0 現在位置から行頭までをコピー
y$ 現在位置から行末までをコピー
ygg 現在位置から最初の行までをコピー
yG 現在位置から最後の行までをコピー

貼り付け

  • Vimでは,貼り付けをプット(put)と呼ぶ.
  • デリートやヤンクを行った文字列は,pコマンドを使用して貼り付けられる.
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Vimのコマンド

Vimは,Linuxのテキストエディタのひとつ.
操作方法が特殊なので,勉強したことを備忘録として残しておく.

起動と終了

起動

$ vim
  • vimを実行すると,Vimが起動する.
  • vim <ファイル名>で,Vimが起動し,指定したファイルを編集できるようになる.

ファイルの保存

:w
  • :wでファイルを保存できる.
  • 既存のファイルを開いていた場合には上書き保存され,新しいファイルを開いていた場合にはファイルが新規作成される.
  • :w <ファイル名>で,指定したファイル名で保存することができる.

Vimの終了

:q
  • :qでVimを終了する.
  • :wqで,保存してからVimを終了する.
  • :q!で,現在の編集内容を破棄してVimを終了する.

操作方法

文字の入力

  • Vimにはノーマルモードインサートモードが存在する.
    • ノーマルモードは,起動直後の画面で,カーソルの移動や削除,コピー&ペースト,検索を行う.
    • インサートモードは,ファイルに文字の入力を行う.
  • aまたはiコマンドで,ノーマルモードからインサートモードに変わる.
  • Escキーで,インサートモードからノーマルモードに戻る.
コマンド 実行内容
i 元のカーソル位置の左側に文字を追加
a 元のカーソル位置の右側に文字を追加
o 下に1行挿入し行頭に文字を追加

カーソル移動

  • Vimでは,ノーマルモードの状態でコマンドを入力することでカーソル移動ができる.
  • 文字単位での移動は,h, j, k, lコマンドを使用する.
コマンド 実行内容
h 左に移動
j 下に移動
k 上に移動
l 右に移動
  • 単語単位での移動は,w, bコマンドを使用する.
  • 行頭への移動は0コマンド,行末への移動は$コマンドを使用する.
コマンド 実行内容
w 前方に単語1つぶん移動
j 後方に単語1つぶん移動
W スペース区切りで前方に単語1つぶん移動
B スペース区切りで後方に単語1つぶん移動
0 行頭に移動
$ 行末に移動
  • 行単位での移動は,gコマンドを使用する.
コマンド 実行内容
gg 1行目に移動
G 最後の行に移動
<数字>G <数字>行目に移動

切り取り

  • Vimでは,切り取りをデリート(delete)と呼ぶ.
  • xまたはdコマンドでデリートを行う.
  • dコマンドは,どの範囲までをデリートするかを指定できる.dコマンドはの後ろにカーソル移動コマンドを合わせて指定する必要がある.
コマンド 実行内容
x, dl 現在位置から1文字を切り取り
dw 現在位置から1単語を切り取り
dd 現在カーソルのある行を切り取り
d0 現在位置から行頭までを切り取り
d$ 現在位置から行末までを切り取り
dgg 現在位置から最初の行までを切り取り
dG 現在位置から最後の行までを切り取り

コピー

  • Vimでは,コピーをヤンク(yank)と呼ぶ.
  • 切り取りではなく,単にコピーしたいときはyコマンドを使用する.
  • yコマンドもdコマンドと同じく,後ろにカーソル移動コマンドを合わせて指定する必要がある.
コマンド 実行内容
yl 現在位置から1文字をコピー
yw 現在位置から1単語をコピー
yy 現在カーソルのある行をコピー
y0 現在位置から行頭までをコピー
y$ 現在位置から行末までをコピー
ygg 現在位置から最初の行までをコピー
yG 現在位置から最後の行までをコピー

貼り付け

  • Vimでは,貼り付けをプット(put)と呼ぶ.
  • デリートやヤンクを行った文字列は,pコマンドを使用して貼り付けられる.

結合

  • xコマンドでは行末の改行を削除できないため,2行を1行にまとめるられない.
  • Jコマンドで,行を連結できる.

検索

  • ノーマルモードの状態でコマンドを入力することで検索ができる.
  • /の後に文字列を入力することで,現在のカーソル位置から文字列を検索する.
  • 検索はlessコマンドと同じ操作で行う.
コマンド 実行内容
/<文字列> 下方向に向かって検索
?<文字列> 上方向に向かって検索
n 次の検索結果に移動
N 前の検索結果に移動

置換

%s /<置換元文字列>/<置換後文字列>/g
  • ノーマルモードの状態でコマンドを入力することで置換ができる.
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

CentOS7で一般ユーザにsudo権限を付与する方法

はじめに

本記事では、CentOS7(バージョンは7.7)で、一般ユーザにsudo権限を付与する方法を紹介します。

前提

  • sudo権限を付与したい一般ユーザが存在していること
  • rootユーザに切り替えることができること

手順

rootユーザに切り替える

$ su

visudoを開く

# visudo

以下の行についているコメントを外す

変更前

## Allows people in group wheel to run all commands
#%wheel ALL=(ALL)      ALL

変更後

## Allows people in group wheel to run all commands
wheel ALL=(ALL)      ALL

既にコメントが外されていたら、何もする必要はありせん。

以下のコメントを実行する

# usermod -G wheel 追加したいユーザ名

(例)一般ユーザが「hogehoge」の場合
# usermod -G wheel hogehoge

PCを再起動する

一度、PCを再起動しないと反映されません。

sudoが使えることを確認する

$ sudo 何でもよいので適当なコマンド
(例)
$ sudo ls

上記コマンド入力後、一般ユーザのパスワードを求められます。
パスワード入力後、sudo以降に入力したコマンドを実行できれば、
sudoが使えるようになっています。

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

sudoが実行できない...

sudoコマンドを使おうと思ったら

sudo: /private/etc/sudoers.d is owned by uid 501, should be 0

えーーー、使えない----!!
いつ、何故、何で使えなくなったのか、全く心辺りがないっ!!涙
かなり格闘したが、調べながら何とか解決...

まずは、スーパーユーザに切り替える

$ su
#パスワードを求められるので入力

もしpasswordを入れてもsorryが返される場合は下記URL参照でルートユーザを有効にしてください。
参考: https://support.apple.com/ja-jp/HT204012

visudoコマンド等でsudoersを見る

# root and users in group wheel can run anything on any machine as any user
root            ALL = (ALL) ALL
%admin          ALL = (ALL) ALL

変更していなければ、sudoは「root」および「adminグループ」権限で実行するものだと書いてあります。
しかし、エラー文の通り、何故か権限を持っていないので、/private/etc/sudoers.dの権限を変更しましょう。
chownコマンドでファイルやディレクトリの所有者、所属グループを変更できます。

chown -R root:admin /private/etc/sudoers.d
#chown -R [ユーザ]:[グループ] [ファイルやディレクトリ]

参考: http://raining.bear-life.com/linux/chown%E3%81%A7%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%84%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AE%E6%89%80%E6%9C%89%E8%80%85%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B

これで解決しました。

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

Markdownをコンソール上でプレビュー

何がしたかったのか?

昭和生まれなもんで、GUIとかよう使われへん(エセ関西弁)

入手方法

https://github.com/tksmiura/miro

ここに入っているmiroというファイルをパスの通っておくところにコピーするだけ

実行方法

$ miro <markdown file>

実行結果

test_screenshot1.png
test_screenshot2.png

listとかテーブルとかちょっと頑張った。

課題

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

sortしてからdiffを行う

2つのコンフィグファイルをdiffで比べる場合
ソートしないとバラバラに出力される。

→ならばソートしてdiffすれば...

[root@localhost ~]# cat test
a
b
c
d
e
[root@localhost ~]# cat test2
e
d
c
b
a
[root@localhost ~]# diff <(sort test) <(sort test2)
[root@localhost ~]#

これでコンフィグを見比べるときも楽になりそう。

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

OpenBLASのソースをコンパイルしてローカルにインストールする

OpenBLASを公式ページ からダウンロードして解凍。

terminal
$ curl -LO http://github.com/xianyi/OpenBLAS/archive/v0.3.6.tar.gz
$ tar -xvf v0.3.6.tar.gz

解凍したフォルダに移動して、下記のコマンドを打つと
OpenBLAS-0.3.6/bin, OpenBLAS-0.3.6/include, OpenBLAS-0.3.6/libに
インストールされる。

terminal
$ cd OpenBLAS-0.3.6
$ make 
$ make install PREFIX=$(pwd)

参考:
https://github.com/xianyi/OpenBLAS/wiki/User-Manual

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

SSH接続でログインの失敗回数によりアカウントをロックする方法

セキュリティを高めたい為にログインの試行回数によりロックしたいことがありますね。この記事はCentOS7でログインを失敗した場合一定回数の失敗した回数を記録しユーザのアカウントをロックする方法を記載しています。具体的に以下のステップで試行回数によるロックを実現することができます。

 ステップ1: /etc/ssh/sshd_config で UsePAM yes 設定
 ステップ2: PAM 設定 (password-auth)
 ステップ3: system-auth

/etc/ssh/sshd_config でUsePAM yes

CentOS7ではPAMの「pam_faillock」モジュールの機能を使用し任意の回数ログインに失敗したユーザのアカウントをロックすることが出来ます。まずsshdでPAMが使用できるように「/etc/ssh/sshd_config」で「UsePAM yes」の設定が有効になっていることを確認して下さい。(CentOS7.5では初期状態で有効になっています)

sudo nano /etc/ssh/sshd_config
UsePAM yes

image.png

設定変更を行った場合は設定を反映する為にsshdを再起動しましょう。

systemctl restart sshd

ステップ1PAM 設定(password-auth)

SSHで任意の回数ログインに失敗したユーザのアカウントをロックさせたい場合、「/etc/pam.d/password-auth」のauthセクションとaccountセクションに「pam_faillock」モジュールの設定を追加します。(rootユーザはロック対象外)

以下コマンドで開いてauthセクションを探します。

sudo nano /etc/pam.d/password-auth
auth  required      pam_faillock.so preauth silent audit deny=回数 unlock_time=解除時間
auth  [default=die] pam_faillock.so authfail audit deny=回数 unlock_time=解除時間

account required pam_faillock.so
「deny=回数」でログイン失敗でアカウントをロックをするまでの回数を指定します。

「unlock_time=解除時間」でロックが解除されるまでの時間(秒)を指定します。

「unlock_time」の値に「0」を指定すると、管理者が「faillock」コマンドでロック解除を行わない限りアカウントはロックされたままとなります。

具体的設定事例

ステップ2password-auth

「/etc/pam.d/password-auth」にログイン失敗を10回繰り返すと600秒(10分)アカウントをロックする設定を追加します。さきほどのpassword-authを編集します。

sudo nano /etc/pam.d/password-auth

 ????? 部分3行が追加した設定になります。

#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth        required      pam_env.so
auth        sufficient    pam_unix.so try_first_pass nullok
auth        required      pam_deny.so
auth        required      pam_faillock.so preauth silent audit deny=10 unlock_time=600 ????? 追加しました!
auth        [default=die] pam_faillock.so authfail audit deny=10 unlock_time=600 ????? 追加しました!



account     required      pam_unix.so
account     required      pam_faillock.so  ????? 追加しました!

password    requisite     pam_pwquality.so try_first_pass local_users_only retr$
password    sufficient    pam_unix.so try_first_pass use_authtok nullok sha512 $
password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
-session     optional      pam_systemd.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet$
session     required      pam_unix.so

ポイント コンソールからのログイン失敗

「/etc/pam.d/password-auth」の設定だけではコンソールから直接ログイン失敗した場合にアカウントをロックすることはできません。コンソールからのログイン失敗についてもアカウントのロックを行いたい場合は「/etc/pam.d/system-auth」にも、同様の設定を行う必要があります。

ステップ3system-auth

それではせっかくなのでpassword-authだけではなく、今度は system-auth も修正していきます。

sudo nano /etc/pam.d/system-auth

同じように3か所を追加していきます。内容も一緒です。

#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth        required      pam_env.so
auth        sufficient    pam_unix.so try_first_pass nullok
auth        required      pam_deny.so
auth        required      pam_faillock.so preauth silent audit deny=10 unlock_time=600 ????? 追加しました!
auth        [default=die] pam_faillock.so authfail audit deny=10 unlock_time=600 ????? 追加しました!

account     required      pam_unix.so
account     required      pam_faillock.so  ????? 追加しました!

password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password    sufficient    pam_unix.so try_first_pass use_authtok nullok sha512 shadow
password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
-session     optional      pam_systemd.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so

ポイント root

「root」ユーザもロックしたい場合はauthセクションに追加する設定に「even_deny_root」を追加しましょう。

auth  required      pam_faillock.so preauth silent audit deny=回数 even_deny_root unlock_time=解除時間
auth  [default=die] pam_faillock.so authfail audit deny=回数 even_deny_root unlock_time=解除時

ログイン失敗回数の確認

「faillock」コマンドを実行することで、ユーザのログイン失敗情報を確認することが出来ます。

faillock

「testuser」でログイン失敗を繰り返した後に「faillock」コマンドを実行してみると、ログイン失敗に関しての情報が確認できます。

faillock

root:
When                Type  Source                                           Valid
hogehogeuser:
When                Type  Source                                           Valid
sampleuser:
When                Type  Source                                           Valid
2019-09-14 16:50:41 RHOST 192.168.10.2                                         V
2019-09-14 16:50:44 RHOST 192.168.10.2                                         V
2019-09-14 16:50:47 RHOST 192.168.10.2                                         V

特定ユーザのログイン失敗情報を確認したい場合は、「--user」オプションを使用することでユーザの指定が可能となります。

faillock --user ユーザ名

「testuser」というユーザのログイン失敗状況を確認してみます。

# faillock --user testuser
testuser:
When                Type  Source                                           Valid
2018-07-04 16:50:41 RHOST 192.168.1.26                                         V
2018-07-04 16:50:44 RHOST 192.168.1.26                                         V
2018-07-04 16:50:47 RHOST 192.168.1.26                                         V

アカウントロック解除方法

アカウントのロックを解除したい場合は、「--user」でロックを解除したいユーザを指定した後に「--reset」を指定することでロックを解除することが出来ます。

faillock --user ユーザ名 --reset

実際に「testuser」のロックを解除してみます。

faillock --user testuser --reset

「faillock」コマンドで確認してみると、ログイン失敗の情報が削除されてロックが解除されていることが確認できます。

# faillock
root:
When                Type  Source                                           Valid
hogeuser:
When                Type  Source                                           Valid
sampleuser:
When                Type  Source                                           Valid

番外編

faillock: Error opening the tally file for root:Permission denied

もしも上記エラーが発生した時は su - でrootになってから faillockをすると結果をチェックする事ができます。

ログをみる

failcockで気付いたらログを見てみるのも手です。が詳しい人に相談するのが一番早いです。

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

Clear Linux のインストール

性能が良いと噂1のIntel製のClear Linux をインストールしました。 UbuntuとかDebianはインストール手順の記事が多くありますが、 Clear Linuxについては日本語の記事はあまり無いみたいなので記録を残しておきます。 この手順は公式の解説ドキュメント に従ったものです。

0. 動作環境

上述の通りClear Linuxはインテル製のLinuxディストリビューションですが、 AMDのCPUでも問題なく動作します。 自分の環境は、CPU: Ryzen5 1600, GPU: Radeon RX 460, Memory: 16GB RAM, HDD: 1GBです。

1. USBドライブの作成(Windowsの場合)

imageリポジトリから OSイメージをダウンロードしてきて、ブータブルUSBドライブを作成します。 Installer image(clear-[version]-installer.img.xz)をダウンロード。 次に使うので、その下にあるclear-[version]-installer.img.xz-SHA512SUMSもダウンロードしておきます。

このダウンロードしてきたOSイメージが壊れていないか確認しましょう、 ということでコマンドプロンプトでコマンド

CertUtil -hashfile ./clear-[version]-installer.img.xz sha512

を実行し、実行結果で出てきた文字列がさっきダウンロードした-SHA512SUMSの内容とあっているか確認。

ダウンロードした.xzファイルを展開するために、 7-zipをダウンロード、インストール。 .xzファイルを右クリックすると7-zipを選べるようになっているので、 「ここに展開」を選択すると.imgファイルがフォルダ内に展開されます。

RufusでOSイメージをUSBに焼きます。 USBメモリをPCに挿し、Rufusを起動し、「選択」ボタンから展開した.imgファイルを選び、 スタートをクリックします。USBメモリは最低8GB必要です。 UbuntuとDebianは4GBあれば十分だった気がするので少し大きいですね。

ここまで終わったら次はインストールです。 公式のドキュメントには With a bootable Clear Linux OS drive, you can Multi-boot Clear Linux OS with other operating systems なんていう魅力的なことが書いてあって、その手順も説明されていますが、 今回は空のHDDにClear Linux単体をインストールします。

2. HDDにClear Linuxをインストールする

USBドライブを作成できたので、ハードディスクにインストールします。 USBドライブをPCに挿したままPCを起動し、 デフォルトのOSが起動する前にF11ブートメニューからUSBを選択。 しばらくして青い画面が出現します。
clearlinux_install_installer1.jpg
clearlinux_install_installer2.jpg
TimezoneはAsia/Tokyo、Keyboardはjp106に設定。 Configure Mediaのところでインストール先のドライブを選択し、 auto partitionでパーティション分割。 TeremetryをDisabledにしてインストール。
Condfigure Mediaで選択したハードディスクのデータが全部消えますよ、 という警告文が出てくるのでOKするとインストールが開始します。 インストールが終了したら再起動して、 F11ブートメニューからインストール先のハードディスクを選択するとClear Linuxが起動します。


  1. 例えば、8-Way Linux Distribution Benchmarks On The Intel Core i9 9900K - One Distro Wins 67% Of The Time (http://www.phoronix.com/scan.php?page=article&item=intel-9900k-distros&num=1) を参照 

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

Linuxの基本

未来電子テクノロジーでインターンをしている箕牧和廣です。
今回はLinuxについて書いていこうと思います。

プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

Linuxとは

Linuxとは『Mac OS』や『Windows 10』のようなOSの1種です。
OSとは、オペレーティングシステムの略称で、コンピュータの全てのハードウェアを管理しているソフトウェアのことです。
具体的な役割としては、マウスやキーボードから入力した情報をアプリケーションに伝え、ハードウェアとソフトウェアの連携をはかります。

Linuxの特徴

LinuxはオープソースのOSなので、ソースコードを誰でも無料でダウンロード、変更、再配布できます。
また、Linuxを利用する場合、基本的にはLinuxディストリビューションを使用します。
Linuxディストリビューションは、Linuxのアプリケーションやライブラリをひとまとめにして、PCにインストールすれば使える状態にした配布物を指し、利用可能なLinuxディストリビューションは何千とあります。

覚えておきたいLinux用語

僕が勉強していて分からなかったLinux用語をまとめてみます。

Linuxカーネル

Linuxカーネルはソフトウェアからの要求に応え、ハードウェアからの応答をソフトウェアに伝える、仲立ちをしてくれます。
代表的な機能としては、プロセス管理、プロセススケジューラ、メモリ管理、ファイルシステムなどです。

パッケージ

パッケージとはアプリケーションの配布形態です。
Windowsでは、インターネットからインストーラーをダウンロードしてアプリをインストールしますが、Linuxでは、RPMやYumなどのパッケージ管理ツールを利用し、パッケージをダウンロードしてインストールします。

ディレクトリ

ディレクトリとは、ファイルを分類、整理、保存する入れ物のようなものです。
Windowsの『フォルダ』と同じようなイメージです。

シェル

シェルとは、Linux上で使用できるコマンドをまとめて記述して実行できるもので、シェルスクリプトとも呼びます。
シェルスクリプトは、プログラミング言語のように条件分岐や繰り返し処理など記述することができます。

コマンド

Linuxのシェルでは、Linuxに何を実行させるのかを、キーボードで入力します。
コマンドは、このキーボードで入力する命令文のことです。
よく使うコマンドを以下にまとめてみました。

コマンド 説明
ls ディレクトリ情報の表示
cd ディレクトリの移動
cp ファイルのコピー
mv ファイルの移動・ファイル名の変更
rm ファイルの削除
cat テキストファイルの内容を表示
touch ファイルのタイムスタンプの変更
mkdir フォルダ作成 
man マニュアルの表示

ライブラリ

ライブラリとは、よく使用されるプログラムの共通部分を抜き出して、他のプログラムから利用できるようにしたものです。

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

スクリプト実行ディレクトリを取得ためのシェルスクリプト

1958年9月の狩野川台風に匹敵する規模台風19号がやってきて、避難命令が発令されたり、河川が溢れたり大変になっています。ラグビーワールドカップの試合も中止になったりと気持ちの面での被害が大きくなっています。

せっかく中心街のアーケード街で買い物でもしようかなと考えていたのに、電車も計画運休で動いていないので、仕方なく部屋でゴソゴソとパソコン触っています。

個人用にAWS Lightsailに立てているUbuntuサーバーへ実行スクリプトを作成しようとしたら、Shell Scriptをどこからでも呼び出しても、pathがないでエラーを発生させないように絶対パスを取得する方法を忘れてしまったので、覚書として残しておきます。

環境

$ uname -a
Linux ip-172-26-5-169 4.4.0-1074-aws #84-Ubuntu SMP Thu Dec 6 08:57:58 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
$ cat /etc/issue
Ubuntu 16.04.5 LTS \n \l

Ubuntu 16.04.5 です。

簡単な方法

もし1行で記述する場合は以下の書き方が楽ちんです。

DIR="$( cd "$( dirname "$0" )" >/dev/null 2>&1 && pwd )"
echo "DIR is '$DIR'"

ただし、この方法はディレクトリがSymbolic linkでは対応していません。

シンボリックリンクでも大丈夫な方法

#!/bin/bash

SOURCE="$0"
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
  DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )"
  SOURCE="$(readlink "$SOURCE")"
  [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
done
DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )"
echo "DIR is '$DIR'"

だいたいはこのスニペットで大丈夫だと思いますが、もし相対シンボリックリンクも対応したい場合は、下記の方法で取得します。

相対シンボリックパスも大丈夫な方法

#!/bin/sh

SOURCE="$0"
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
  TARGET="$(readlink "$SOURCE")"
  if [[ $TARGET == /* ]]; then
    echo "SOURCE '$SOURCE' is an absolute symlink to '$TARGET'"
    SOURCE="$TARGET"
  else
    DIR="$( dirname "$SOURCE" )"
    echo "SOURCE '$SOURCE' is a relative symlink to '$TARGET' (relative to '$DIR')"
    SOURCE="$DIR/$TARGET" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
  fi
done
echo "SOURCE is '$SOURCE'"
RDIR="$( dirname "$SOURCE" )"
DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )"
if [ "$DIR" != "$RDIR" ]; then
  echo "DIR '$RDIR' resolves to '$DIR'"
fi
echo "DIR is '$DIR'"

エイリアス、sourcebash -c、シンボリックリンクなどの任意の組み合わせで動作します。

ただし、このスニペットを実行する前にcdコマンドを利用して別のディレクトリに移動した場合、結果が間違っている可能性がありますので注意してください。

最後に

Ubuntuのデフォルトシェルはbashではなく、dashだったんですね(汗

$ readlink -f $(which sh)
/bin/dash

それを知らなかったので、BASH_SOURCE[0]を使うとBad substitutionと警告が表示されてしまった。

$ sh publish.sh 
publish.sh: 7: publish.sh: Bad substitution

参考

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

Shell Scriptの実行ディレクトリを取得する

1958年9月の狩野川台風に匹敵する規模台風19号がやってきて、避難命令が発令されたり、河川が溢れたり大変になっています。ラグビーワールドカップの試合も中止になったりと気持ちの面での被害が大きくなっています。

せっかく中心街のアーケード街で買い物でもしようかなと考えていたのに、電車も計画運休で動いていないので、仕方なく部屋でゴソゴソとパソコン触っています。

今回はShell Scriptをどこから呼び出しても、実行スクリプトの絶対パスを取得できる方法をいつも忘れてしまうので、覚書として残しておこうと思います。

環境

$ uname -a
Linux ip-172-26-5-169 4.4.0-1074-aws #84-Ubuntu SMP Thu Dec 6 08:57:58 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
$ cat /etc/issue
Ubuntu 16.04.5 LTS \n \l

Ubuntu 16.04.5 です。

簡単な方法

もし1行で記述する場合は以下の書き方が楽ちんです。

DIR="$( cd "$( dirname "$0" )" >/dev/null 2>&1 && pwd )"
echo "DIR is '$DIR'"

ただし、この方法はディレクトリがSymbolic linkでは対応していません。

シンボリックリンクでも大丈夫な方法

#!/bin/bash

SOURCE="$0"
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
  DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )"
  SOURCE="$(readlink "$SOURCE")"
  [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
done
DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )"
echo "DIR is '$DIR'"

だいたいはこのスニペットで大丈夫だと思いますが、もし相対シンボリックリンクも対応したい場合は、下記の方法で取得します。

相対シンボリックパスも大丈夫な方法

#!/bin/sh

SOURCE="$0"
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
  TARGET="$(readlink "$SOURCE")"
  if [[ $TARGET == /* ]]; then
    echo "SOURCE '$SOURCE' is an absolute symlink to '$TARGET'"
    SOURCE="$TARGET"
  else
    DIR="$( dirname "$SOURCE" )"
    echo "SOURCE '$SOURCE' is a relative symlink to '$TARGET' (relative to '$DIR')"
    SOURCE="$DIR/$TARGET" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
  fi
done
echo "SOURCE is '$SOURCE'"
RDIR="$( dirname "$SOURCE" )"
DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )"
if [ "$DIR" != "$RDIR" ]; then
  echo "DIR '$RDIR' resolves to '$DIR'"
fi
echo "DIR is '$DIR'"

エイリアス、sourcebash -c、シンボリックリンクなどの任意の組み合わせで動作します。

ただし、このスニペットを実行する前にcdコマンドを利用して別のディレクトリに移動した場合、結果が間違っている可能性がありますので注意してください。

最後に

Ubuntuのデフォルトシェルはbashではなく、dashだったんですね(汗

$ readlink -f $(which sh)
/bin/dash

それを知らなかったので、BASH_SOURCE[0]を使うとBad substitutionと警告が表示されてしまった。

$ sh publish.sh 
publish.sh: 7: publish.sh: Bad substitution

参考

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

LVM ファイルシステムタイプのハードディスクをマウントする方法

今、/dev/sdd2 に LVM ファイルシステムタイプがあるとします。
/dev/sdd1 には、/boot が存在しており、こちらはマウントできます。
/dev/sdd2 を普通にマウントしようとしても、以下のようになり、マウントに失敗します。

     # mount /dev/sdd2 /mnt/sdd2
mount: /mnt/sdd2: 未知のファイルシステムタイプ 'LVM2_member' です.

/dev/sdd を調べます。

     # fdisk -l /dev/sdd

    ディスク /dev/sdd: 1.8 TiB, xxxxxx バイト, xxxxxx セクタ
    単位: セクタ (1 * 512 = 512 バイト)
    セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
    I/O サイズ (最小 / 推奨): 4096 バイト / xxxxxx バイト
    ディスクラベルのタイプ: dos
    ディスク識別子: 0xxxxxxx

    デバイス 起動 開始位置 最後から セクタ サイズ Id タイプ
    /dev/sdd1 * 2048 xxxxxx xxxxxx 500M 83 Linux
    /dev/sdd2 xxxxxx xxxxxx xxxxxx 1.8T 8e Linux LVM

では、この /dev/sdd2 をマウントしていきます。
まず、利用可能な volumne group を調査します。
以下のコマンドを実行します。

     # pvs

    PV VG Fmt Attr PSize PFree
    /dev/sda2 fedora lvm2 a-- <1.82t 0
    /dev/sdd2 fedora lvm2 a-- <1.82t 4.00m

実際に起動している OS の VolumeGroup 名前と、ハードディスクの Volume Group の名前が、”fedora" と同一名となっているので、ハードディスクの Volume Group の名前を別の名前にでもリネームしてみます。

UUID を調べます。

    # vgdisplay

    --- Volume group ---
    VG Name fedora
    System ID
    Format lvm2
    Metadata Areas 1
    Metadata Sequence No 4
    VG Access read/write
    VG Status resizable
    MAX LV 0
    Cur LV 3
    Open LV 3
    Max PV 0
    Cur PV 1
    Act PV 1
    VG Size <1.82 TiB
    PE Size 4.00 MiB
    Total PE 476675
    Alloc PE / Size 476675 / <1.82 TiB
    Free PE / Size 0 / 0
    VG UUID xxxxxxxxxxxxxxxxxx

    --- Volume group ---
    VG Name fedora
    System ID
    Format lvm2
    Metadata Areas 1
    Metadata Sequence No 4
    VG Access read/write
    VG Status resizable
    MAX LV 0
    Cur LV 3
    Open LV 0
    Max PV 0
    Cur PV 1
    Act PV 1
    VG Size <1.82 TiB
    PE Size 4.00 MiB
    Total PE 476806
    Alloc PE / Size 476805 / <1.82 TiB
    Free PE / Size 1 / 4.00 MiB
    VG UUID xxxxxxxxxxxxxxxxxx ★<----これを使う

vgrename コマンドを使用して、ハードディスクの方の Volume Group 名をリネームします。

    # vgrename xxxxxxxxxxxxxxxx fedora_old

    Processing VG fedora because of matching UUID
    xxxxxxxxxxxxxxxx
    Volume group "xxxxxxxxxxxxxxxx" successfully
    renamed to "fedora_old"

では、volume groupe をもう一度見てみます。

    # pvs

    PV VG Fmt Attr PSize PFree
    /dev/sda2 fedora lvm2 a-- <1.82t 0
    /dev/sdd2 fedora_old lvm2 a-- <1.82t 4.00m

これで、fedora という名前の重複はなくなりました。
ハードディスクのほうは、fedora_old となりました。

では、マウントしていきます。

     # vgscan --mknodes

    Reading volume groups from cache.
    Found volume group "fedora" using metadata type lvm2
    Found volume group "fedora_old" using metadata type lvm2

ここで、lvscan をかけても、ハードディスクのほうは、inactive となっています。

     # lvscan

    ACTIVE '/dev/fedora/swap' [<7.84 GiB] inherit
    ACTIVE '/dev/fedora/home' [1.76 TiB] inherit
    ACTIVE '/dev/fedora/root' [50.00 GiB] inherit
    inactive '/dev/fedora_old/swap' [7.81 GiB] inherit
    inactive '/dev/fedora_old/home' [1.76 TiB] inherit
    inactive '/dev/fedora_old/root' [50.00 GiB] inherit

ここで、mount コマンドを実行しても、マウントできません。

     # mount /dev/fedora_old/home /mnt/sdd2

    mount: /mnt/sdd2: スペシャルデバイス /dev/fedora_old/home が存在しません.

inactive となっているものを、有効化します。

     # vgchange -ay

    3 logical volume(s) in volume group "fedora" now active
    3 logical volume(s) in volume group "fedora_old" now active

もう一度確認します。

     # lvscan

    ACTIVE '/dev/fedora/swap' [<7.84 GiB] inherit
    ACTIVE '/dev/fedora/home' [1.76 TiB] inherit
    ACTIVE '/dev/fedora/root' [50.00 GiB] inherit
    ACTIVE '/dev/fedora_old/swap' [7.81 GiB] inherit
    ACTIVE '/dev/fedora_old/home' [1.76 TiB] inherit
    ACTIVE '/dev/fedora_old/root' [50.00 GiB] inherit

では、もう一度マウントしてみます。

     # mount /dev/fedora_old/home /mnt/sdd2

マウントできたようです。

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

backlog の実験

今日は、backlog の実験をしてみます。

CentOS6.9 で、メモリ4Gbyte の仮想マシン上で実験しました。

よく使われるアプリケーションとして、Apache を上げてみます。

前提知識です。

syn backlog:接続確立中キューの最大値(不完全なソケットのキューの最大長)

backlog:接続待ちキューの最大値(完全に確立されたソケットのキューの最大長)

tcp_syncookies:

有効(値 1):一定の基準を越えた場合、syncookies を送信する。
syn backlog と backlog の小さいほうの値を、付近の 2の累乗の値に
切り上げた数値を超えると、syncookie を送信します(注)。
その際、ソケット蓄積の概念は放棄されるため、syn backlogの最大値の概念
は無視されます。

無効(値 0): 一定の基準を越えた場合、新たな要求を無視する。
接続確立中キューに syn backlog の 75 % + 1 を超えるソケットが溜まる
と、新しい要求を無視します。

(注)
syncookies は、TCP プロトコルにしたがっていない点があり、攻撃に対する
対処用法として存在し、予備的な機能(fallback functionality)でしか
ないため、SYN flood を起こさせるようなDOS 攻撃を受けていると考えられる
場合のみに発動されるべきです。
(参考)
Documentation/networking/ip-sysctl.txt

次に、それぞれの値の設定ヶ所の説明です。

- syn backlog の設定ヶ所
OS の設定か所:/proc/sys/net/ipv4/tcp_max_syn_backlog
Apache の設定ヶ所:なし

- backlog の設定ヶ所
OSの設定箇所: /proc/sys/net/core/somaxconn
Apache の設定か所: ListenBackLog ディレクティブの設定値

backlog の値について、OS および Apache で設定が可能ですが、以下の条件にしたがいます。

Apache の設定値 ≦ OS の設定値ならば、
Apache の設定値が有効

Apache の設定値 > OS の設定値ならば、
OS の設定値が有効
  • tcp_syncookies の設定ヶ所
OS の設定か所:/proc/sys/net/ipv4/tcp_syncookies
Apache の設定ヶ所:なし

backlog の値は、実際は 1 から 65535 まで設定可能です。

例えば、OS および Apache の設定値を 4096 にすると、backlog の設定値は、
Apache の値、4096 となります。

syn backlog の値を増やすかどうかは、そのマシンの通常の通信状況によります。

OS のデフォルト設定では、syncookies が有効になっていますので、
接続確立中の要求が syn backlog の値と、backlog 値の小さいほうの値を、
付近の 2 の累乗の値を切り上げた数値を超えた場合、syncookie が送信されます。

通常のトラフィックにおいて、接続確立中の要求が多くならいようであれば、
syn backlog の値を増やす必要はなく、通常の通信環境においても、
接続確立中の要求が多くなるようであれば、多くする必要があるかもしれませんね。

いずれにしても、設定の際は、通常のアプリケーションの通信状況を把握した上で、
各上限値を設定する必要があるといえます。

TCP ソケットを listen している情報は、以下のコマンドの結果が表示する、
Recv-Q,Send-Q により確認できます。ここで、Send-Q の値が、Apache の
backlog になります。

# ss -lti '( sport = :http )'

接続確立中の要求数の確認は、以下のコマンドで確認できます。

# netstat -antp | grep SYN_RECV | wc -l

(一例:syncookies=0 で syn backlog が 2048 の時、上限値に達した場合)
1537

私が行った設定で実験したら、このようになりました。

・デフォルトの設定

128 /proc/sys/net/core/somaxconn
2048 /proc/sys/net/ipv4/tcp_max_syn_backlog
511 Apache の ListenBackLog ディレクティブ
backlog の最大値 128
tcp_syncookies=1 の場合
接続確立中の要求数の上限値 256(backlog の付近の2の累乗の値)
tcp_syncookies=0 の場合
接続確立中の要求数の上限値 1537(syn backlog * 0.75 + 1 の値)

・OS、Apache の設定値を上げる

2048 /proc/sys/net/core/somaxconn
2048 /proc/sys/net/ipv4/tcp_max_syn_backlog
2048 Apache の ListenBackLog ディレクティブ
backlog の最大値 2048
tcp_syncookies=1 の場合
接続確立中キューの最大値 4096(backlog の付近の2の累乗の値)
tcp_syncookies=0 の場合
接続確立中キューの最大値 1537(syn backlog * 0.75 + 1 の値)

・syn backlog 変化させず、さらにOS、Apacheの設定値を上げる

4096 /proc/sys/net/core/somaxconn
2048 /proc/sys/net/ipv4/tcp_max_syn_backlog
4096 Apache の ListenBackLog ディレクティブ
backlog の最大値 4096
tcp_syncookies=1 の場合
接続確立中キューの最大値 4096(syn backlog の付近の 2 の累乗の値)
tcp_syncookies=0 の場合
接続確立中キューの最大値 1537(syn backlog * 0.75 + 1 の値)

・syn backlog を、4096 に上げる

4096 /proc/sys/net/core/somaxconn
4096 /proc/sys/net/ipv4/tcp_max_syn_backlog
4096 Apache の ListenBackLog ディレクティブ

backlog の最大値 4096
tcp_syncookies=1 の場合
接続確立中キューの最大値 8192(backlog の付近の2の累乗の値)
tcp_syncookies=0 の場合
接続確立中キューの最大値 3073(syn backlog * 0.75 + 1 の値)

また、この実験の場合ですが、接続確立中の要求が syn backlog の値と、
backlog 値の小さいほうの値を、付近の 2 の累乗の値を切り上げた数値を超えた
場合、syncookie が送信されることになります。
そのとき、/va/log/messages には、以下のログが 60秒に 1回記録されます。

kernel: possible SYN flooding on port <PORT>. Sending cookies.

tcp_syncookies は OS で有効に設定されています。
tcp_syncookies が有効な場合、上述のとおり syn backlog の値を
変化させることにより、接続確立中キューの最大値は変化するので、

適宜設定したらいいと思います。

具体的にどうやって実験したかというと、次のようにやりましたよ。

以下のスクリプトを実行します。これを確認します。

#!/bin/bash
while :
do
netstat -antp | grep SYN_RECV | wc -l

sleep 1
done

下記のとおり、SYN FLOOD 攻撃を実行して、上記の表示を観察する(実際のシステムにやってはいけませんよ)。

# hping3 -c 10000 -d 120 -S -w 64 -p 21 --flood --rand-source <TARGET_IP>

おいしいもの食べたいなぁ。

(参考:用語解説等)

https://access.redhat.com/solutions/30453

http://d.hatena.ne.jp/nyant/20111216/1324043063

mpm_common - Apache HTTP サーバ バージョン 2.4

(参考:hping3)
https://www.blackmoreops.com/2015/04/21/denial-of-service-attack-dos-using-hping3-with-spoofed-ip-in-kali-linux/

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

初心者 Linuxコマンドその他用語集

①Linuxコマンド...LinuxというOSにコマンドを書いてCUIで操作するもの。

②CUI...Character User Interfaceの略。
マウスでクリックするとファイルが開かれるように絵やアイコンで操作する環境できる。
GUI(Graphical User Interface)とは違って文字のみで操作することを指す。主にターミナルを使っていく。

③ディレクトリ..端的にいうとフォルダの事を指す。
/desktop/ファイル名/の様なディレクトリ階層の事をパスと呼ぶ。

基本的なLinuxコマンド一覧

comaand 正式名称 意味
mkdir make directory ディレクトリの作成
cd change directory ディレクトリの移動
ls list ディレクトリの中身を表示
pwd print working directory 現在のディレクトリの位置を確認する
mv move ファイルの移動、ファイルの名前の変更(mv既存のファイル名 新しいファイル名
rm remove ファイルの削除
touch touch 新規ファイルの作成、ファイルのタイムスタンプの変更
man manual マニュアルの表示
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

suの利用を制限する方法

suを使用制限すると?

一部を除いたLinux初期設定では全ユーザがsuを使用することで、rootユーザになることが出来てしまいます。rootのパスワードが分ってしまえば誰でもssh経由でrootになれてしまいますのでセキュリティ上まずい場面もあると思います。今回は「su」を実行出来るユーザを制限する事にしました。

注意点

この設定を行うと以下2点が実行できなくなります。
  ・wheelグループ以外のユーザが「su」コマンドでrootになれなくなります。
  ・他ユーザにもsuすることが出来なくなります。

今回はwheelグループに所属しているユーザだけが「su」実行可能という制限設定を構築していきたいと思います。

具体的実行ステップ 設定項目

下記3ステップでsu利用制限させる事が出来ます。

  ステップ1 /etc/pam.d/su を編集する

  ステップ2 su 許可ユーザをwheelグループに追加

  ステップ3 動作確認

※ 以前は「/etc/login.defs」ファイル内に「SU_WHEEL_ONLY yes」設定追加が必要でしたが、CentOS6及びCentOS7では不要です。

ステップ1 /etc/pam.d/su

/etc/pam.d/su のファイルの中にある「pam_wheel.so」モジュールを使用するように設定変更します。これによりwheelグループに属しているユーザだけが「su」が出来るように設定が変更になります。

# vi /etc/pam.d/su

どこを変更するのか 設定内容変更箇所

下記コメントで無効化されている箇所の「#」を外して設定を有効化します。

変更前

# Uncomment the following line to require a user to be in the "wheel" group.
#auth           required        pam_wheel.so use_uid

変更後

# Uncomment the following line to require a user to be in the "wheel" group.
auth           required        pam_wheel.so use_uid

※別OS(ディストリビューション)やバージョンによっては、以下設定の場合もあります。

#auth required /lib/security/$ISA/pam_wheel.so use_uid
#auth required /lib/security/pam_wheel.so group=wheel
#auth required /lib/security/pam_wheel.so use_uid group=wheel

ちょい注意ポイント sufficient

間違って下記部分のコメントをはずすと wheelグループに属しているユーザが「su」を実行するとパスワードなしでrootになれてしまいます。コメントを外す時は間違えないよう十分に注意してください。

# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth           sufficient      pam_wheel.so trust use_uid

設定を有効化させるのは「required」です。

ステップ2 ユーザをwheelグループに追加

「su」を許可するユーザをwheelグループへ追加します。追加方法は2つあります。下記のどちらかの方法で行うことが出来るのでそれぞれの方法を説明していきます。

グループを追加する方法は2つある
 1. /etc/groupを編集する
 2. usermodコマンドを使用する

1つめ /etc/groupファイルを編集

グループの設定ファイルである「/etc/group」を直接編集して、wheelグループにユーザを追加します。

# vi /etc/group

編集内容
今回は、hogeというユーザをwheelグループに追加してみます。複数のユーザを追加する際は「,」で区切っていきます。

編集前

wheel:x:10:

編集後

wheel:x:10:hoge  <--hogeユーザを追加しました。

2つめ usermod コマンドを使用

「usermod」コマンドを使用しwheelグループにユーザを追加する場合は「-G」オプションを使用し指定したユーザの副グループを指定します。

# usermod -G wheel ユーザ名

wheelグループにhogeユーザを追加する場合は、下記のようにコマンドを実行します。

# usermod -G wheel hoge

グループがユーザに追加しているか設定を確認

設定が完了しましたら、念のため「/etc/group」ファイルの中身を確認してwheelグループにユーザが追加されているか確認してみましょう。

# grep wheel /etc/group
wheel:x:10:hoge

ステップ3 動作確認

設定が完了しましたらsu実行可能userが制限できているか確認します。設定に間違いなどがあった場合ssh経由でrootになることが出来なくなる場合があるので、現在接続しているrootユーザでの接続は動作確認が取れるまで絶対に切断しないよう留意してください。sshで接続して動作確認を行う場合は、新規に接続を行って動作確認を行いましょう。

wheelグループ以外のユーザで「su」を実行

wheelグループに登録されていないユーザで「su」コマンドを実行します。CentOS7の場合下記の通り「拒否されたパーミッション」といったメッセージが表示され「su」が出来なくなっているはずです。CentOS6の場合は「パスワードが違います」といったメッセージが表示され、「su」が出来なくなっているはずです。

$ su -
パスワード:
su: 拒否されたパーミッション
$ su -
Password:
su: パスワードが違います

wheelグループのユーザで「su」を実行する

wheelグループに所属しているユーザで「su」を実行して、rootになれるか確認してみてください。問題なくrootユーザになれるようでしたら、設定作業は完了となります。

余談

他の記事も参考にさせていただきながら実際に制限して思ったのですが、信頼できる仲間やシステム業者の方々と構築していく環境を整備していく方が楽しいし安心できるとおもいました。もちろん今回の実行権限をシステム制御する事は有効です。同時に例えば万全な制御をしない時に仲間からアラートで知らせてくれるような構築メンバーとの信頼関係を日頃から築いている事もかなり重要だと感じました。

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

Raspberry PiでOut-Of-Treeのドライバをクロスコンパイルする

Raspberry PiでOut-Of-Treeのデバイスドライバをクロスコンパイルしてみたときの自分用メモです。
WAveshareのWM8960-HATのドライバを例にしてみます。
https://github.com/waveshare/WM8960-Audio-HAT

手順

クロコンパイル環境の準備

こちらのページ( https://qiita.com/mt08/items/d4e9b9e4953c8fa0abcf )やラズパイの公式ドキュメントを参考にクロスコンパイル環境を整えます。

Kernel Sourceの取得

こちら( https://github.com/raspberrypi/linux )からKernel Sourceを取得します。
たとえば現時点(2019/10/13)で最新のものは https://github.com/raspberrypi/linux/archive/raspberrypi-kernel_1.20190925-1.tar.gz から取得できます。
取得したら解凍して展開し、以下のコマンドで.configを作成しておきます。(.configがないと後のドライバのMake実行時にエラーが出ます。)

# Raspberry Pi 2/3の場合
make bcm2709_defconfig

# Raspberry Pi Zero/Zero W/B/Aの場合
make bcmrpi_defconfig

デバイスドライバのソースコード取得

こちら( https://github.com/waveshare/WM8960-Audio-HAT ) からデバイスドライバのソースコードを取得します。

Makefileの作成

クロスコンパイル用のMakefileを作成します。
ここではMakefile_crossという名前で作成します。

KERNELSRCDIR = ../linux-rpi-4.19.y
BUILD_DIR := $(shell pwd)
VERBOSE = 0

# Module name
obj-m := wm8960.o

all:
        make -C $(KERNELSRCDIR) SUBDIRS=$(BUILD_DIR) KBUILD_VERBOSE=$(VERBOSE) modules

clean:
        rm -f *.o
        rm -f *.ko

KERNELSRCDIRのディレクトリ指定はご自分で配置した構成に合わせて修正する必要があります。
作成したら、WM8960のドライバのソースコードと同じ位置に配置します。

ビルドの実行

以下のコマンドを実行し、ビルドします。

export ARCH=arm 
export CROSS_COMPILE=arm-linux-gnueabihf-
make -f Makefile_cross 

これでsnd-soc-wm8960.ko、snd-soc-wm8960-soundcard.koというモジュールができるので、
適切な場所にコピーしてロードすれば使えるようになります。

基本的には他のドライバも同じような方法で行けるはずです。

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