Quantcast
Channel: CentOS –俺的備忘録 〜なんかいろいろ〜
Viewing all 498 articles
Browse latest View live

awkでn回目にmutchした行のみを対象に処理を行う

$
0
0

awkで、n回目に条件にマッチした行のみに処理を行わせたいことがあったので、備忘として残しておく。
ちなみに、1回目ならこれでOK。

cat test1.txt | awk '/abc/{print $1;exit}'
blacknon@BS-PUB-UBUNTU-01:~$ cat test1.txt
1 abc
2 bbb
3 ccc
4 ddd
5 eee
6 fff
7 ggg
8 abc
9 bbb
blacknon@BS-PUB-UBUNTU-01:~$ cat test1.txt | awk '/abc/{print $1;exit}'
1

n回目なら、このように何回目のデ-タかを指定してやればいい。

cat test1.txt | awk '/abc/{i++}i==2{print $1;exit}'
blacknon@BS-PUB-UBUNTU-01:~$ cat test1.txt
1 abc
2 bbb
3 ccc
4 ddd
5 eee
6 fff
7 ggg
8 abc
9 bbb
blacknon@BS-PUB-UBUNTU-01:~$ cat test1.txt | awk '/abc/{i++}i==2{print $1;exit}'
8

 

「シェル芸」に効く!AWK処方箋 「シェル芸」に効く!AWK処方箋

whoisコマンドでドメインの有効期限のみを取得する

$
0
0

諸事情により、ドメインの有効期限についてスクリプトで取得する必要が出てきたので、取得方法について残しておく。LinuxやMac OS Xの場合、whoisコマンドでドメインのwhois情報が得られるので、そこからドメイン有効期限を取得する。ドメインの種類によってwhoisの出力内容は異なり、有効期限の表示方法も変わってくる。
以下、一般的によく利用されるドメインの種類別での取得方法(google.~で確認している)。

whois google.co.jp | sed -n '/状態/s/^.*(\(.*\)).*$/\1/p'
whois google.jp | awk '/有効期限/{print $2}'
whois google.com | awk '/ Expiration Date/{print $3;exit}' | date +%Y/%m/%d -f -
whois google.net | awk '/ Expiration Date/{print $3;exit}' | date +%Y/%m/%d -f -
whois google.org | awk '/ Expiry Date/{print $4;exit}' | date +%Y/%m/%d -f -

blacknon@BS-PUB-UBUNTU-01:~$ whois google.co.jp | sed -n '/状態/s/^.*(\(.*\)).*$/\1/p'
2017/03/31
blacknon@BS-PUB-UBUNTU-01:~$ whois google.jp | awk '/有効期限/{print $2}'
2017/05/31
blacknon@BS-PUB-UBUNTU-01:~$ whois google.com | awk '/ Expiration Date/{print $3;exit}' | date +%Y/%m/%d -f -
2020/09/14
blacknon@BS-PUB-UBUNTU-01:~$ whois google.net | awk '/ Expiration Date/{print $3;exit}' | date +%Y/%m/%d -f -
2018/03/15
blacknon@BS-PUB-UBUNTU-01:~$ whois google.org | awk '/ Expiry Date/{print $4;exit}' | date +%Y/%m/%d -f -
2017/10/20

 

実践DNS DNSSEC時代のDNSの設定と運用 実践DNS DNSSEC時代のDNSの設定と運用

aproposコマンドで指定したキーワードを含むmanを検索する

$
0
0

今まで知らなかったのだが、『apropos』というコマンドで指定したキーワードを含むマニュアルをmanから検索することができるようだ。
というわけで、早速検索してみよう。

apropos キーワード

 

例えば、「find」というキーワードで検索した場合は以下。

[root@BS-PUB-CENT7-01 ~]# apropos find
BIO_find_type (3ssl) - BIO chain traversal
btrfs-find-root (8)  - filter to find btrfs root
dracut-initqueue.service (8) - runs the dracut main loop to find the real root
FcConfigFilename (3) - Find a config file
File::Find (3pm)     - Traverse a directory tree.
find (1)             - search for files in a directory hierarchy
find-jar (1)         - find extension JAR or directory
find2perl (1)        - translate find command lines to Perl code
FindBin (3pm)        - Locate directory of original perl script
findfs (8)           - find a filesystem by label or UUID
findmnt (8)          - find a filesystem
git-bisect (1)       - Find by binary search the change that introduced a bug
git-cherry (1)       - Find commits not merged upstream
git-merge-base (1)   - Find as good common ancestors as possible for a merge
git-name-rev (1)     - Find symbolic names for given revs
git-pack-redundant (1) - Find redundant pack files
mysql_find_rows (1)  - extract SQL statements from files
oldfind (1)          - search for files in a directory hierarchy
OPENSSL_ia32cap (3ssl) - finding the IA-32 processor capabilities
perlmodlib (1)       - constructing new Perl modules and finding existing ones
pidof (8)            - find the process ID of a running program.
Pod::Simple::Search (3pm) - find POD documents in directory trees
systemd-delta (1)    - Find overridden configuration files
XFindContext (3)     - associative look-up routines
XkbFindOverlayForKey (3) - Find the alternate name by using the primary name for a key that is part of an overlay
XkbGetControls (3)   - Finds the current state of Xkb server controls
XkbKeycodeToKeysym (3) - Finds the keysym bound to a particular key at a specified group and shift level
XkbKeysymToModifiers (3) - Finds the set of modifiers bound to a particular keysym on the core keyboard
XkbLookupKeyBinding (3) - Find the string bound to a key by XRebindKeySym
XkbLookupKeySym (3)  - Find the symbol associated with a key for a particular state
XkbTranslateKeySym (3) - Find the string and symbol associated with a keysym for a given keyboard state

 

オプションで正規表現での検索もできるようだ。今まで知らなかったけど、結構便利そうだ。

 

入門者のLinux 素朴な疑問を解消しながら学ぶ (ブルーバックス) 入門者のLinux 素朴な疑問を解消しながら学ぶ (ブルーバックス)

sed/awkで指定された範囲の行を削除(除外)して出力する

$
0
0

sedやawkで、指定された範囲の行を除外(というか、削除)したいということがあったので、その備忘。
以下のように記述して実行してやることで、対象となる範囲の行を除外して出力できる。

sed '/start/,/end/d' PATH
awk '/start/,/end/{next}{print}' PATH

[root@BS-PUB-CENT7-01 ~]# cat test.txt
111
222
333

444
start
eee

ddd
sss

end
555
666

777
888
999
[root@BS-PUB-CENT7-01 ~]# cat test.txt | sed '/start/,/end/d'
111
222
333

444
555
666

777
888
999
[root@BS-PUB-CENT7-01 ~]# cat test.txt | awk '/start/,/end/{next}{print}'
111
222
333

444
555
666

777
888
999

 

なお、開始と終了の語句が同じ場合、awkだと語句のある行のみが削除されてしまい、うまく範囲指定できないので注意。

 

「シェル芸」に効く!AWK処方箋 「シェル芸」に効く!AWK処方箋

awkでスペース区切りの各ブロックごとに対して指定したキーワードがある場合は除外する

$
0
0

スペース区切りのブロックに対して、特定のキーワードを持つブロックを除外して出力する、ということをやりたいというツイートを見かけて、将来的に自分にも必要になる時が来るかもしれないので備忘として残しておくことにした。とりあえず、ここに記述したようにawkを使えばいけるようだ。

sed '1d;$d' test.txt | awk -vRS= -vORS='\n\n' '!/XXX/'

[root@BS-PUB-CENT7-01 ~]# cat test.txt
#####
aaa
bbb
ddd

ddd
XXX
fff

ggg
hhh
iii

XXX
kkk
lll
#####
[root@BS-PUB-CENT7-01 ~]# sed '1d;$d' test.txt | awk -vRS= -vORS='\n\n' '!/XXX/'
aaa
bbb
ddd

ggg
hhh
iii

AWK実践入門 (Software Design plus) AWK実践入門 (Software Design plus)

Apache GuacamoleでAD認証(LDAP連携)の設定を行う

$
0
0

sshやRDP、VNCの踏み台サーバとして利用できるApache Guacamoleでは、LDAP連携を行うことで、Active Directoryユーザでのログインが行える。
設定は簡単で、公式で配布されているjarファイルを所定の位置に配置してやり、かつLDAP連携の設定を設定ファイルに追記するだけだ。公式でも手順が公開されている(…今回は既存のADとの連携だったからかそのままは利用できなかったけど)ので、参照すると良いだろう。

まず、以下のコマンドでjarファイルのダウンロード・配置を行う。
(以下の例では、Guacamoleのバージョンが0.9.10となっているので、自身の環境に合わせてファイルをダウンロードすること。また、ファイルの配布先についても環境に応じて変更すること。)

wget http://archive.apache.org/dist/incubator/guacamole/0.9.10-incubating/binary/guacamole-auth-ldap-0.9.10-incubating.tar.gz
tar xzvf guacamole-auth-ldap-0.9.10-incubating.tar.gz
cp guacamole-auth-ldap-0.9.10-incubating/guacamole-auth-ldap-0.9.10-incubating.jar /var/lib/guacamole/extensions

jarファイルの配置が終わったら、guacamoleの設定ファイルを編集してやる。
以下、設定例。

●/etc/guacamole/guacamole.properties

# Hostname and port of guacamole proxy
guacd-hostname: localhost
guacd-port:     4822

# MySQL properties
mysql-hostname: localhost
mysql-port: 3306
mysql-database: guacamole
mysql-username: guacamole
mysql-password: P@ssw0rd
mysql-default-max-connections-per-user: 0
mysql-default-max-group-connections-per-user: 0

# Auth provider class
lib-directory: /var/lib/guacamole/extensions/
auth-provider: net.sourceforge.guacamole.net.auth.ldap.LDAPAuthenticationProvider

# LDAP properties
ldap-hostname:           ad.blacknon.local
ldap-port:               389
ldap-user-base-dn:       OU=XXXXX,DC=blacknon,DC=local
ldap-config-base-dn:     OU=XXXXX,DC=blacknon,DC=local
ldap-search-bind-dn:     CN=LDAP User,OU=XXXXX,DC=blacknon,DC=local
ldap-search-bind-password: XXXXXXXXXX
ldap-username-attribute: sAMAccountName

 

設定ファイル編集後は、Tomcat・guacdのプロセスを再起動してやれば設定が反映するはずだ。
ちなみに、各ADユーザの権限はローカルの同名のユーザと同じものが適用される。LDAPだけのユーザだと設定が面倒みたいなので、とりあえずパスワードをすごい複雑にした同名のローカルユーザを作っておいて、そこに権限を振るのが楽かも。

 

ひと目でわかるActive Directory Windows Server 2016版 ひと目でわかるActive Directory Windows Server 2016版

コンソール上で『-~』で始まるファイルを扱う

$
0
0

行儀が悪いというか、あまり作ることはないと思うのだが、コンソール上で『-~』で始まるファイルを扱う場合。こういったファイルの場合、ただ単にシングルクォーテーション・ダブルクォーテーションで括ってやっても駄目だったりする。
こういったファイルをコンソール上で扱う場合、大体のコマンドでは以下のように二重ハイフンを付与することで対応できる。

コマンド -- ファイルPATH

[root@BS-PUB-CENT7-01 ~]# touch -test
touch: `est': 無効な日付の書式です
[root@BS-PUB-CENT7-01 ~]# touch "-test"
touch: `est': 無効な日付の書式です
[root@BS-PUB-CENT7-01 ~]# touch '-test'
touch: `est': 無効な日付の書式です
[root@BS-PUB-CENT7-01 ~]#
[root@BS-PUB-CENT7-01 ~]# touch -- '-test'
[root@BS-PUB-CENT7-01 ~]# ls -la -- -test
-rw-r--r--. 1 root root 0  3月 12 20:26 -test
[root@BS-PUB-CENT7-01 ~]#
[root@BS-PUB-CENT7-01 ~]# rm -test
rm: 無効なオプション -- 't'
Try 'rm ./-test' to remove the file `-test'.
Try 'rm --help' for more information.
[root@BS-PUB-CENT7-01 ~]# rm -- -test
rm: 通常の空ファイル `-test' を削除しますか? y
[root@BS-PUB-CENT7-01 ~]# ls -la -- -test
ls: -test にアクセスできません: そのようなファイルやディレクトリはありません

 

[改訂第3版]シェルスクリプト基本リファレンス ──#!/bin/shで、ここまでできる (WEB+DB PRESS plus) [改訂第3版]シェルスクリプト基本リファレンス ──#!/bin/shで、ここまでできる (WEB+DB PRESS plus)

 

sshコマンドで接続、操作した際のログをTeratermのログみたいにターミナルログをタイムスタンプ付きで記録する

$
0
0

ちょっと前にも書いたが、scriptコマンドとawkを組み合わせることで、ターミナルログをタイムスタンプ付きで記録することができる。

script -fq >(awk '{print strftime("%F %T ") $0}{fflush() }'>> PATH)
[root@BS-PUB-CENT7-02 ~]# cat session.log
2017-02-02 11:06:26 スクリプトは 2017年02月02日 11時06分26秒
2017-02-02 11:06:26  に開始しました[root@BS-PUB-CENT7-02 ~]#
2017-02-02 11:06:27 [root@BS-PUB-CENT7-02 ~]#
2017-02-02 11:06:27 [root@BS-PUB-CENT7-02 ~]# ls -al
2017-02-02 11:06:27 合計 56
2017-02-02 11:06:27 dr-xr-x---.  6 root root 4096  2月  2 11:06 .
2017-02-02 11:06:27 dr-xr-xr-x. 17 root root 4096  1月 29 23:47 ..
2017-02-02 11:06:27 -rw-------.  1 root root 4115  2月  2 11:00 .bash_history
2017-02-02 11:06:27 -rw-r--r--.  1 root root   18 12月 29  2013 .bash_logout
2017-02-02 11:06:27 -rw-r--r--.  1 root root  176 12月 29  2013 .bash_profile
2017-02-02 11:06:27 -rw-r--r--.  1 root root  176 12月 29  2013 .bashrc
2017-02-02 11:06:27 drwxr-xr-x.  6 root root   89  1月 30 22:59 .cpan
2017-02-02 11:06:27 -rw-r--r--.  1 root root  100 12月 29  2013 .cshrc
2017-02-02 11:06:27 drwxr-xr-x.  3 root root   18  1月 31 23:28 .gem
2017-02-02 11:06:27 drwxr-----.  3 root root   18  1月 30 22:58 .pki
2017-02-02 11:06:27 -rw-r--r--.  1 root root  129 12月 29  2013 .tcshrc
2017-02-02 11:06:27 -rw-------.  1 root root 4492  2月  1 08:05 .viminfo
2017-02-02 11:06:27 -rw-------.  1 root root  986  1月  2  2016 anaconda-ks.cfg
2017-02-02 11:06:27 drwxr-xr-x. 10 root root 4096  1月 30 22:58 dategrep
2017-02-02 11:06:27 -rw-r--r--.  1 root root  334  2月  2 11:06 session.log
2017-02-02 11:06:28 [root@BS-PUB-CENT7-02 ~]#
2017-02-02 11:06:29 [root@BS-PUB-CENT7-02 ~]# exit
2017-02-02 11:06:29 exit

で、この時、scriptコマンドでは特定のコマンドを直接実行できるので、ここでsshコマンドを実行してやることで、ssh接続時のターミナルログをタイムスタンプ付きで記録することができる。

# Linux
script -fq -c "ssh user@hostname" >(awk '{print strftime("%F %T ") $0}{fflush() }'>> PATH)

# Mac OS X
script -Fq >(awk '{print strftime("%F %T ") $0}{fflush() }'>> PATH) "ssh user@hostname"

 

sshの接続が切れたら、自動的にロギングも停止する。
踏み台側に設定しておくことで、クライアント側での操作を記録する事もできるだろう。
…まぁ、前に作ったlsshの中でやってるのと同じなので、そんな目新しいものでも無かったけど、とりあえず残しておく。

 

新しいLinuxの教科書 新しいLinuxの教科書

cdで複数個上のディレクトリに移動する

$
0
0

Twitterでそんなのを見かけたので、そういやどうやんのかなと思ってちょっと調べてみた。
そもそも、cdで複数個上の階層のディレクトリに移動する場合、以下のように指定する。

cd ../../ # 2個上の階層
cd ../../../ # 3個上の階層

ただ、こんなのいちいち書いてられないので、もうちょっと分かりやすく書けないものか。
で、調べてみたところprintfをうまく利用することで、historyなどから再利用しやすく書けるようだ。

cd $(printf "%0.s../" {1..n})
[root@BS-PUB-CENT7-01 perf]# pwd
/usr/local/src/guacamole/0.9.10-incubating/mysql-connector-java-5.1.40/src/testsuite/perf
[root@BS-PUB-CENT7-01 perf]# cd $(printf "%0.s../" {1..3})
[root@BS-PUB-CENT7-01 mysql-connector-java-5.1.40]# pwd
/usr/local/src/guacamole/0.9.10-incubating/mysql-connector-java-5.1.40

 

ざっくりこんな感じだろうか。

 

新しいLinuxの教科書 新しいLinuxの教科書

sed/awkで最終行からn行にだけ処理を行わせる

$
0
0

sedでは、1行目からn行目までの範囲に対して処理をするように指定できるのだが、最終行からn行に対してのみ置換などの処理を行わせたい場合、普通には指定ができない。
たとえば、以下のようにしてすることで頭の4行のみを対象とする事はできるのだが、後ろの4行を対象に処理をさせることはできない。

sed '1,4s/^/#/g' test # 先頭4行のみを対象とする。これは動く
sed '$-4,$s/^/#/g' test # 末尾4行を対象にしたいが、マイナスは指定できないのでこれは動かない
[root@BS-PUB-CENT7-01 ~]# cat test
1
2
3
4
5
6
7
8
9
10
[root@BS-PUB-CENT7-01 ~]# sed '1,4s/^/#/g' test # 先頭4行のみを対象とする。これは動く
#1
#2
#3
#4
5
6
7
8
9
10
[root@BS-PUB-CENT7-01 ~]# sed '$-4,$s/^/#/g' test # 末尾4行を対象にしたいが、マイナスは指定できないのでこれは動かない
sed: -e expression #1, char 2: 不明なコマンド: `-'

 

1.sedの場合

じゃ、末尾の数行に対してのみ処理を行わせる場合、どうすればよいのか。2つほど例を出してみる(Nのトコに数字が入る)。
よくある方法としては、tacと組み合わせて処理をする方法だろうか。wcと組み合わせる方法であれば上書きなどもできるので、状況に応じて使い分けるといいだろう。

tac file | sed '1,Ns/^/#/g' | tac
sed "$(($(wc -l < test)-N+1)),\$s/^/#/g" file
[root@BS-PUB-CENT7-01 ~]# tac test | sed '1,3s/^/#/g' | tac
1
2
3
4
5
6
7
#8
#9
#10
[root@BS-PUB-CENT7-01 ~]# sed "$(($(wc -l < test)-3+1)),\$s/^/#/g" test
1
2
3
4
5
6
7
#8
#9
#10

2.awkの場合

一応、awkでも同じような処理ができる。まぁ、awkが使える環境ならsedも使えるだろうし、あまり使うことはないだろう。

awk '{buf[NR-1]=$0;}END{x=N;for(i=0;i<NR;i++){if(i>(NR-x-1)){gsub("^","#",buf[i])};print buf[i];}}' file
[root@BS-PUB-CENT7-01 ~]# awk '{buf[NR-1]=$0;}END{x=3;for(i=0;i<NR;i++){if(i>(NR-x-1)){gsub("^","#",buf[i])};print buf[i];}}' test
1
2
3
4
5
6
7
#8
#9
#10

 

sed & awkプログラミング 改訂版 (A nutshell handbook) sed & awkプログラミング 改訂版 (A nutshell handbook)

sedやawkで置換前の値を元に計算した値で置換を行う

$
0
0

sedやawkで、置換前の値を元に、計算した値で置換を行いたいというのがあったので、備忘で残しておく。
例えば、以下のようなファイルに対し、数字を3足した内容を出力させたいとする。

[root@BS-PUB-CENT7-01 ~]# cat test.txt
test 1
test 2
test 3
test 4
test 5
test 6
test 7
test 8
test 9
test 10

1.gnu sedの場合

sedの場合、sed自体には計算を行う機能がないため、後方参照とサブプロセス、さらに後方参照で得た値をサブプロセスに渡すために、置換した値をOSのコマンドとして利用して対応する。

cat test.txt | sed 's/\([a-z]*\) \([0-9]*\)/echo \1 $((\2 + 3))/eg'
[root@BS-PUB-CENT7-01 ~]# cat test.txt | sed 's/\([a-z]*\) \([0-9]*\)/echo \1 $((\2 + 3))/eg'
test 4
test 5
test 6
test 7
test 8
test 9
test 10
test 11
test 12
test 13

2.awkを用いる場合

awkを用いる場合は、 今回の例のような場合は単純で、以下のようにコマンドを実行してやれば良い。

awk '{print $1,$2 + 3}'
[root@BS-PUB-CENT7-01 ~]# cat test.txt | awk '{print $1,$2 + 3}'
test 4
test 5
test 6
test 7
test 8
test 9
test 10
test 11
test 12
test 13

 

基本はawkを使うといいだろう。
対象のファイルを上書き保存したいといった場合であれば、sedを使うほうが良いかもしれない。

 

grep,sed,awk grep,sed,awk

vimで権限のないファイルをそのまま保存させる

$
0
0

仕事などで、各サーバに入っているvimでの操作を行うことが多いのだが、疲れてくるとうっかりroot権限が必要になるファイルを一般ユーザで開いてしまい、そのまま保存させることができずに再度rootで開き直して再編集する、といったことをよくやってしまう。
で、これをそのまま保存させる方法があるようなので、備忘として残しておく。やり方は単純で、保存する時に以下のようにコマンドを実行してやれば、sudoでroot権限で保存がされる(当たり前の話だが、sudo権限がないと行えない操作なのでそこは注意)。

:w !sudo tee %

 

これで、root権限が必要になるファイルでも、とりあえずそのまま保存が可能だ。

 

Vimテクニックバイブル ~作業効率をカイゼンする150の技 Vimテクニックバイブル ~作業効率をカイゼンする150の技

pgrep・pkillを用いて親プロセスから再帰的にプロセスを強制的にkillする

$
0
0

ちょっとした作業で、親プロセスIDを指定して子プロセスを再帰的にkillしたいということがあったので、その備忘。
特定のプロセスをkillする場合だと、よくpgrepを使ってプロセスidを取得して、そこからkillさせていたのだが、それだと子プロセスが残ってしまう。で、どうすればよいのかと調べたところ、pgrepやpkillでは-gオプションを付与することで全プロセスIDを取得・指定できるので、それを利用すれば良い。

pgrep -g $(pgrep 親プロセス名) # 子プロセスを含め、すべてのプロセスを取得する
pkill -g $(pgrep 親プロセス名) # 子プロセスを含め、すべてのプロセスをkillする
pkill -KILL -g $(pgrep 親プロセス名) # 子プロセスを含め、すべてのプロセスをkillする
[root@BS-PUB-CENT7-01 ~]# ps -ef | grep [s]ql
root      8532 10179  0 14:28 pts/0    00:00:00 /bin/sh /usr/bin/mysqld_safe --skip-grant-tables
mysql     8687  8532  0 14:28 pts/0    00:00:00 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --skip-grant-tables --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/mariadb.pid --socket=/var/lib/mysql/mysql.sock
[root@BS-PUB-CENT7-01 ~]# pgrep -g $(pgrep mysqld_safe)
8532
8687

 

ちなみに、親プロセスを正常終了させるのであれば、以下のようにコマンドを実行してやれば良い。

pkill -TERM -P $(pgrep mysqld_safe)

 

標準テキスト CentOS 7 構築・運用・管理パーフェクトガイド 標準テキスト CentOS 7 構築・運用・管理パーフェクトガイド

lsshを使って鍵に応じてアクセス可能なサーバを切り替えさせる簡易的なsshの踏み台を構築する

$
0
0

この間、lsshというsshのラッパーコマンドをGolangで書いてみたのだが、なんか他に使い道ないかなと考えてみた。
このコマンド、”リストから接続先を選択する”という作りなので、コマンド実行さえさせてしまえばあとは接続先を指定してsshへのログインを自動で行える。なので、「/etc/passwd」とか秘密鍵の実行コマンドに指定することで、(接続先のカギやパスワードをクライアントに渡すことなく)ssh接続だけを行う踏み台サーバにできるというのがあったので、他にネタがなかったのでせっかくなので、実際に鍵ファイルに応じてアクセス可能なサーバを変更するように設定してみることにした。なお、実行バイナリは「/usr/local/bin/」配下に配置している。

とりあえずコンパイルしたバイナリを「/usr/local/bin/」に配置して、使える状態にする。
で、各鍵で使用するtomlファイルを作成する。

●test-a.toml

[log]
enable = true
dirpath = "/path/to/logdirA"

[server.ServerA1]
addr = "192.168.100.101"
port = "22"
user = "test"
pass = "Password"
note = "Password Auth Server"

[server.ServerA2]
addr = "192.168.100.102"
port = "22"
user = "test"
key  = "/path/to/private_key"
note = "Key Auth Server"

 

●test-b.toml

[log]
enable = true
dirpath = "/path/to/logdirB"

[server.ServerB1]
addr = "192.168.100.111"
port = "22"
user = "test"
pass = "Password"
note = "Password Auth Server"

[server.ServerB2]
addr = "192.168.100.112"
port = "22"
user = "test"
key  = "/path/to/private_key"
note = "Key Auth Server"

で、後は公開鍵が登録されている「~/.ssh/authorized_keys」で、以下のように各公開鍵に応じて読み込むtomlファイルを指定してやればよい。

command="/usr/local/bin/lssh -f /home/lssh/test-a.toml" ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD0MR240HV9vEYynEmnLyc1+ZgeV/o+tdN6OYa0fn91fEI2vsbkaN4yuWTVMUp5Dz5stzc9MdE58O5X368Se0JPAl9qQoo++i79mRF2FzdeMTAlXy1juPj1MKNhZu3/0FJkFJ9sRlDpzNM4m3ZNALWCO+sXwlyUejZbn0ReOxcErCmwPpSXg9IHkgIeIN/4KtiHdhCRw7ZALPj+O31iN+xcCSMu/HjMgO7UITvgVY1oN1ok0qHbKUd6vUQLnHdY15okwOjg1YczBBHsudGptQPW9fRDsFJB1980heVRtlxftrzP/Ema1PR64A/V7bA6cr2KsAgANBwBigi17d0/B90l blacknon@BS-PUB-DEVELOP
command="/usr/local/bin/lssh -f /home/lssh/test-b.toml" ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCzn+uOZw5G/39xfRLF6iANrdLb8w3Bkhlaocy/GsYPUG5wV1P9gGM5xvMy99rJMBdoj1pNZWzI3fdhANANanoD50Xtew+P5AOhKh99S/3LNZCjfvpZKBMz2qMM77FCVyter8We0D49IhIYUnE2q4MXtn42HWgb0zlixQgSCGiuS8DfHM4vAUGKvkeO2TkHncGtiJ4nPwVHpHrPMnZ2t0xcTeRrQHPxK03M62H8Cq9NOAHm5b7X3nDyIzl+EWBa249dxMFlAa8STz+9g3gtoUXES2Ujmv3LoTuhuvKbrxGy+796Cbeb+1f1bqMdb1Ng1HCOiISSv5fUIW+obFl3HoHF blacknon@BS-PUB-UBUNTU-01

 

これで、鍵に応じて選択できる(ログインできる)サーバを制限できる。

 

踏み台として使用しているサーバには対象の鍵ではアクセス出来ないので、管理者が管理しないといけないんだけど、まぁ簡易的な踏み台としては使えないことはないか。
RDPやVNCも含みで一括管理させたいならApache Guacamole使えばいいし。

 

OpenSSH[実践]入門 (Software Design plus) OpenSSH[実践]入門 (Software Design plus)

ethtoolコマンドを使って物理配線時に特定のインターフェイスのLEDを点灯させて識別する

$
0
0

LANケーブルの物理配線時に、物理nicとeth0とかens18とかが、どれがどれに紐付いているのかわからない事が多い。
で、もし載ってるOSがLinuxであれば、以下のようにethtoolコマンドを実行することで対象のNICのLEDを点灯させることができるので、どれがどれに紐付いてるのか識別が可能だ。

ethtool -p DEVICE(eth0など)

 

2人体制で物理配線するときには、片方がコマンド打って、もう片方が配線するってやり方でいけそうだ。

新しいLinuxの教科書 新しいLinuxの教科書

 


シェル芸で、文章から特定の文字列が縦読みで存在するかどうかgrepする

$
0
0

ふと、文章の中に縦読みで特定の文字列が仕込まれていないかどうか、シェル芸で確認できないかなと思ったのでやってみた。
至極当たり前の話として、grepは行に対して処理を行うので、縦書きのものには利用できない。で、じゃあどうすればいいのか。縦書きに対して処理できないなら、横書きに変換してしまえばいい。

縦書きから横書きに変換するのは、結構前に表に対して同様の処理を行っていたので、それを応用してやれば良い。ちょっと長くなるけど、awkでやった際のコマンドが以下。

awk -F '' '{for(i=1;i<=NF;i++){a[NR,i]=$i}}NF>p{p=NF}END{for(j=1;j<=p;j++){str=a[1,j];for(i=2;i<=NR;i++){str=str""a[i,j];}print str}}' file.path | cat -n | grep -i String

[root@BS-PUB-CENT7-01 ~]# cat test1.txt
長い夢から覚めた気分だ・・・俺は気がつくとここにいた
門の前には2つの人影がある・・・1人は若い男だ
はっとした。見間違いだと思った・・・あの・・・もう1人の人物は・・・
俺は信じがたい光景を目の当たりにして少々混乱した
のうのうと生きてきた自分を初めて呪った・・・
嫁だ・・・これは・・・嫁の浮気現場だったのだ・・・俺は神を憎み、絶望した・・・
[root@BS-PUB-CENT7-01 ~]# cat test1.txt | awk -F '' '{for(i=1;i<=NF;i++){a[NR,i]=$i}}NF>p{p=NF}END{for(j=1;j<=p;j++){str=a[1,j];for(i=2;i<=NR;i++){str=str""a[i,j];}print str}}'| cat -n - | grep -i -e 長門
     1  長門は俺の嫁

 

無事、縦書きの箇所が取得できた。
…やっといてなんだけど、こんなん何かの役に立つのだろうか?と思わなくもない。Fワードとか書いた単語リストを作っておいて、grepでそのファイルを読み込ませることで、文章に縦書きが仕込まれてるかどうかを確認するくらいかなぁ…。

 

~追記~

@ebanさんがもっと短く書いてた。無理してawk1個でやるのではなく、seqで対象となる文字位置(列)をxargs経由でawkに渡している。
確かに、言われてみれば…全然思いつかなかった。

seq 100 | xargs -I@ awk '{a=a substr($0,@,1)}END{print a}' test1.txt | grep -n 長門
[root@BS-PUB-CENT7-01 ~]# seq 100 | xargs -I@ awk '{a=a substr($0,@,1)}END{print a}' test1.txt | grep -n 長門
1:長門は俺の嫁

 

文字の個数が決め打ちで100になっているので、とりあえず各行の最大数を使って処理させるようにしたのが以下。

seq $(awk '{n=length($0);if(m<n) m=n}END{print m}' test1.txt) | xargs -I@ awk '{a=a substr($0,@,1)}END{print a}' test1.txt | grep -n 長門

 

ことばあそびの歴史: 日本語の迷宮への招待 (河出ブックス) ことばあそびの歴史: 日本語の迷宮への招待 (河出ブックス)

シェル芸で、文章から縦読みではなく斜め読みをgrepする

$
0
0

ちょっと前に、シェル芸で文章から縦読みをgrepするということをやってたので、今回は斜め読みをしてみる。
基本は縦読みと対して変わらず、その応用になる。以下、実行した際のコマンド。

seq $(awk '{n=length($0);if(m<n) m=n}END{print m}' file.path)|xargs -I@ awk '{s=@-1;a=a substr($0,s+NR,1)}END{print a}' file.path | grep -n string

[root@BS-PUB-CENT7-01 ~]# cat test2.txt
なめ読みとは、時間を省くためなどに文章を要点以外は飛ばして読むことである。
あたも新聞や小説を読む時にしっかり読まずに斜め読みをしたことがあるだろう。
なおだち易い文章だけ読んで目立ちにくい文章を飛ばして読む方法もある。
やはり書する時はななめ読みすると早く読めるのでオススメである。
やっぱりんなもどんどん斜め読みをすべきである。
[root@BS-PUB-CENT7-01 ~]# seq $(awk '{n=length($0);if(m<n) m=n}END{print m}' test1.txt)|xargs -I@ awk '{s=@-1;a=a substr($0,s+NR,1)}END{print a}' test2.txt
ななめ読み
なただ書ん
めもちすな
読新易るも
み聞い時ど
とや文はん
は小章など
、説だなん
時をけめ斜
間読読読め
をむんみ読
省時ですみ
くに目るを
たし立とす
めっち早べ
なかにくき
どりく読で
に読いめあ
文ま文るる
章ず章の。
をにをで
要斜飛オ
点めばス
以読しス
外みてメ
はを読で
飛しむあ
ばた方る
しこ法。
てとも
読があ
むある
こる。
とだ
でろ
あう
る。
。


[root@BS-PUB-CENT7-01 ~]# seq $(awk '{n=length($0);if(m<n) m=n}END{print m}' test1.txt)|xargs -I@ awk '{s=@-1;a=a substr($0,s+NR,1)}END{print a}' test2.txt | grep -n ななめ
1:ななめ読み

 

まぁ、以上。
相変わらず利用シーン思いつかないけど。

 

日本の大和言葉を美しく話す―こころが通じる和の表現 日本の大和言葉を美しく話す―こころが通じる和の表現

CentOS 7でrsyslogのログをMariaDBに出力させる

$
0
0

個人的には、ログはテキストファイルの方が色々と都合が良い(後からの統計取得だったり検知・加工してエラー確認とかシェル芸でできるので)のだが、諸々の事情(セキュリティ的な色々だったり、コマンド操作があまりできない人でも使える状態にしたいなど)によって、テキストファイルでの出力や保管、閲覧が都合が悪い事がある。で、rsyslogではログをDBに出力可能なので、今回は、OSにはCentOS 7を、出力先のDBにはローカルにインストールしたMariaDBを用いる。

1.MariaDBのインストール

まずはMariaDB自体のインストールから。以下のコマンドでインストールする。

yum install -y mariadb-server
systemctl start mariadb

 

インストール後、以下のコマンドでセキュリティ設定を行う。

mysql_secure_installation

 

2.rsyslogの設定

次にrsyslogの設定を行う。まず、rsyslogでMariaDBとの連携を行うためのプラグインの導入を行う。

yum install -y rsyslog-mysql

 

プラグインの導入後、以下のコマンドを実行してMariaDBにrsyslog用のデータベースやユーザを作成する。

cat /usr/share/doc/rsyslog-*/mysql-createDB.sql | mysql -u root -p
mysql -u root -p -e "GRANT ALL PRIVILEGES ON Syslog.* TO rsyslog@'localhost' identified by 'パスワード';"

MariaDBの設定ファイルを編集し、DBに出力したいログについて、設定を追記・編集する。
以下の例では、ファシリティを制限せずにすべてのログを対象として設定している。ハイライトされている箇所を追記してやれば良い。

●/etc/rsyslog.conf

# rsyslog configuration file

# For more information see /usr/share/doc/rsyslog-*/rsyslog_conf.html
# If you experience problems, see http://www.rsyslog.com/doc/troubleshoot.html

#### MODULES ####

# The imjournal module bellow is now used as a message source instead of imuxsock.
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
$ModLoad imjournal # provides access to the systemd journal
#$ModLoad imklog # reads kernel messages (the same are read from journald)
#$ModLoad immark  # provides --MARK-- message capability
$ModLoad ommysql # 追記

# Provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514

# Provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514


#### GLOBAL DIRECTIVES ####

# Where to place auxiliary files
$WorkDirectory /var/lib/rsyslog

# Use default timestamp format
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

# File syncing capability is disabled by default. This feature is usually not required,
# not useful and an extreme performance hit
#$ActionFileEnableSync on

# Include all config files in /etc/rsyslog.d/
$IncludeConfig /etc/rsyslog.d/*.conf

# Turn off message reception via local log socket;
# local messages are retrieved through imjournal now.
$OmitLocalLogging on

# File to store the position in the journal
$IMJournalStateFile imjournal.state


#### RULES ####

# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console

# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none                /var/log/messages

# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure

# Log all the mail messages in one place.
mail.*                                                  -/var/log/maillog


# Log cron stuff
cron.*                                                  /var/log/cron

# Everybody gets emergency messages
*.emerg                                                 :omusrmsg:*

# Save news errors of level crit and higher in a special file.
uucp,news.crit                                          /var/log/spooler

# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log

*.*                                                     :ommysql:localhost,Syslog,rsyslog,パスワード

# ### begin forwarding rule ###
# The statement between the begin ... end define a SINGLE forwarding
# rule. They belong together, do NOT split them. If you create multiple
# forwarding rules, duplicate the whole block!
# Remote Logging (we use TCP for reliable delivery)
#
# An on-disk queue is created for this action. If the remote host is
# down, messages are spooled to disk and sent when it is up again.
#$ActionQueueFileName fwdRule1 # unique name prefix for spool files
#$ActionQueueMaxDiskSpace 1g   # 1gb space limit (use as much as possible)
#$ActionQueueSaveOnShutdown on # save messages to disk on shutdown
#$ActionQueueType LinkedList   # run asynchronously
#$ActionResumeRetryCount -1    # infinite retries if host is down
# remote host is: name/ip:port, e.g. 192.168.0.1:514, port optional
#*.* @@remote-host:514
# ### end of the forwarding rule ###

 

設定ファイル編集後、rsyslogのサービスを再起動する。

systemctl restart rsyslog

 

これで、ログがMariaDBに転送されるようになったはずだ。

 

3.ログの確認

最後に、DBにアクセスしてログの記録状態を確認する。
mysqlコマンドでデータベースにアクセスし、以下のsqlを実行してやる。

select ReceivedAt,
       Facility,
       Priority,
       SysLogTag,
       FromHost,
       Message
from SystemEvents;
[root@BS-PUB-CENT7-01 ~]# mysql -u rsyslog -p Syslog
Enter password:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 17
Server version: 5.5.52-MariaDB MariaDB Server

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [Syslog]> select ReceivedAt,
    ->        Facility,
    ->        Priority,
    ->        SysLogTag,
    ->        FromHost,
    ->        Message
    -> from SystemEvents;
+---------------------+----------+----------+-------------------------------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ReceivedAt          | Facility | Priority | SysLogTag                           | FromHost        | Message                                                                                                                                                                                           |
+---------------------+----------+----------+-------------------------------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 2017-03-27 09:20:50 |        5 |        6 | rsyslogd:                           | BS-PUB-CENT7-01 |  [origin software="rsyslogd" swVersion="7.4.7" x-pid="19561" x-info="http://www.rsyslog.com"] start                                                                                               |
| 2017-03-27 09:20:50 |        3 |        4 | systemd:                            | BS-PUB-CENT7-01 | Cannot add dependency job for unit microcode.service, ignoring: Unit is not loaded properly: Invalid argument.                                                                                    |
| 2017-03-27 09:20:50 |        3 |        6 | systemd:                            | BS-PUB-CENT7-01 | Stopping System Logging Service...                                                                                                                                                                |
| 2017-03-27 09:20:50 |        3 |        6 | systemd:                            | BS-PUB-CENT7-01 | Starting System Logging Service...                                                                                                                                                                |
| 2017-03-27 09:20:50 |        3 |        6 | systemd:                            | BS-PUB-CENT7-01 | Started System Logging Service.                                                                                                                                                                   |
| 2017-03-27 09:20:50 |       10 |        5 | polkitd[606]:                       | BS-PUB-CENT7-01 | Unregistered Authentication Agent for unix-process:19554:3646650 (system bus name :1.48, object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale ja_JP.UTF-8) (disconnected from bus) |
| 2017-03-27 10:01:02 |        3 |        6 | systemd:                            | BS-PUB-CENT7-01 | Started Session 12 of user root.                                                                                                                                                                  |
| 2017-03-27 10:01:02 |        3 |        6 | systemd:                            | BS-PUB-CENT7-01 | Starting Session 12 of user root.                                                                                                                                                                 |
| 2017-03-27 10:01:02 |        9 |        6 | CROND[19582]:                       | BS-PUB-CENT7-01 | (root) CMD (run-parts /etc/cron.hourly)                                                                                                                                                           |
| 2017-03-27 10:01:02 |        9 |        5 | run-parts(/etc/cron.hourly)[19582]: | BS-PUB-CENT7-01 | starting 0anacron                                                                                                                                                                                 |
| 2017-03-27 10:01:02 |        9 |        5 | run-parts(/etc/cron.hourly)[19591]: | BS-PUB-CENT7-01 | finished 0anacron                                                                                                                                                                                 |
| 2017-03-27 11:01:01 |        3 |        6 | systemd:                            | BS-PUB-CENT7-01 | Started Session 13 of user root.                                                                                                                                                                  |
| 2017-03-27 11:01:01 |        3 |        6 | systemd:                            | BS-PUB-CENT7-01 | Starting Session 13 of user root.                                                                                                                                                                 |
| 2017-03-27 11:01:01 |        9 |        6 | CROND[19609]:                       | BS-PUB-CENT7-01 | (root) CMD (run-parts /etc/cron.hourly)                                                                                                                                                           |
| 2017-03-27 11:01:01 |        9 |        5 | run-parts(/etc/cron.hourly)[19609]: | BS-PUB-CENT7-01 | starting 0anacron                                                                                                                                                                                 |
| 2017-03-27 11:01:01 |        9 |        5 | run-parts(/etc/cron.hourly)[19618]: | BS-PUB-CENT7-01 | finished 0anacron                                                                                                                                                                                 |
| 2017-03-27 12:01:01 |        3 |        6 | systemd:                            | BS-PUB-CENT7-01 | Started Session 14 of user root.                                                                                                                                                                  |
| 2017-03-27 12:01:01 |        3 |        6 | systemd:                            | BS-PUB-CENT7-01 | Starting Session 14 of user root.                                                                                                                                                                 |
| 2017-03-27 12:01:01 |        9 |        6 | CROND[19635]:                       | BS-PUB-CENT7-01 | (root) CMD (run-parts /etc/cron.hourly)                                                                                                                                                           |
| 2017-03-27 12:01:01 |        9 |        5 | run-parts(/etc/cron.hourly)[19635]: | BS-PUB-CENT7-01 | starting 0anacron

…

 

これで、rsyslogからのログをMariaDBへ転送できるようになった。
今回の例ではローカルホストに同居させたが、設定してやればリモートのDBにログを転送させることも可能だ。

 

詳解MySQL 5.7 止まらぬ進化に乗り遅れないためのテクニカルガイド (NEXT ONE) 詳解MySQL 5.7 止まらぬ進化に乗り遅れないためのテクニカルガイド (NEXT ONE)

pythonでバージョン番号の比較を行う

$
0
0

ちょっとしたスクリプトをPythonで作成しようとしてて、バージョン番号の比較をさせる必要があったので備忘として残しておく。
Pythonでバージョン番号の比較を行う場合は、以下の2つの方法があるようだ。

1.『distutils.version』を用いる

『distutils.version』を利用することで、バージョン番号の比較が行えるようだ。以下のようにインポートして関数を利用、比較してやれば良いようだ。
比較用の関数は2つ用意されており、「StrictVersion」と「LooseVersion」が利用できる。アルファベットを含むような、数字だけではないバージョン番号(rcとか)を比較する場合は「LooseVersion」を使うとよい(なお、混在させると正常に動作しないので注意。比較時は必ず同じ関数を使うこと)。

[root@BS-PUB-CENT7-01 ~]# python
Python 2.7.5 (default, Nov  6 2016, 00:28:07)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> # -*- coding: utf-8 -*-
... from distutils.version import LooseVersion, StrictVersion
>>>
>>> # Trueが返ってくる
... print(StrictVersion('11.0') > StrictVersion('10.4.2'))
True
>>>
>>> # Flaseが返ってくる
... print(StrictVersion('9.0') > StrictVersion('10.4.2'))
False
>>>
>>> # Trueが返ってくる
... LooseVersion('1.5c2') > LooseVersion('1.5')
True

2.『pkg_resources』を用いる

「1.7-rc2」など、テスト版と正式リリース版で比較できるようにする場合は、「pkg_resources」を用いてやるといいようだ。
ライブラリはpipで以下のようにインストールできる。

pip install distribute

 

以下、実行例。

[root@BS-PUB-CENT7-01 ~]# python
Python 2.7.5 (default, Nov  6 2016, 00:28:07)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> # -*- coding: utf-8 -*-
... from distutils.version import LooseVersion, StrictVersion
>>> from pkg_resources import parse_version
>>>
>>> # Flaseが返ってくる
... LooseVersion('1.5') > LooseVersion('1.5-rc3')
False
>>>
>>> # Trueが返ってくる
... parse_version('1.5') > parse_version('1.5-rc3')
True

 

3.『packaging.version.parse』を用いる

もしくは、setuptoolsのインストールとともについてくる『packaging.version.parse』を用いることでも、バージョンの比較が可能だ。
setuptoolsのインストールをしていない場合orインストールしたくない場合、以下のようにpipでライブラリだけインストールしてやるといい。

pip install packaging

 

以下、実行例。

[root@BS-PUB-CENT7-01 ~]# python
Python 2.7.5 (default, Nov  6 2016, 00:28:07)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from packaging import version
>>> version.parse("0.1") < version.parse("1.0.2") True >>> version.parse("1.3.a") < version.parse("1.2.2")
False

 

【参考】

 

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング 退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

sshdのmatchでユーザ単位・アドレス単位でchrootをさせるなど、matchに応じて処理方法を変える

$
0
0

chrootをさせるときなど、OpenSSHではアクセスしてきたクライアントに対し、matchに記述した条件に応じてその後の処理を変えることができる。これを利用することで、たとえば特定のネットワークアドレスからのアクセスの場合はchrootを、そうでない場合は普通にsshで接続させるようにするなどの指定が行える。

設定は「/etc/ssh/sshd_config」で、以下のような内容を追記してやる。
(ちなみに、調べた内容はCentOS 7の「openssh-server-6.6.1p1-33.el7_3.x86_64」なので、バージョンによっては差異があるかもしれない)

●/etc/ssh/sshd_config

Match 条件1
       条件合致後の設定
       ...
Match 条件2
       条件合致後の設定
       ...

 

Matchで指定できる条件には、以下がある。複数の条件に合致した場合を指定する際、スペース区切りで複数条件が指定可能だ。
各条件ごとに複数の値を指定する場合、「,」区切りで指定できる(この時、「User *,!root」みたいな感じで記述してあげると、root以外の全ユーザを対象にできる。一応、後の例で記述。)。

  • User … アクセスしてきているユーザ名
  • Group … アクセスしてきているユーザのグループ
  • Host … アクセス元のホスト名(まぁ、あまり使わないだろう…)
  • LocalAddress … アクセスされているローカルアドレス(IPアドレスが複数ある場合などに使える)
  • LocalPort … アクセスされているローカルポート
  • Address … sshクライアントのIPアドレス。ワイルドカードでの指定や、CIDR形式での指定もできる。

 

条件合致後に指定できる設定は以下(manから抽出)。

  • AcceptEnv
  • AllowAgentForwarding
  • AllowGroups
  • AllowTcpForwarding
  • AllowUsers
  • AuthenticationMethods
  • AuthorizedKeysCommand
  • AuthorizedKeysCommandUser
  • AuthorizedKeysFile
  • AuthorizedPrincipalsFile
  • Banner
  • ChrootDirectory
  • DenyGroups
  • DenyUsers
  • ForceCommand
  • GatewayPorts
  • GSSAPIAuthentication
  • HostbasedAuthentication
  • HostbasedUsesNameFromPacketOnly
  • KbdInteractiveAuthentication
  • KerberosAuthentication
  • KerberosUseKuserok
  • MaxAuthTries
  • MaxSessions
  • PasswordAuthentication
  • PermitEmptyPasswords
  • PermitOpen
  • PermitRootLogin
  • PermitTTY
  • PermitTunnel
  • PubkeyAuthentication
  • RekeyLimit
  • RhostsRSAAuthentication
  • RSAAuthentication
  • X11DisplayOffset
  • X11MaxDisplays
  • X11Forwarding
  • X11UseLocalHost

ちなみに、この設定「上から順に条件に一致しているか調べる」ため、例えば1個目の条件にmatchしたとしてもそこで終了にはならず、2個め以降の条件にもmatchしているかどうかを確認しに行くことになる。一応、一番最初にmatchした設定が優先される(2個め以降で同じ設定項目が出てきても、それは有効にならない)のだが、そこは注意かも。
以下の設定では、”test1″ユーザであればbannerで「test1」という表記が、”root以外のユーザ(test1ユーザも該当する)”+LocalAddressが”172.28.0.118″であれば「ABCDEFG」という表記+パスワード認証が無効化されるのだが、実際に実行してみると…。

Match User test1
    Banner /etc/test1

Match User *,!root LocalAddress 172.28.0.118
    Banner /etc/test2
    PasswordAuthentication no
blacknon@BS-PUB-DEVELOP:~$ ssh test1@172.28.0.118
test1
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
blacknon@BS-PUB-DEVELOP:~$ ssh test2@172.28.0.118
ABCDEFG
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
blacknon@BS-PUB-DEVELOP:~$ ssh test1@172.20.100.118
test1
test1@172.20.100.118's password:
Last login: Thu Mar 30 10:44:55 2017 from bs-pub-develop
[test1@BS-PUB-CENT7-01 ~]$ exit
ログアウト
Connection to 172.20.100.118 closed.
blacknon@BS-PUB-DEVELOP:~$ ssh test2@172.20.100.118
test2@172.20.100.118's password:
Last login: Thu Mar 30 10:29:02 2017 from bs-pub-develop
[test2@BS-PUB-CENT7-01 ~]$

 

このように、2個目にMatchする条件についても適用されるので注意。
(設定項目がかぶってるのは1個目の条件が適用されるので、状況次第かとは思うが)

この他、条件指定時に%uで対象のユーザを、%hでユーザのホームディレクトリを指定できたりする。

 

設定例.アクセスのあったネットワークに応じてChrootDirectoryを切り替える(管理者用のユーザだけ除外)

設定例として、こんな感じに記述することで、アクセスのあったネットワークに応じてChrootDirectoryするディレクトリを切り替えさせることができる。
※この時、特定のユーザ(admin)だけはChrootDirectoryさせないようにする。

Match User *,!admin Address 172.28.0.*
    ChrootDirectory /opt/jail/master

Match User *,!admin Address 192.168.0.*
    ChrootDirectory /opt/jail/sub

 

設定例2.特定のユーザ+アクセス元ネットワークのみパスワード認証を許可

特定のユーザとアクセス元のネットワークの組み合わせのときのみ、パスワード認証を許可する場合。

PasswordAuthentication no

Match User admin Address 172.28.0.*
    PasswordAuthentication yes

 

色々なことに応用できそうだ。うまいこと使いこなしていきたい。

 

<参考:manの該当箇所>

Match

 Introduces a conditional block.  If all of the criteria on the Match line are satisfied, the keywords on the following lines override those set in the global section of the config file, until either another Match line or the end of the file.  If a keyword appears in multiple Match blocks that are satisified, only the first instance of the keyword is applied.

 The arguments to Match are one or more criteria-pattern pairs or the single token All which matches all criteria.  The available criteria are User, Group, Host, LocalAddress, LocalPort, and Address.  The match patterns may consist of single entries or comma-separated lists and may use the wildcard and negation operators described in the PATTERNS section of ssh_config(5).

 The patterns in an Address criteria may additionally contain addresses to match in CIDR address/masklen format, e.g. “192.0.2.0/24” or “3ffe:ffff::/32”.  Note that the mask length provided must be consistent with the address - it is an error to specify a mask length that is too long for the address or one with bits set in this host portion of the address.  For example, “192.0.2.0/33” and “192.0.2.0/8” respectively.

 Only a subset of keywords may be used on the lines following a Match keyword.  Available keywords are AcceptEnv, AllowAgentForwarding, AllowGroups, AllowTcpForwarding, AllowUsers, AuthenticationMethods,AuthorizedKeysCommand, AuthorizedKeysCommandUser, AuthorizedKeysFile, AuthorizedPrincipalsFile, Banner, ChrootDirectory, DenyGroups, DenyUsers, ForceCommand, GatewayPorts, GSSAPIAuthentication, HostbasedAuthentication,HostbasedUsesNameFromPacketOnly, KbdInteractiveAuthentication, KerberosAuthentication, KerberosUseKuserok, MaxAuthTries, MaxSessions, PasswordAuthentication, PermitEmptyPasswords, PermitOpen, PermitRootLogin,PermitTTY, PermitTunnel, PubkeyAuthentication, RekeyLimit, RhostsRSAAuthentication, RSAAuthentication, X11DisplayOffset, X11MaxDisplays, X11Forwarding and X11UseLocalHost.

 

【参考】

 

OpenSSH[実践]入門 (Software Design plus) OpenSSH[実践]入門 (Software Design plus)
Viewing all 498 articles
Browse latest View live