Quantcast
Channel: CentOS –俺的備忘録 〜なんかいろいろ〜

awkでOSのコマンドを実行させる

$
0
0

よくawkで処理中にOSのコマンドを実行させる事があるので、備忘で残しておく。

1.ただコマンドを実行させる

ただOSのコマンドを実行するだけで良いのであれば、system()を使用すればいい。

awk '{system("OSのコマンド")}'
blacknon@BS-PUB-UBUNTU-01:~$ cat test2.txt
a01 15652
a02 13411
a03 2597
a04 8083
a05 11068
a06 17737
a07 32745
a08 22546
a09 32608
a10 32074
a11 17574
a12 8745
a13 2201
a14 7521
a15 9968
a16 12236
a17 19420
a18 30606
a19 21637
a20 16093
blacknon@BS-PUB-UBUNTU-01:~$ cat test2.txt | awk '{system("echo "$2"|cut -c 1-3")}'
156
134
259
808
110
177
327
225
326
320
175
874
220
752
996
122
194
306
216
160

 

ただ、このやり方だと残念ながら実行結果をawk内の変数に代入できず(exit codeが代入されてしまう)、かつprintでも扱えない(指定するとexit codeがprintされてしまう)。

blacknon@BS-PUB-UBUNTU-01:~$ cat test2.txt | head | awk '{print $1,system("echo "$2"|cut -c 1-3")}'
156
a01 0
134
a02 0
259
a03 0
808
a04 0
110
a05 0
177
a06 0
327
a07 0
225
a08 0
326
a09 0
320
a10 0

 

また、こちらを見ると入出力streamを開いてしまうので、実行時に明示的にcloseしてやらないとファイルディスクリプタを消費してしまう様子。

2.コマンドの実行結果をawk内で変数に代入する

awkからOSのコマンドを実行し、その結果を変数に代入する場合、以下のようにgetlineを利用する。

awk '{"OSのコマンド" | getline var}' # 変数varにOSコマンドの実行結果が代入される
blacknon@BS-PUB-UBUNTU-01:~$ cat test2.txt | head | awk '{"echo "$2"|cut -c 1-3" | getline t;print $1,t}'
a01 156
a02 134
a03 259
a04 808
a05 110
a06 177
a07 327
a08 225
a09 326
a10 320

 

なお、OSコマンドの実行結果が複数行になる場合、変数に代入されるのは最初の1行だけになるようなので、そこは注意が必要になるようだ。
複数行が必要になる場合、OSコマンドの実行結果は一行にし、あとでawk内で分解して扱うのが良さそうだ。

blacknon@BS-PUB-UBUNTU-01:~$ cat test2.txt | head | awk '{"echo "$2"|cut -c 1-3|grep -o ." | getline t;print $1,t,length(t)}'
a01 1 1
a02 1 1
a03 2 1
a04 8 1
a05 1 1
a06 1 1
a07 3 1
a08 2 1
a09 3 1
a10 3 1

 

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

awkのワンライナーでシングルクォーテーションを使いたいときのエスケープ等の回避方法4個

$
0
0

awkをワンライナーで使っていると、処理の中でシングルクォーテーションを使いたいときが多々ある。
ただ、処理をシングルクォーテーションで囲っている場合、うまくエスケープするには工夫が必要だったりでちょっと面倒くさい。ので、エスケープ以外にもうまいことシングルクォーテーションを利用する方法が無いかと思って調べてみた。

1.エスケープする

エスケープをしてシングルクォーテーションを利用する場合は、以下の例のようにダブルクォーテーションで「’\”」としてエスケープしたシングルクォーテーションを囲ってやると利用できる。

awk '{print "'\''"}'
blacknon@BS-PUB-UBUNTU-01:~$ echo -e "abc 123\ndef 456" | awk '{print $1"'\''"$2}'
abc'123
def'456

2.ダブルクォーテーションで囲む

「$」をエスケープする必要が出て来るが、awkの処理をシングルクォーテーションではなくダブルクォーテーションで囲むことで、シングルクォーテーションをそのまま使用できるようにする。
ただ、その際もダブルクォーテーションで囲む必要があるのでだいぶ野暮ったくなる。

awk "{print\"'\"}"
blacknon@BS-PUB-UBUNTU-01:~$ echo -e "abc 123\ndef 456" | awk "{print \$1\"'\"\$2}"
abc'123
def'456

3.変数に代入する

awk実行時に変数にシングルクォーテーションを代入しておくことで、処理内でエスケープせずに利用する。
以下の例では、変数「q」にシングルクォーテーションを代入している。

awk -v q=\' '{print q}'
awk '{print q}' q=\'
blacknon@BS-PUB-UBUNTU-01:~$ echo -e "abc 123\ndef 456" | awk -v q=\' '{print $1q$2}'
abc'123
def'456
blacknon@BS-PUB-UBUNTU-01:~$ echo -e "abc 123\ndef 456" | awk '{print $1q$2}' q=\'
abc'123
def'456

4.アスキーコードで指定する

シングルクォーテーションをアスキーコードで指定することで対応することも可能。

awk '{print "\x27"}'
awk '{print "\047"}'
blacknon@BS-PUB-UBUNTU-01:~$ echo -e "abc 123\ndef 456" | awk '{print $1"\x27"$2}'
abc'123
def'456
blacknon@BS-PUB-UBUNTU-01:~$ echo -e "abc 123\ndef 456" | awk '{print $1"\047"$2}'
abc'123
def'456

 

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

linkcheckerでログインが必要なページのリンクチェックを行う

$
0
0

前にここで書いたlinkcheckerでログインの必要なページでのリンクチェックが必要になったのだが、どうもCookieを使って接続をしてもうまくログインできなかった。
で、linkcheckerrcにログイン情報を記述して読み込ませることで対応できるようなので、以下備忘で残しておく。

まず、以下のような内容で任意のPATHにlinkcheckerrcファイルを作成する。

●linkcheckerrc

[authentication]
entry=.* ユーザID パスワード
loginurl=https://LoginページURL
loginuserfield=ユーザIDの入力ラベル
loginpasswordfield=パスワードの入力ラベル

ファイルを作成したら、以下のようにlinkcheckerコマンドを実行してやることで、linkcheckerrcファイルを読み込んで処理が行われる。

linkchecker -f ./linkcheckerrcファイルPATH http://ターゲットURL

 

【参考】

 

科学技術計算のためのPython入門 ――開発基礎、必須ライブラリ、高速化 科学技術計算のためのPython入門 ――開発基礎、必須ライブラリ、高速化

awkで特定の列を集計して各行のパーセント列を追加して表示する

$
0
0

awkで、特定の列を集計してパーセントを計算した列を追加したいということがあったので、備忘で残しておく。
以下のように、ファイルを2回読み込ませてやり、1回目に集計処理を、2回目に読み込む際にパーセント列の計算をすることで実現できる。

awk 'NR==FNR{a=a+$2;next}{p=$2/a*100;print $0,p"%"}' file file
blacknon@BS-PUB-DEVELOP:~$ cat test2.list
a 4799
b 29975
c 29188
d 31047
e 11659
f 7653
g 19850
h 16754
i 16512
j 15015
k 26007
blacknon@BS-PUB-DEVELOP:~$ # 2列目の内容を集計して3列目にパーセントを表示
blacknon@BS-PUB-DEVELOP:~$ awk 'NR==FNR{a=a+$2;next}{p=$2/a*100;print $0,p"%"}' test2.list test2.list
a 4799 2.30213%
b 29975 14.3793%
c 29188 14.0018%
d 31047 14.8936%
e 11659 5.59295%
f 7653 3.67123%
g 19850 9.52226%
h 16754 8.03707%
i 16512 7.92098%
j 15015 7.20286%
k 26007 12.4758%
blacknon@BS-PUB-DEVELOP:~$ # 見やすく整形する
blacknon@BS-PUB-DEVELOP:~$ awk 'NR==FNR{a=a+$2;next}{p=$2/a*100;print $0,p"%"}' test2.list test2.list | column -t
a  4799   2.30213%
b  29975  14.3793%
c  29188  14.0018%
d  31047  14.8936%
e  11659  5.59295%
f  7653   3.67123%
g  19850  9.52226%
h  16754  8.03707%
i  16512  7.92098%
j  15015  7.20286%
k  26007  12.4758%

で、上記方法だとファイルの読み込みがキモになっているのだが、パイプから受け付けた内容に対してパーセント列を追加するにはどうすればいいのだろうか。
標準入力は一度読み込むと消えてしまうので、()で括ってやって変数に代入する方法を取ることで対応できる。

cat file |(s=$(cat)&&awk 'NR==FNR{a=a+$2;next}{p=$2/a*100;print $0,p"%"}' <(echo -e "$s") <(echo -e "$s"))
blacknon@BS-PUB-DEVELOP:~$ cat test2.list |(s=$(cat)&&awk 'NR==FNR{a=a+$2;next}{p=$2/a*100;print $0,p"%"}' <(echo -e "$s") <(echo -e "$s"))
a 4799 2.30213%
b 29975 14.3793%
c 29188 14.0018%
d 31047 14.8936%
e 11659 5.59295%
f 7653 3.67123%
g 19850 9.52226%
h 16754 8.03707%
i 16512 7.92098%
j 15015 7.20286%
k 26007 12.4758%
blacknon@BS-PUB-DEVELOP:~$ cat test2.list |(s=$(cat)&&awk 'NR==FNR{a=a+$2;next}{p=$2/a*100;print $0,p"%"}' <(echo -e "$s") <(echo -e "$s")) | column -t
a  4799   2.30213%
b  29975  14.3793%
c  29188  14.0018%
d  31047  14.8936%
e  11659  5.59295%
f  7653   3.67123%
g  19850  9.52226%
h  16754  8.03707%
i  16512  7.92098%
j  15015  7.20286%
k  26007  12.4758%
blacknon@BS-PUB-DEVELOP:~$ # ついでに最終行に集計行を出力
blacknon@BS-PUB-DEVELOP:~$ cat test2.list |(s=$(cat)&&awk 'NR==FNR{a=a+$2;next}{p=$2/a*100;print $0,p"%"}END{print "TOTAL",a,"100%"}' <(echo -e "$s") <(echo -e "$s")) | column -t
a      4799    2.30213%
b      29975   14.3793%
c      29188   14.0018%
d      31047   14.8936%
e      11659   5.59295%
f      7653    3.67123%
g      19850   9.52226%
h      16754   8.03707%
i      16512   7.92098%
j      15015   7.20286%
k      26007   12.4758%
TOTAL  208459  100%

 

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

LinuxでディスクがHDDかSSDか確認する

$
0
0

ふと、Linuxで使用しているディスクがHDDかSSDか知りたいということがあったので、備忘で残しておく。

1.「/sys/block/sdX/queue/rotational」から確認する

「/sys/block/sdX/queue/rotational」を確認することで、対象のデバイスがディスクかどうか→HDDかSSDかを確認する事ができるようだ。
返り値が1の場合HDD、0の場合はSSDを使用している事になる。

[blacknon@blacknon-ThinkPad-X201]% ~(`・ω・´)  < cat /sys/block/sda/queue/rotational
0

blacknon@BS-PUB-UBUNTU-01:~$ cat /sys/block/sda/queue/rotational
1

2.lshwを用いる

lshwコマンドを使うことで、ディスクの型番も取得できる。

sudo lshw -c disk

[blacknon@blacknon-ThinkPad-X201]% ~(`・ω・´)  < sudo lshw -c disk
  *-disk
       詳細: ATA Disk
       製品: M4-CT128M4SSD2
       物理ID: 0.0.0
       バス情報: scsi@0:0.0.0
       論理名: /dev/sda
       バージョン: 0309
       シリアル: 00000000113303171A37
       サイズ: 119GiB (128GB)
       性能: partitioned partitioned:dos
       設定: ansiversion=5 logicalsectorsize=512 sectorsize=512 signature=977c437e

3.lsblkを用いる

lsblkコマンドを用いることで、「rotational」を確認することができる。

lsblk -o name,rota
[blacknon@blacknon-ThinkPad-X201]% ~(`・ω・´)  < lsblk -o name,rota
NAME                    ROTA
sda                        0
├─sda1                     0
├─sda2                     0
└─sda5                     0
  └─sda5_crypt             0
    ├─ubuntu--vg-root      0
    └─ubuntu--vg-swap_1    0
      └─cryptswap1         0

blacknon@BS-PUB-UBUNTU-01:~$ lsblk -o name,rota
NAME                                ROTA
sda                                    1
├─sda1                                 1
├─sda2                                 1
└─sda5                                 1
  ├─BS--PUB--CENTOS7--01--vg-root      1
  └─BS--PUB--CENTOS7--01--vg-swap_1    1
sr0                                    1

 

 

Crucial [Micron製] 内蔵SSD 2.5インチ MX300 525GB ( 3D TLC NAND /SATA 6Gbps /3年保証 )国内正規品 CT525MX300SSD1/JP Crucial [Micron製] 内蔵SSD 2.5インチ MX300 525GB ( 3D TLC NAND /SATA 6Gbps /3年保証 )国内正規品 CT525MX300SSD1/JP

ファイルや標準入力を指定行数で分割して、ファイルへの出力なしに分割した結果ごとに特定のコマンドを実行させる

$
0
0

ファイルや標準入力を指定行数で分割して、かつそれをそのまま(一時ファイルを作成せずに)次のコマンドに渡したいといったことがある。
例えば、以下のようなファイルがあったとして、5行ごとに合計を集計するといった処理をしたいとする。

blacknon@BS-PUB-DEVELOP:~$ cat test3.list
a01 13320
a02 64
a03 29730
a04 28184
a05 8993
b01 32490
b02 29077
b03 29590
b04 1291
b05 14097
c01 17676
c02 7998
c03 9720
c04 30072
c05 7565
d01 9220
d02 15714
d03 32185
d04 314
d05 10646
e01 29518
e02 15859
e03 10968
e04 30595
e05 27261

この場合、LinuxであればGNU拡張されたsplitコマンドが入っていると思う(Macではcore-utilsを入れればgsplitコマンドで使える)ので、「–filter=”コマンド”」を使用することで、ファイルを分割せずにそのまま次のコマンドに渡す事ができる。
上記の処理をするなら、以下のようにsplitコマンドで–filterからawkを呼び出してやればいい。

cat test3.list | split -l 5 --filter="awk '{a+=\$2;print \$0}END{print \"TOTAL\",a}';echo --------"
blacknon@BS-PUB-DEVELOP:~$ cat test3.list | split -l 5 --filter="awk '{a+=\$2;print \$0}END{print \"TOTAL\",a}';echo --------"
a01 13320
a02 64
a03 29730
a04 28184
a05 8993
TOTAL 80291
--------
b01 32490
b02 29077
b03 29590
b04 1291
b05 14097
TOTAL 106545
--------
c01 17676
c02 7998
c03 9720
c04 30072
c05 7565
TOTAL 73031
--------
d01 9220
d02 15714
d03 32185
d04 314
d05 10646
TOTAL 68079
--------
e01 29518
e02 15859
e03 10968
e04 30595
e05 27261
TOTAL 114201
--------

 

ちなみに、splitコマンドを使わない場合について考えてみたのだが、以下のようなだいぶ無理やりな処理しか思いつかなかった。
ファイルの読み込みが2箇所あるし、あまりいい手法ではなさそうだ。

eval echo {1..$(cat test3.list|wc -l)..5} | xargs -n1 | xargs -I@ bash -c 'i=@;e=$(( @ + 5 - 1));sed -n "$i,$e p" test3.list|awk "{a+=\$2;print \$0}END{print \"TOTAL\",a}";echo ========'
blacknon@BS-PUB-DEVELOP:~$ eval echo {1..$(cat test3.list|wc -l)..5} | xargs -n1 | xargs -I@ bash -c 'i=@;e=$(( @ + 5 - 1));sed -n "$i,$e p" test3.list|awk "{a+=\$2;print \$0}END{print \"TOTAL\",a}";echo ========'
a01 13320
a02 64
a03 29730
a04 28184
a05 8993
TOTAL 80291
========
b01 32490
b02 29077
b03 29590
b04 1291
b05 14097
TOTAL 106545
========
c01 17676
c02 7998
c03 9720
c04 30072
c05 7565
TOTAL 73031
========
d01 9220
d02 15714
d03 32185
d04 314
d05 10646
TOTAL 68079
========
e01 29518
e02 15859
e03 10968
e04 30595
e05 27261
TOTAL 114201
========

 

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

コンソール上でImageMagickを使って画像ファイルのEXIF情報を取得する

$
0
0

あまり写真とか取らないのだけど、ふとLinuxのコンソール上で画像データのEXIF情報を取得するにはどうすれば良いのかなと思ったので調べてみたところ、ImageMagickを使ってやることで、コンソール上からファイルのEXIF情報を取得・削除といった事が可能なようだ。
ImageMagickは、CentOSならyum、Ubuntuであればaptからインストールができる。

sudo apt install imagemagick
sudo yum install ImageMagick

EXIF情報を確認する

インストール後、以下のコマンドでファイルのEXIF情報を取得することができる。
今回は、手元にEXIF情報のあるファイルがないのでこちらのサンプル画像を利用させてもらった。

identify -verbose ファイルPATH
[root@BS-PUB-CENT7-01 ~]# wget http://www.ksky.ne.jp/~yamama/jpggpsmap/sample/AkihabaraKousaten.JPG
--2017-08-06 04:43:36--  http://www.ksky.ne.jp/~yamama/jpggpsmap/sample/AkihabaraKousaten.JPG
www.ksky.ne.jp (www.ksky.ne.jp) をDNSに問いあわせています... 210.233.190.84
www.ksky.ne.jp (www.ksky.ne.jp)|210.233.190.84|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 548570 (536K) [image/jpeg]
`AkihabaraKousaten.JPG' に保存中

100%[===================================================================================================================================================================================================>] 548,570     --.-K/s 時間 0.05s

2017-08-06 04:43:36 (11.4 MB/s) - `AkihabaraKousaten.JPG' へ保存完了 [548570/548570]

[root@BS-PUB-CENT7-01 ~]# identify -verbose ./AkihabaraKousaten.JPG
Image: ./AkihabaraKousaten.JPG
  Format: JPEG (Joint Photographic Experts Group JFIF format)
  Class: DirectClass
  Geometry: 1200x1600+0+0
  Resolution: 72x72
  Print size: 16.6667x22.2222
  Units: PixelsPerInch
  Type: TrueColor
  Endianess: Undefined
  Colorspace: sRGB
  Depth: 8-bit
  Channel depth:
    red: 8-bit
    green: 8-bit
    blue: 8-bit
  Channel statistics:
    Red:
      min: 0 (0)
      max: 255 (1)
      mean: 92.9754 (0.364609)
      standard deviation: 62.7977 (0.246266)
      kurtosis: 0.812823
      skewness: 1.30089
    Green:
      min: 0 (0)
      max: 255 (1)
      mean: 94.5935 (0.370955)
      standard deviation: 64.6191 (0.253408)
      kurtosis: 0.690189
      skewness: 1.36728
    Blue:
      min: 0 (0)
      max: 255 (1)
      mean: 104.32 (0.409098)
      standard deviation: 68.8523 (0.270009)
      kurtosis: -0.114506
      skewness: 1.09011
  Image statistics:
    Overall:
      min: 0 (0)
      max: 255 (1)
      mean: 97.2963 (0.381554)
      standard deviation: 65.4722 (0.256754)
      kurtosis: 0.464047
      skewness: 1.26142
  Rendering intent: Perceptual
  Gamma: 0.454545
  Chromaticity:
    red primary: (0.64,0.33)
    green primary: (0.3,0.6)
    blue primary: (0.15,0.06)
    white point: (0.3127,0.329)
  Interlace: None
  Background color: white
  Border color: srgb(223,223,223)
  Matte color: grey74
  Transparent color: black
  Compose: Over
  Page geometry: 1200x1600+0+0
  Dispose: Undefined
  Iterations: 0
  Compression: JPEG
  Quality: 92
  Orientation: Undefined
  Properties:
    date:create: 2017-08-06T04:43:36+09:00
    date:modify: 2008-07-09T22:31:13+09:00
    exif:ApertureValue: 30/10
    exif:BrightnessValue: -1/-1
    exif:ColorSpace: 1
    exif:ComponentsConfiguration: 1, 2, 3, 0
    exif:Compression: 6
    exif:Contrast: 0
    exif:CustomRendered: 0
    exif:DateTime: 2008:07:04 21:01:52
    exif:DateTimeDigitized: 2008:07:04 21:01:52
    exif:DateTimeOriginal: 2008:07:04 21:01:52
    exif:DigitalZoomRatio: 100/100
    exif:ExifImageLength: 1600
    exif:ExifImageWidth: 1200
    exif:ExifOffset: 350
    exif:ExifVersion: 48, 50, 50, 48
    exif:ExposureMode: 0
    exif:Flash: 24
    exif:FlashPixVersion: 48, 49, 48, 48
    exif:FNumber: 30/10
    exif:FocalLength: 477/100
    exif:FocalLengthIn35mmFilm: 28
    exif:GPSInfo: 660
    exif:GPSLatitude: 35/1, 41/1, 5920/100
    exif:GPSLatitudeRef: N
    exif:GPSLongitude: 139/1, 46/1, 1812/100
    exif:GPSLongitudeRef: E
    exif:GPSMapDatum: WGS-84
    exif:GPSVersionID: 2, 2, 0, 0
    exif:ImageDescription: SA390017
    exif:JPEGInterchangeFormat: 888
    exif:JPEGInterchangeFormatLength: 6623
    exif:LightSource: 0
    exif:Make: KDDI-SA
    exif:MaxApertureValue: 30/10
    exif:MeteringMode: 1
    exif:Model: W51SA
    exif:ResolutionUnit: 2
    exif:Saturation: 0
    exif:SceneCaptureType: 0
    exif:SceneType: 1
    exif:Sharpness: 0
    exif:SubjectDistance: 0/0
    exif:SubjectDistanceRange: 0
    exif:WhiteBalance: 0
    exif:XResolution: 72/1
    exif:YCbCrPositioning: 1
    exif:YResolution: 72/1
    jpeg:colorspace: 2
    jpeg:sampling-factor: 1x2,1x1,1x1
    signature: ed4f58a3429273fc4d64fe40d616bf77b0805723db5170a16684fafba37f8fb3
    unknown: 65, 83, 67, 73, 73, 0, 0, 0, 71, 80, 83, 45, 70, 73, 88
  Profiles:
    Profile-exif: 7517 bytes
  Artifacts:
    filename: ./AkihabaraKousaten.JPG
    verbose: true
  Tainted: False
  Filesize: 549KB
  Number pixels: 1.92M
  Pixels per second: 64MB
  User time: 0.040u
  Elapsed time: 0:01.030
  Version: ImageMagick 6.7.8-9 2016-06-16 Q16 http://www.imagemagick.org
[root@BS-PUB-CENT7-01 ~]# identify -verbose ./AkihabaraKousaten.JPG | grep 'exif:'
    exif:ApertureValue: 30/10
    exif:BrightnessValue: -1/-1
    exif:ColorSpace: 1
    exif:ComponentsConfiguration: 1, 2, 3, 0
    exif:Compression: 6
    exif:Contrast: 0
    exif:CustomRendered: 0
    exif:DateTime: 2008:07:04 21:01:52
    exif:DateTimeDigitized: 2008:07:04 21:01:52
    exif:DateTimeOriginal: 2008:07:04 21:01:52
    exif:DigitalZoomRatio: 100/100
    exif:ExifImageLength: 1600
    exif:ExifImageWidth: 1200
    exif:ExifOffset: 350
    exif:ExifVersion: 48, 50, 50, 48
    exif:ExposureMode: 0
    exif:Flash: 24
    exif:FlashPixVersion: 48, 49, 48, 48
    exif:FNumber: 30/10
    exif:FocalLength: 477/100
    exif:FocalLengthIn35mmFilm: 28
    exif:GPSInfo: 660
    exif:GPSLatitude: 35/1, 41/1, 5920/100
    exif:GPSLatitudeRef: N
    exif:GPSLongitude: 139/1, 46/1, 1812/100
    exif:GPSLongitudeRef: E
    exif:GPSMapDatum: WGS-84
    exif:GPSVersionID: 2, 2, 0, 0
    exif:ImageDescription: SA390017
    exif:JPEGInterchangeFormat: 888
    exif:JPEGInterchangeFormatLength: 6623
    exif:LightSource: 0
    exif:Make: KDDI-SA
    exif:MaxApertureValue: 30/10
    exif:MeteringMode: 1
    exif:Model: W51SA
    exif:ResolutionUnit: 2
    exif:Saturation: 0
    exif:SceneCaptureType: 0
    exif:SceneType: 1
    exif:Sharpness: 0
    exif:SubjectDistance: 0/0
    exif:SubjectDistanceRange: 0
    exif:WhiteBalance: 0
    exif:XResolution: 72/1
    exif:YCbCrPositioning: 1
    exif:YResolution: 72/1
    Profile-exif: 7517 bytes

 

上記コマンドだと大量のデータが取得されるため、必要な箇所(カメラなどのモデルや緯度、経度といったGPS情報)のみを表示させる場合は、以下のようにformatを指定してやればいい。

identify -format "Make:%[EXIF:Make]\nModel:%[EXIF:Model]\nDate:%[EXIF:DateTime]\n緯度:%[EXIF:GPSLatitude]\n経度:%[EXIF:GPSLongitude]" ファイルPATH
[root@BS-PUB-CENT7-01 ~]# identify -format "Make:%[EXIF:Make]\nModel:%[EXIF:Model]\nDate:%[EXIF:DateTime]\n緯度:%[EXIF:GPSLatitude]\n経度:%[EXIF:GPSLongitude]" ./AkihabaraKousaten.JPG
Make:KDDI-SA
Model:W51SA
Date:2008:07:04 21:01:52
緯度:35/1, 41/1, 5920/100
経度:139/1, 46/1, 1812/100

EXIF情報を削除する

EXIF情報を削除する場合、convertコマンドで別のファイルに書き出すか、もしくはmogrifyコマンドで直接ファイルを変更することが可能だ。

convert -strip 元ファイル コピー先ファイル
[root@BS-PUB-CENT7-01 ~]# convert -strip ./AkihabaraKousaten.JPG ./AkihabaraKousaten.JPG.strip
[root@BS-PUB-CENT7-01 ~]# identify -verbose ./AkihabaraKousaten.JPG.strip
Image: ./AkihabaraKousaten.JPG.strip
  Format: JPEG (Joint Photographic Experts Group JFIF format)
  Class: DirectClass
  Geometry: 1200x1600+0+0
  Resolution: 72x72
  Print size: 16.6667x22.2222
  Units: PixelsPerInch
  Type: TrueColor
  Endianess: Undefined
  Colorspace: sRGB
  Depth: 8-bit
  Channel depth:
    red: 8-bit
    green: 8-bit
    blue: 8-bit
  Channel statistics:
    Red:
      min: 0 (0)
      max: 255 (1)
      mean: 92.9628 (0.36456)
      standard deviation: 62.8308 (0.246395)
      kurtosis: 0.809192
      skewness: 1.29937
    Green:
      min: 0 (0)
      max: 255 (1)
      mean: 94.58 (0.370902)
      standard deviation: 64.61 (0.253373)
      kurtosis: 0.688694
      skewness: 1.36622
    Blue:
      min: 0 (0)
      max: 255 (1)
      mean: 104.273 (0.408912)
      standard deviation: 68.8235 (0.269896)
      kurtosis: -0.116854
      skewness: 1.08713
  Image statistics:
    Overall:
      min: 0 (0)
      max: 255 (1)
      mean: 97.2718 (0.381458)
      standard deviation: 65.4697 (0.256744)
      kurtosis: 0.460821
      skewness: 1.2593
  Rendering intent: Perceptual
  Gamma: 0.454545
  Chromaticity:
    red primary: (0.64,0.33)
    green primary: (0.3,0.6)
    blue primary: (0.15,0.06)
    white point: (0.3127,0.329)
  Interlace: None
  Background color: white
  Border color: srgb(223,223,223)
  Matte color: grey74
  Transparent color: black
  Compose: Over
  Page geometry: 1200x1600+0+0
  Dispose: Undefined
  Iterations: 0
  Compression: JPEG
  Quality: 92
  Orientation: Undefined
  Properties:
    date:create: 2017-08-06T05:12:41+09:00
    date:modify: 2017-08-06T05:12:41+09:00
    jpeg:colorspace: 2
    jpeg:sampling-factor: 1x2,1x1,1x1
    signature: ac1086147cdc50ba6dede52f12f1c135a26da23717bf44955166f8274634ef28
  Artifacts:
    filename: ./AkihabaraKousaten.JPG.strip
    verbose: true
  Tainted: False
  Filesize: 434KB
  Number pixels: 1.92M
  Pixels per second: 48MB
  User time: 0.040u
  Elapsed time: 0:01.039
  Version: ImageMagick 6.7.8-9 2016-06-16 Q16 http://www.imagemagick.org
[root@BS-PUB-CENT7-01 ~]# mogrify -strip ./AkihabaraKousaten.JPG
[root@BS-PUB-CENT7-01 ~]# identify -verbose ./AkihabaraKousaten.JPG
Image: ./AkihabaraKousaten.JPG
  Format: JPEG (Joint Photographic Experts Group JFIF format)
  Class: DirectClass
  Geometry: 1200x1600+0+0
  Resolution: 72x72
  Print size: 16.6667x22.2222
  Units: PixelsPerInch
  Type: TrueColor
  Endianess: Undefined
  Colorspace: sRGB
  Depth: 8-bit
  Channel depth:
    red: 8-bit
    green: 8-bit
    blue: 8-bit
  Channel statistics:
    Red:
      min: 0 (0)
      max: 255 (1)
      mean: 92.9628 (0.36456)
      standard deviation: 62.8308 (0.246395)
      kurtosis: 0.809192
      skewness: 1.29937
    Green:
      min: 0 (0)
      max: 255 (1)
      mean: 94.58 (0.370902)
      standard deviation: 64.61 (0.253373)
      kurtosis: 0.688694
      skewness: 1.36622
    Blue:
      min: 0 (0)
      max: 255 (1)
      mean: 104.273 (0.408912)
      standard deviation: 68.8235 (0.269896)
      kurtosis: -0.116854
      skewness: 1.08713
  Image statistics:
    Overall:
      min: 0 (0)
      max: 255 (1)
      mean: 97.2718 (0.381458)
      standard deviation: 65.4697 (0.256744)
      kurtosis: 0.460821
      skewness: 1.2593
  Rendering intent: Perceptual
  Gamma: 0.454545
  Chromaticity:
    red primary: (0.64,0.33)
    green primary: (0.3,0.6)
    blue primary: (0.15,0.06)
    white point: (0.3127,0.329)
  Interlace: None
  Background color: white
  Border color: srgb(223,223,223)
  Matte color: grey74
  Transparent color: black
  Compose: Over
  Page geometry: 1200x1600+0+0
  Dispose: Undefined
  Iterations: 0
  Compression: JPEG
  Quality: 92
  Orientation: Undefined
  Properties:
    date:create: 2017-08-06T05:19:13+09:00
    date:modify: 2017-08-06T05:19:13+09:00
    jpeg:colorspace: 2
    jpeg:sampling-factor: 1x2,1x1,1x1
    signature: ac1086147cdc50ba6dede52f12f1c135a26da23717bf44955166f8274634ef28
  Artifacts:
    filename: ./AkihabaraKousaten.JPG
    verbose: true
  Tainted: False
  Filesize: 434KB
  Number pixels: 1.92M
  Pixels per second: 64MB
  User time: 0.020u
  Elapsed time: 0:01.029
  Version: ImageMagick 6.7.8-9 2016-06-16 Q16 http://www.imagemagick.org

 

Canon デジタル一眼レフカメラ EOS Kiss X7 ダブルズームキット EF-S18-55mm/EF-S55-250mm付属 KISSX7-WKIT Canon デジタル一眼レフカメラ EOS Kiss X7 ダブルズームキット EF-S18-55mm/EF-S55-250mm付属 KISSX7-WKIT

コンソール上でリストから選択してsystemdの管理が行える『Chkservice』

$
0
0

調べ物をしていたところ、コンソール上でsystemdの内容をリスト表示し、そこから選択して管理が行えるTUIのツール『Chkservice』なるツールを見かけたので、試しに入れてみることにした。

1.インストール

Ubuntuの場合はリポジトリが用意されているようなので、そちらからインストールができる。

●Ubuntuの場合

sudo add-apt-repository ppa:linuxenko/chkservice
sudo apt-get update
sudo apt-get install chkservice

 

CentOSなどにインストールする場合は、以下のようにコマンドを実行しコンパイルする必要がある(Fedoraの場合、dnfが使えるようであればそちらからインストールが可能)。
systemd-develやらncurse、ncurse-develなど結構色々と求められるので注意。

git clone https://github.com/linuxenko/chkservice.git
cd chkservice
mkdir build && cd build
cmake ../
make

 

rpmファイルであればすでにコンパイル済のものがあるようなので、それをインストールするというのも良さそうだ。
ここでは、最もテストがされていそうなUbuntuで進めていく。

2.実際に使ってみる

それでは実際に使ってみよう。
以下のようにコマンドを実行する。実行すると、以下の画面のようにsystemdの内容がリストで表示されるようになる。

sudo chkservice

 

?キーを押下することで操作方法が表示される。

 

あとは、リストから選択してサービスの有効/無効や起動/停止を行えばいい。
ちょっと触っただけだが、バージョンが0.1だけど結構良さげな感じ。

 

インフラエンジニアの教科書2 スキルアップに効く技術と知識 インフラエンジニアの教科書2 スキルアップに効く技術と知識

sshとsslを443ポートで同居させる『sslh』を使ってみる

$
0
0

sshというと22番ポートを利用するものだが、環境によっては利用できない事がある。
で、そういった場合だと443番ポート(SSL)を利用する場合が多いのだが、Webサーバなんかの場合だとすでにhttpsで使用している場合が多い。そんなとき、sshとsslを443番ポートで同居させて、それぞれのパケットのときは適切に割り振りをしてくれるリバースプロキシのような動作をしてくれるのが『SSLH』になる。

1.インストール

CentOSやDebian系のOSを使っている場合は簡単で、yum(epelが必要)やaptからインストールが可能だ。

●Debian/Ubuntu系の場合

sudo apt install sslh

 

●CentOSの場合

sudo yum install epel-release
sudo yum install sslh

2.設定する

インストールできたら、諸々の設定を行う。
まず、Webサーバ側で443番ポートを127.0.0.1にのみ許可してやり、外部からアクセス時の443ポートを開放してやる。
以下、Nginx or Apacheでの設定ファイル別での記述(Apacheの場合はVirtualHostで設定する方がいいだろう)。

●Nginxの場合(ex:/etc/nginx/nginx.conf)

#listen 443 ssl;
listen 127.0.0.1:443 ssl;

●Apacheの場合(ex:/etc/httpd/conf.d/ssl.conf)

#Listen 443 https
Listen 127.0.0.1:443 https

 

Webサーバ側の設定が終わったら、sslhの設定を行う。
過去のバージョンから設定ファイルが変わったようで、jsonっぽい書き方になっているようだ。
「/etc/sslh.cfg」で、listenするhostに受付をするインターフェイスのIPアドレスやホスト名を入力する。

...
# Change hostname with your external address name.
listen:
(
    { host: "IPアドレス"; port: "443"; }
);
...

 

設定ファイル編集後は、systemctlでサービスを起動してやればいい。

systemctl enable sslh
systemctl start sslh

 

設定完了後、443ポートでhttpsとsslがそれぞれ利用できることを確認する。
デフォルトの状態だとhttpも443で利用できてしまうので、不要であれば上記設定ファイルで記述を削除しておくといいだろう。

 

プロフェッショナルSSL/TLS プロフェッショナルSSL/TLS

CentOS7へKeycloakをsystemdで起動、停止できるようにインストールする

$
0
0

だいぶ前に、CentOS 7にKeycloakをインストールして触ってみるということをしていたが、今回はちゃんとsystemdで管理できるようにインストールをしてみる。
基本的なインストール方法は変わらないが、一応事前準備から進めていく。

1.事前準備

前回と変わらず、以下のコマンドを実行して実行ユーザの作成や必要となるパッケージを導入しておく。

useradd keycloak
yum install -y git wget

 

動作にMavenが必要になるので、それらをインストールする。
まずはOracle JDKのインストールを行う。

wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u152-b16/aa0333dd3019491ca4f6ddbe78cdb6d0/jdk-8u152-linux-x64.rpm
rpm -ihv jdk-8u152-linux-x64.rpm

 

次に、Mavenのインストール。
作業中に実行ユーザに切り替えて、PATHを通しておく。

cd /opt
wget http://ftp.riken.jp/net/apache/maven/maven-3/3.5.0/binaries/apache-maven-3.5.0-bin.tar.gz
tar xzvf apache-maven-3.5.0-bin.tar.gz
mv apache-maven{-3.5.0,}
su - keycloak
cat << "EOF" >> ~/.bash_profile
export JAVA_HOME=/usr/java/default/
export PATH=$PATH:/opt/apache-maven/bin
EOF
. ~/.bash_profile

 

これで事前準備は完了。

2.Keycloakをインストール、起動する(http)

事前準備が終わったら、Keycloakをインストールする。
まずはhttpで接続できることを確認する。

wget https://downloads.jboss.org/keycloak/3.4.0.Final/keycloak-3.4.0.Final.tar.gz
tar xzvf keycloak-*.tar.gz
mv keycloak-*/ keycloak
cd keycloak
sed -i.bk '{s/127.0.0.1/'$(hostname -i)'/g}' standalone/configuration/standalone.xml

 

ひとまず、この段階で一時的にfirewalldを切ってKeycloakを起動させてみる。

exit
sudo systemctl stop firewalld
su - keycloak
cd /opt/keycloak
bin/add-user-keycloak.sh -u admin -p P@ssw0rd
bin/standalone.sh -b 0.0.0.0

 

Keycloakサーバにアクセスし、ログイン画面が表示されること、追加したユーザでログインできることが確認できたらOK。
firewallについては後ほどポートを指定するので、今はこのままにする。

3.serviceファイルを作成してsystemdで起動、停止を行えるようにする

rootに切り替えて、先程展開したファイル類を/opt配下に移動する。また、Keycloak用のログ出力先ディレクトリを作成しておく。

mv /home/keycloak/keycloak /opt/
mkdir /var/log/keycloak

 

移動後、systemdで管理できるように.serviceファイルを作成する。

/etc/systemd/system/keycloak.service

[Unit]
Description=Jboss Application Server
After=network.target

[Service]
Type=idle
Environment=JBOSS_HOME=/opt/keycloak JBOSS_LOG_DIR=/var/log/keycloak "JAVA_OPTS=-Xms1024m -Xmx20480m -XX:MaxPermSize=768m"
User=keycloak
Group=keycloak
ExecStart=/opt/keycloak/bin/standalone.sh
TimeoutStartSec=600
TimeoutStopSec=600

[Install]
WantedBy=multi-user.target

 

.serviceファイル作成後、以下のようにsystemdからKeycloakを起動する。
(起動に失敗した場合は、一度SELinuxを無効にして再度試してみる(起動後にちゃんと有効にしなおすのを忘れずに))

systemctl start keycloak

 

起動後、ブラウザから管理画面にアクセスできることを確認する。

4.Nginxをリバースプロキシにしてhttps接続を行えるようにする

Keycloakへの通信を暗号化するため、Nginxをリバースプロキシにしてhttps接続できるようにする。なお、すでにローカルの認証局で中間CA証明書やサーバ証明書は出ている前提で設定を進めていく。
以下のコマンドを実行し、Nginxのインストールを行う。

cat <<EOF > /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/\$basearch/
gpgcheck=0
enabled=1
EOF
yum install -y nginx

 

リバースプロキシとして動作させるため、Nginxの設定ファイルを作成する。

■/etc/nginx/conf.d/keycloak.conf

server {
    listen 80;
    server_name {{VirtualHostname}};
    rewrite ^(.*)$ https://$host$1 permanent;
}

server {
    listen 443;
    server_name {{VirtualHostname}};
    ssl on;
    ssl_certificate /etc/nginx/cert/ssl.crt;
    ssl_certificate_key /etc/nginx/cert/ssl.key;
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_redirect http:// https://;
    }
}

 

証明書の保持先ディレクトリを作成して、SELinuxの設定を変更してNginxが読み込めるようにする。

chcon system_u:object_r:httpd_config_t:s0 /etc/nginx/cert/*

 

Keycloakの設定を変更し、127.0.0.1でのみ受け付けるよう変更する。

sed -i 's/'$(hostname -i)'/127.0.0.1/g' /opt/keycloak/standalone/configuration/standalone.xml

 

今のままだとリバースプロキシ経由のため、そのままだとKeycloakへのログインができない。
こちらを参考に、Keycloak側でProxy元の設定を追加する。

<subsystem xmlns="urn:jboss:domain:undertow:4.0">
    ....
    <!--既存の内容を置き換え(465行目あたり)-->
    <http-listener name="default" socket-binding="http" proxy-address-forwarding="true" redirect-socket="proxy-https"/>
    ....
</subsystem>

....

<socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
    ....
    <!--追記(561行目あたり)-->
    <socket-binding name="proxy-https" port="443"/>
</socket-binding-group>

 

最後に、SELinuxの設定をしてNginx、Kyecloakのサービスを再起動する。

setsebool -P httpd_can_network_connect 1
systemctl restart nginx
systemctl restart keycloak

 

 

これで、Systemdで管理できる状態になった。
本当は冗長化とか考慮した方が良いのだろうけど、ひとまずシングル構成での構築手順として残しておく。

 

ITの常識が変わる! 成長する企業はなぜSSO(シングルサインオン)を導入するのか ITの常識が変わる! 成長する企業はなぜSSO(シングルサインオン)を導入するのか




Latest Images