Linux JPEG のexif 情報一括削除

スマホのjpeg画像をwordpressにタグ付きでアップロードしている場合、画像のGPS情報など削除しておきたいですね。Windowsの場合、画像の[プロパティ] – [詳細]から[プロパティや個人情報を削除]から削除することができます。Linux でも画像のプロパティを削除できるフリーソフトがいくつかあります。今回はJhead を使ってwordpressディレクトリのjpeg ファイルのプロパティを一括削除してみたと思います。

Jhead-3.03.tar.gz をダウンロードして解凍

# cd /usr/local/src/
# tar -zxvf jhead-3.03.tar.gz
# cd jhead-3.03
# make & make install
# find /DocumentRoot/wordpress/wp-contents/uploads/ -name *.jpg -type f | xargs jhead -purejpg

jhead をmake するときにmktemp コマンドは危険 mkstemp コマンドをお勧めします。みたいなエラーが出たときは素直にコマンドを置き換えてトライしてみましょう。

MRTG でCPUの温度管理

MRTGでネットワークトラフィック、CPU負荷、空きメモリ、ディスク使用量の監視データに加え、CPUコアの温度管理を追加しようと/usr/local/mrtg-2/lib/mrtg.cfg の設定したのでメモ。

まず、sensors コマンドをインストールします。

# yum install lm_sensors
# sensors-detect

Target[cputemp_0] にはCore 0 のCPU温度をsensors コマンド、uptimeコマンドで取得するスクリプトを指示しています。

書式は、`input; output; uptime; hostname`で以下の4行を出力します。

例)
45.0
45.0
16 days, 07:07:45
hostname

input=output は、以下のシェルスクリプト。

/usr/bin/sensors | grep Core | awk NR==1'{print $3}' | sed -e 's/+//' -e 's/[^0-9+\.].*//'

uptime は、以下のシェルスクリプト。

uptime | awk '{$2=""; print$3" "$4" "$1}'

その他の設定項目は、@IT:MRTGでCPUの温度変化をグラフ化するには を参考にしました。

Target[cputemp_0]: `/usr/bin/sensors | grep Core | awk NR==1'{print $3}' | sed -e 's/+//' -e 's/[^0-9+\.].*//'; /usr/bin/sensors | grep Core | awk NR==1'{print $3}' | sed -e 's/+//' -e 's/[^0-9+\.].*//'; uptime | awk '{$2=""; print$3" "$4" "$1}'; hostname`
MaxBytes[cputemp_0]: 100
Title[cputemp_0]: Temp of CPU Core 0
PageTop[cputemp_0]: <h1>Temp of CPU Core 0</h1>
Options[cputemp_0]: growright,absolute,gauge,nopercent,noinfo
WithPeak[cputemp_0]: ymw
#unscaled[cputemp_0]: dwmy
YLegend[cputemp_0]: Temperature
ShortLegend[cputemp_0]: C
LegendI[cputemp_0]: M/B
LegendO[cputemp_0]: CPU
Legend1[cputemp_0]: M/B
Legend2[cputemp_0]: CPU

NR==1 の所を同様に、NR==2, NR==3, NR==4, とするとCore 別の温度が取得できますのでmrtg.cfg にcputemp_1, cputemp_2, cputemp_3 を編集で追加。indexmaker コマンドを実行すると

# indexmaker /usr/local/mrtg-2/lib/mrtg.cfg > /usr/local/apache2/htdocs/mrtg/index.html

 

CPU温度を表示する、index.html ファイルが生成されました。

参考URL:
http://blog.goo.ne.jp/takuminews/e/19ecc7aa1878401df1850285bfe17436
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/797mrtg2cpu.html

hostsファイルを編集するシェルスクリプト

/etc/hosts.allow でホスト制限しているとカスペルスキーセキュアコネクションでIPが変わったときにsshdに締め出されるので対策スクリプトを作ってみた。

#!/bin/bash
ipAddress=`/usr/bin/host example.com | awk 'NR==1{print $4}'`
sed -i '/sshd:/d' /etc/hosts.allow
sed -i -e '10i sshd: '$ipAddress /etc/hosts.allow
service sshd restart

クライアントのIPアドレスを/usr/bin/host で取得して変数に格納。hosts.allow の古いIPを含むsshd行を削除、10行目に新しいIPとして追加。このスクリプトをcronファイルとして保存。

00 * * * * /root/scriptname

実行権限を与えてcronに登録します。これでうまく行くはず?

#chmod o+x scriptname
# crontab filename

注)コンソールログオンできないレンタルサーバでの障害発生や正常動作は保証しません。

参考URL:

https://blog.tnmt.info/2011/11/30/hosts-allow-include/
http://blog.glidenote.com/blog/2011/12/28/dyndns-iptables-hosts.allow/

sedコマンド

今回は、以前のエントリーで「ゾンビ探しのスクリプト」をご紹介しましたがその時には理解できなかった、sed コマンドを取り上げます。

sed -e "s/foo/bar/g" ファイル名

意味は、ファイル[ファイル名]の中の文字列を次の条件式”s/foo/bar/g”で、foo をbar に書き換えるということで、

sed 's/^ \{1,\}//g'

の場合は、PID出力の中の先頭にマッチ^する半角スペース の1回以上の繰り返し{1,}をすべて削除する//、という意味になります。

前回のエントリーで、Wordpress のメディアライブラリを表示するadmin-ajax.phpファイルを書き換えるシェルスクリプトは、-i でファイルの上書き保存とバックアップを作るオプションを使って、

sed -i".bak" -e "s/foo/bar/g" admin-ajax.php

実際には、foo とbar に前回のコードを代入して「/(スラッシュ)」と「;(セミコロン)」と「$(ダラー)」をエスケープして、「\n(改行コード)」を追加して

sed -i".bak" -e "s/@header( 'Content-Type: text\/html\; charset=' . get_option( 'blog_charset' ) )\;/if(in_array(\$_POST['action'], array('query-attachments', 'send-attachment-to-editor'))){\n@header('Content-Type: application\/json\; charset=' . get_option('blog_charset'))\;\n}else{\n@header( 'Content-Type: text\/html\; charset=' . get_option( 'blog_charset' ) )\;\n}/g" admin-ajax.php

となります。

参考URL:https://open-groove.net/linux-command/sed-edit-files/
http://qiita.com/takech9203/items/b96eff5773ce9d9cc9b3
http://www.megasoft.co.jp/mifes/seiki/meta.html

Linuxシェルのコマンド履歴

Linuxシェルのコマンド履歴は bash に

$ history

として保存され [↑]、[↓] キーで参照されます。履歴を検索するには、[Ctrl]+[R] キーを押下してプロンプトが

(reverse-i-search)`': _

となったとき、検索文字列を入力(lsと入力したときの例)すると

(reverse-i-search)`ls': ls -l /home/gusachan/public_html

検索候補が表示されますが、次の候補を再検索するにはさらに、[Ctrl]+[R] を行い、[Enter]キーで確定、コマンドを編集または実行できます。

bash のヒストリー一覧を履歴番号付きで出力するには、

$ history

ヒストリーを削除するには、

$ history -c

特定のコマンド履歴を削除するには、

$ history -d [履歴番号]

ゾンビ探しのスクリプト

ゾンビプロセスを表示するスクリプトを見つけたので試してみました。

#!/bin/bash
declare -a zombiepids
zombiepids=($(ps -eo pid,stat | grep 'Z' | sed 's/^ \{1,\}//g' | cut -d" " -f1))
if [ ${#zombiepids[*]} -gt 0 ]; then
  echo "ゾンビプロセスは ${#zombiepids[*]} 個です"
  ps -f -p ${zombiepids[*]}
fi

最初の$ はコマンド置換といって変数や引数にコマンドの結果を渡したいときに使われ、ここではps (プロセスの状態を取得する)コマンドで、Zの付くPIDを半角スペースを削除して、cutコマンドでPIDのみを、配列${zombiepids[*]}に格納しています。${#zombiepids[*]}で配列の要素数を表すのですね。sed がいまいちわかりません。また勉強ですね。

if文の -gt は比較演算子で真のときコマンドを実行します。

eq a=bのとき真
ne a≠bのとき真
lt a<bのとき真
gt a>bのとき真
le a≦bのとき真
ge a≧bのとき真

参考URL http://d.hatena.ne.jp/anmino/20100404/1270307084

UNIX/Linuxシェルスクリプトマスタリングハンドブック

http://shellscript.sunone.me/if_and_test.html

https://hydrocul.github.io/wiki/commands/cut.html

http://qiita.com/mashumashu/items/bbc3a79bc779fe8c4f99

配列変数への文字列の代入

今日もLinuxのシェルスクリプト、配列変数のお勉強です。

今回は、findコマンドで取得したディレクトリ名を配列変数へ代入して表示するスクリプトです。

#!/bin/bash
declare -a dir=()
declare -i count
for DIR in $(find . -maxdepth 1 -type d)
do
    dir=("${dir[@]}" `basename ${DIR}`)
    echo "${dir[count]}"
    count=count+1
done

実は以下のように書けば、同じことをするのに配列変数は関係ないのですけれどね。コードの可搬性、拡張性を考えると配列変数を使うこともあるのかな・・・と。

#!/bin/bash
for DIR in $(find . -maxdepth 1 -type d)
do
    echo `basename $DIR`
done

実際の結果は、隠しディレクトリも表示されます。隠しディレクトリを除外したいときには、findコマンドの -not -regex オプションでドットの付くファイルを指定します。

#!/bin/bash
for DIR in $(find . -maxdepth 1 -type d -not -regex ".*\/\..*")
do
    echo `basename $DIR`
done

maxdepth の値を変えるとさらに掘り進められます・・・が、表示結果があまりエレガントではありません。ではforループをネストすれば良いのでしょうが、それもあまり意味がないのかも知れません。

# sh findDir.sh
public_html
samba
test
ダウンロード
テンプレート
デスクトップ
ドキュメント
音楽
画像
公開

参考URL

http://qiita.com/b4b4r07/items/e56a8e3471fb45df2f59
http://d.hatena.ne.jp/yohei-a/20091028/1256707671
ttp://tapira.hatenablog.com/entry/2014/10/02/120550

シェルスクリプトの配列変数

今日は、Linuxシェルスクリプトの配列変数のお勉強です。

# vi array.sh
#!/bin/sh
array=("hoge" "fuga" "foo" "bar")
for txt in "${array[@]}"
do
echo $txt
done

配列変数の注意点は以下の 2つ。

1.要素にスペースが含まれることを考慮してダブルクォートで囲むこと
2.* ではなく @ を使用すること

# sh array.sh
hoge
fuga
foo
bar

ふむふむ。配列変数への代入方法など調べる必要がまだありそうです。

http://shellscript.sunone.me/array.html#配列の要素でループする:8177e845bec4a15c29be1b787e514e77