ラベル linux の投稿を表示しています。 すべての投稿を表示
ラベル linux の投稿を表示しています。 すべての投稿を表示

2019/07/01

シェルスクリプトが動かない場合

プログラムを書いて試験して
予定通りに動いたので、cronで自動化をしようと
シェルスクリプトを記載したが、
うまく動かなかった。

logを取ると、プログラムが無いといわれる。

症状を調べると、改行がLFでなくCRLFになっていた。

最近エディタにatomを使っているのだが、
Windowsでatomを使うとデフォルトではCRLFを改行コードに
しているとのことだった。

atomの設定で、
Core Packages ⇒ line-ending-selector に
LF CRLF OS Default があるので、これを
LFにしてあげれば良い。

30分くらい嵌ってしまった。

2019/05/08

CentOS(RedHat系) rootパスワードが分からない際の対策

CentOS7以降、レスキューモード(旧シングルユーザモード)、エマージェンシーモード
ともにrootパスワードを要求される。

しかし、管理者が不慮のアクシデントで対応できない状況となった際に、
どうしてもrootパスワードが必要なことが生じることがある。
今回、どうにもならない状況になってしまったため、操作した。


Procedure 25.6. Resetting the Root Password Using rd.break

いくつか手順を発見したので、残しておく

1.GRUB(ブートするOSを選択する画面)で「eを押す
2.rhgb quiet LANG*** を消して、systemd.debug の後ろにrw init=/bin/bashを加える。
3.Ctrl+x でboot開始
4.bash-4.2# touch /.autorelabel でSELinuxを有効にする
5.bash-4.2# passwd でrootパスワードを設定する。
6.bash-4.2# exec /sbin/init  通常モードへ移行する。

考察
switch_root:/# exit の再起動がうまくないようだ。
rd.break enforcing=0 と宣言しなくとも、SELinuxは無効化される様子。
passwd <管理ユーザ>
としてパスワードを強制上書きできるが、リラベリングに、えらく時間がかかった。



以下の手順でも再設定はできたので、間違いではないと思われる。
mozcの設定がうまくいっていなかったのかもしれないが、自分で構築していないので
どうにもならなかった・・・。


 1.GRUB(ブートするOSを選択する画面)で「eを押す
 2.rhgb quiet を消して、 rd.break enforcing=0 を書き加える
   (linux16の行と書いてあるが、同じ位置で問題なかった。)
   ※ enforcing=0はSELinuxの制御をオミットする意味とのこと。
 3.Ctrl+x でboot開始
 4.switch_root:/# mount -o remount,rw /sysroot を入力しエンター
   ※ファイルシステムを書き換え可能にする。
 5.switch_root:/# chroot /sysroot を入力しエンター
   ※ファイルシステムをroot管理にする
 6.sh-4.2# passwd でrootパスワードを設定する。
 7.sh-4.2# exit を入力しエンター
 8.switch_root:/# exit を入力しエンター
 9.再起動し通常のユーザでログイン後ターミナルで新しいパスワードでroot化する。
10.# restorecon -v /etc/shadow を入力しエンター 
   ※rd.breakで操作したrootパスワード格納のshadow定義をデフォルトにする。
   ※上記をしないと、再起動時にパスワードを誰も読めずログインできなくなる。
11.# setenforce 1 を入力しエンター
   ※SELinuxを有効にしておく。

以降は、再起動しても問題ない。
一般ユーザのパスワードはそのままで、rootは新しいパスワードが有効になる。

LUKS(Linux Unified Key Setup)を利用している場合は、
上記の操作を開始する時点でパスワードやファイルによる解除が必要となるそうだが、
LUKS は、膨大な (RHEL 7 では 512 文字) 平文テキストのパスフレーズと、非常に大きな (RHEL 7 では 8 MiB) のキーファイルを許可しているそうなので、
導入には、配慮が必要と改めて感じた。

2018/04/05

PHP URLのgetパラメータ で利用できる文字列と対策

メールで飛んできた内容にurlを張り付けて、DBに書き込むという
少々危険な匂いを漂わせるプログラムを書いたところ、

urlのgetパラメータにコード変換しないと利用できない文字列があった。

具体には以下の一覧を参照

文字 ! " # $ % & ' ( ) * + , - . /
コード %20 %21 %22 %23 %24 %25 %26 %27 %28 %29 %2A %2B %2C %2D %2E %2F
文字 : ; < = > ? @ [ \ ] ^ _ ` { | } ~
コード %3A %3B %3C %3D %3E %3F %40 %5B %5C %5D %5E %5F %60 %7B %7C %7D %7E

今回は、メールアドレスをgetパラメータで遣り取りしたかったので、
@を%40に変換してあげる必要がある。

$mailadd= "hoge@hoge.com";
$mailadd = str_replace("@", "%40", $mailadd);


$msg .= "http://192.168.0.xxx/insert.php?password=$password&username=$username&mailadd=$mailadd"."\n";

こんな感じで
メールの本文の中にinsert.php で使う変数をgetパラメータで予め投げておきたいときに
役に立ちそう。
地味に%20の半角や%2fのスラッシュあたりが便利。


2017/10/25

Linux 削除できないディレクトリ作成 解除方法 chattr

sambaの運用時にパーミッションで完全制御を行いたくない場合(面倒な場合)でも、
ディレクトリの名前を勝手に変更されては困る場合がある。(プログラムに絡む所など)
そんな時に、chattr コマンドを利用する。
ext2/ext3/ext4の際に利用できる。



chattr [option] [property] FILE...

option
-R 変更を再帰的に適用する
-V 詳細に出力する
FILE ファイルを指定する

property
a 追記のみ可能とする
c ファイルを圧縮する
d dumpの対象外とする
e 拡張フォーマットを使用する
i 変更できなくする
j データのジャーナリングを行う
s 安全な削除(データブロック内を消去)
t 末尾のマージをできなくする
u 削除できなくする
A atime(アクセス時刻)を更新しない
D ディレクトリを同期的に更新する
S 同期的に更新する


ex) ディレクトリの変更をできなくする。
# chattr +i ディレクトリ名

ex) ディレクトリの変更を許可する
# chattr -i ディレクトリ名

リテラシーが低いユーザが多い場合に結構使える。



2016/09/06

サーバ移転で詰まったこと php関連

WEBサーバを移転した際に、嵌ってしまった原因を列挙しておく。
次回の更新が何年後か分からないが、忘備録

PHPのこと

/etc/php.ini
phpが稼働したら、
info.phpファイルを作り、設定確認
infophp();
?>


memory_limit (メモリ使用量の上限)
post_max_size (POSTデータの最大サイズ ※1回のアップロードファイルすべての合計サイズ)
↑今回、これを確認せず、8MBの壁にぶち当たり嵌った・・。

upload_max_filesize  (1ファイルあたりの最大アップロードサイズ)

この辺の数値が小さいと、画面が白いままになったり、
IF関数等で正しく動かない。

反映は

 # systemctl restart httpd.service




Postfixのこと

設定されているサイズを確認

# postconf | grep size_limit

body_checks_size_limit = 51200
bounce_size_limit = 50000
header_size_limit = 102400
postconf: warning: /etc/postfix/main.cf: unused parameter: mtp_sasl_security_options=
mailbox_size_limit = 此処をでかくする      例えば1GB     1073741824
message_size_limit = 此処を↑は小さくする  例えば100MB 104857600

反映は

# systemctl restart postfix.service


phpで作ったメールフォームで嵌った。



2016/08/09

postfixの設定など

社員用にPHPプログラム運用兼ファイルサーバを設置している。
いままでは、ローカルなメールの遣り取りだけで済んでいたのだが
どうしても、外部のメールサーバを経由して外部ユーザにメールを送らないといけなくなった。

ローカルの設定は結構いい加減にやっており、
外部にメールを送ろうとすると、rejectされてしまう。

CentOS7.x はpostfixが推奨されているので、設定することにした。

はじめに
postfixが動いているか?確認




# systemctl status postfix.service

今回は、phpが絡むので、設定する。
/etc/php.ini
L980位の
[mail function]
SMTP = localhost
smtp_port = 25
sendmail_from = なんかそれなに名前を付けておく。

※SMTP認証を使うときは、もう少し追記があるらしい。(今回はいらない)

# systemctl restart httpd.service
PHPの設定有効


つづいてpostfixの設定

前のかなりラフなものをちゃんとする。

 /etc/postfix/main.cf

L60
mail_owner = postfix 別のユーザに変更するときは、書き換える(今回不要)

myhostname = mail.xxx.co.jp 等

mydomain = xxx.co.jp 等

inet_interfaces = localhost 受信設定。受信しないので、localhostで良いが、ルータ等でセキュア環境にしてあるならば、allでもOKと思われる。

inet_protocols = ipv4 おまじない。ipv6をkillしている際は、記載しないと動かないらしい。

mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain ←註

mynetworks = XXX.XXX.XXX.0/24, 127.0.0.0/8 許容するネットワークの範囲を記載


mydestination に $mydomain を記載する際の注意

内部用のサーバから外部用のサーバにリレーする際に、
内部的には固定IP割り当てて、ルータで締めて、トンネル作って、そのアドレスを許容すればいいのだが、そこから外部に送る際、最近のレンタルサーバ等は、domainがいい加減だと、rejectしてくる。

そこで、$mydomainには、送信する際に問い合わせを受けても問題ないdomainを記載しておくのだが、mydestination に $mydomain を安易に書き加えると、外部サーバと内部サーバに同一の
アカウントがいる場合は、そのユーザに関しては、ローカルサーバ内にメールを送ってしまい。
本来の$mydomain に送るべきものが全く送れない状態になってしまうので、
注意が必要。
外部サーバを使ってメールを送信するような内部サーバのpostfixの設定で、
よほど特殊(たとえば内部で擬似的に運用する等の)な環境でない限り、
記載する際は注意が必要。






※SMTP認証を使う場合は、この辺も有効にする。
# In the case of SMTP, specify a domain, host, host:port, [host]:port,
# [address] or [address]:port; the form [host] turns off MX lookups.
#
# If you're connected via UUCP, see also the default_transport parameter.
#
#relayhost = $mydomain
#relayhost = [gateway.my.domain]
#relayhost = [mailserver.isp.tld]
#relayhost = uucphost
#relayhost = [an.ip.add.ress]

その他はそのままで大丈夫と思われる。

# systemctl restart postfix.service
再起動
# systemctl status postfix.service
エラーが無いか確認する。



この設定で、問題なく中継が出来た。
今後Gmailやその他のメールサーバと絡めたりしたいときには、
SMTP認証が必要になる。(今は止めておく)




2016/05/24

CentOS7 ssh2_connectを実装する

正規の方法でインストールを試みるが、

#pecl install ssh2
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/msql.so' - /usr/lib64/php/modules/msql.so: cannot open shared object file: No                                                            
such file or directory in Unknown on line 0
PHP Warning:  Module 'mbstring' already loaded in Unknown on line 0
PHP Warning:  Module 'pgsql' already loaded in Unknown on line 0
Failed to download pecl/ssh2 within preferred state "stable", latest release is version 0.12, stability "beta", use "channel://pecl.php.net/ssh2-0.12" to install install failed

エラー

ネイティブな解説ページが有ったので、
参考にしながら実装までのオボエガキ


先ずは、yumを最新にする。

# yum update

# yum install make gcc libssh2 php-deve

# pecl install -f ssh2
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/msql.so' - /usr/lib64/php/modules/msql.so: cannot open shared object file: No such file or directory in Unknown on line 0
PHP Warning:  Module 'mbstring' already loaded in Unknown on line 0
PHP Warning:  Module 'pgsql' already loaded in Unknown on line 0
WARNING: failed to download pecl.php.net/ssh2 within preferred state "stable", will instead download version 0.12, stability "beta"
WARNING: channel "pecl.php.net" has updated its protocols, use "pecl channel-update pecl.php.net" to update
downloading ssh2-0.12.tgz ...
Starting to download ssh2-0.12.tgz (26,223 bytes)
.........done: 26,223 bytes
6 source files, building
running: phpize
Configuring for:
PHP Api Version:         20100412
Zend Module Api No:      20100525
Zend Extension Api No:   220100525
libssh2 prefix? [autodetect] :     ←ここはブランクのまま エンターした。
Build process completed successfully
Installing '/usr/lib64/php/modules/ssh2.so'
install ok: channel://pecl.php.net/ssh2-0.12
configuration option "php_ini" is not set to php.ini location
You should add "extension=ssh2.so" to php.ini

となるので、

# echo "extension=ssh2.so" > /etc/php.d/ssh2.ini

httpdを再起動させる。

# systemctl restart httpd.service

# php -m | grep ssh2
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/msql.so' - /usr/lib64/php/modules/msql.so: cannot open shared object file: No such file or directory in Unknown on line 0
PHP Warning:  Module 'mbstring' already loaded in Unknown on line 0
PHP Warning:  Module 'pgsql' already loaded in Unknown on line 0
ssh2

phpinfo() で確認すると

ssh2

SSH2 supportenabled
extension version 0.12
libssh2 version 1.4.3
banner SSH-2.0-libssh2_1.4.3

となり、実装完了。

実装方法




<?php
$connection = ssh2_connect('アドレス', 22);
ssh2_auth_password($connection, 'ログインユーザ名', 'ログインパスワード');

ssh2_scp_send($connection, '../転送元ファイル', '転送先ディレクトリ/転送するファイル', 0644);
?>

2015/07/09

CentOSからPHPを使って MicrosoftSqlServerに接続

CentOSからPHPを使ってMicrosoftSqlSeverに直接アクセスは出来ないらしく、

FreeTDSを使って橋渡しをするらしい。

イメージとしては、
PHP ⇔ FreeTDS ⇔ MsSqlServer
こんな感じの流れのようです。

とりあえず、FreeTDSでSqlServerにつかがるかを実験してみる。

先に unixODBCをインストールしている理由は、
FreeTDSはSybaseやSQL Serverと通信をするためのプロトコルであって(インターフェイス)、
DBへのアクセスをする場合にはODBCドライバを経由して行わなければならない。
らしい。
http://www.amy.hi-ho.ne.jp/jbaba/unix/tdsodbc.htm
↑ここに技術解説があった。みなさんここを見ているらしいです。

# yum install unixODBC-devel

ODBCドライバをインストール。

# yum install freetds-devel
FreeTDSをインストール。

freetdsにSqlServerの設定をする。
# nano /etc/freetds.conf

末尾に

[sqlserver]
host = DBサーバアドレス
port = 1433
tds version = 8.0
charset = sjis
client charset = utf-8
language = japanese

を加える。


charset は デフォルトはCP932だが、今回のベンダの設定では
SeqServerに定義したエンコードはsjisだったようだ。
エンコード関係でやはり30分ほど嵌った。


# tsql -S sqlserver -U ユーザ名 -P パスワード名
locale is "ja_JP.UTF-8"
locale charset is "UTF-8"
1>
となれば接続成功。

1>select * from テーブル名
2>go

このように使う。

ここまでが事前準備。



接続実験


$server=’DBサーバアドレス’;
$username='ユーザ名';
$password='パスワード';
$con=mssql_connect($server,$username,$password);

if($con !=FALSE)
{
        echo "Connection to SqlServer successful
";
}
else
{
        die("Connection to SqlServer failed");
}

mssql_close($con);
?>



次は、二つのDBを跨いだときの取り扱いを残す予定。

2015/01/12

NEC PC-BL100RA (CentOS6)をWOL利用する

手順

1  起動時 F2でBIOS起動し、(珍しい日本語のセットアップユーティリティだった)
   詳細⇒リモート電源制御 を [使用する]に変更。

2  CentOSを立ち上げて、有線でネットワークの環境を構築する。
   (NICへの電源供給の関係で、無線は無理っぽかった)

3  WOL対応のソフトをyumでインストール

   # yum -y install ethtool

   # nano /etc/sysconfig/network-scripts/ifcfg-System_eth0

   末尾に
   ETHTOOL_OPTS="wol g"
   を追記する。

起動は各クライアントからマックアドレスに向けてマジックパケットを投げればOK


2014/12/02

pdfファイルに一括してパスワードを設定するため、PDFTkをインストール

複数のpdfファイルに一括してパスワードを設定する事が
かなりの頻度で必要になったので、
手持ちのacrobatで何とかしようと思ったが、
9のstandardしかなく、バッチ処理に対応していなかった。


しょうがないので、フリーのツールを探すと
pdftkがメジャーなようで記事がたくさんあるので、とりあえずインストールしてみる。


# wget https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/pdftk-2.02-1.i386.rpm
www.pdflabs.com の証明書(発行者: /C=US/O=DigiCert Inc/CN=DigiCert Secure Server CA)の検証に失敗しました:
  発行者の権限を検証できませんでした。
www.pdflabs.com に安全の確認をしないで接続するには、`--no-check-certificate' を使ってください。
SSL による接続が確立できません。


なるほど、
# wget --no-check-certificate https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/pdftk-2.02-1.i386.rpm


保存完了したので、
# yum install --nogpgcheck pdftk-2*
署名無いので、--nogpgcheck で署名なしのオプションつけないと蹴られる。


インストール後の使い方

変換前ファイル mae.pdf
変換後ファイル(任意名称) ato.pdf
スタンプ      stamp.pdf
印刷のみ許可のオプション owner_pw ***** allow printing

pdftk mae.pdf stamp stamp.pdf output ato.pdf owner_pw ***** allow printing

当初、指定のフォルダにファイルを置き、cronで5分間隔で実行すればいいだろうと
考えていたのだが、
利用者から、cronでの自動化だと操作した感が無く、忘れそうだとの事だったので、
今回は、スクリプトシェルにして、phpで動作させた。

++++++ソース converter.sh++++++

#!/bin/sh
# PDFコンバート&パスワード保護 スクリプトシェル
#
#作業  ディレクトリ /home/storage1/AAA/ConvertPdf
#変換後 ディレクトリ /home/storage1/AAA/ConvertedPdf
#スタンプ /home/storage1/AAA//ConvertPdf/sourse/stamp.pdf


cd /home/storage1/AAA/ConvertPdf
for file in *.pdf; do pdftk $file stamp ./sourse/stamp.pdf output /home/storage1/AAA/ConvertedPdf/`date '+%Y-%m-%d-%H%M%S'_`$file owner_pw **** allow printing; done
rm *.pdf


+++++++++++++++++++++++++++

作業内容
ConvertPdfにあるpdfにstamp.pdfをして印刷のみ許可の状態にしたファイルを
先頭に日付を付けてConvertedPdfにコピーし、
ConvertPdfにあるpdfファイルを削除する。

phpに関して
 phpを動かす同じディレクトリにスクリプトシェルを置かないといけない模様。
 (chdirを使ったが、指定のディレクトリに上手く移動してくれないので、 あきらめた。)

shell_execをhtmlspecialcharsで括らないと、中身をうまく認識できないらしく、
スクリプトシェルが動かなかった。
unixのコマンドだとexecだけでも動くようだが、変数などを使っているので、駄目っぽい。


    $command = './converter.sh.sh';
    htmlspecialchars( shell_exec( $command ) ) ;
?>


あとは、form等でボタンをそれなりに作っておく。


動作試験をして、意図するように動いたので、
あとは、stamp等を調整して完了とする。




2014/06/14

データバックアップ⇒データ移行⇒HDD交換⇒LVM領域拡張

ファイルサーバの空き容量が5GBを割ってしまったので、やむなく交換。
もともと格安のNECサーバに付いていた180GBのSATAⅡをそのまま使っていたが、
500GBに交換することにした。
dumpとrestoreが良いようだが、イマイチ操作が良くわからないので、

ddコマンドと、LVMの拡張で何とかした。

まずは、ddコマンドを実行するため、KNOPPIX
(LIVEでターミナルでddコマンドが動くなら何でもいい)のDVDを作成し、
BIOS弄って、DVD優先起動にする。

$ sudo -s でroot化
コピー元を sda コピー先を sdbとする場合、
# dd if=/dev/sda of=/dev/sdb bs=1024
今回は、HDDにエラーが出た状態ではないので、
ブロックサイズはデフォルトの512Kごと送るよりは、倍の方が早いだろうということで、
オプションを追加。
ifとofを逆にしちゃうと、大変な事態に。もう二度とデータは帰ってこない・・・。
この作業、あんまりしたくない・・・。

結果、およそ2時間ほどでコピー完了
途中経過を確認する方法は別のターミナルを起動して
$ killall -USR1 dd
これで、その時点の作業量からおよその時間が割り出せる。

完了したら、シャットダウンして、その後HDDをつなぎかえて起動。

起動すると、外側は500GBなっているが、内側は180GBのままなので、
これを正しく直してあげる必要がある。

$ su -
# df -H
Filesystem             Size   Used  Avail Use% マウント位置
/dev/mapper/VolGroup00-LogVol00
                       168G   164G     4G  97% /
/dev/sda1              104M    64M    35M  65% /boot





現状、こんな感じ



ボリュームグループの構成を見て、割り当てられる領域を確認。
# /usr/sbin/vgdisplay -v
作業中に保存し忘れた・・・。
これは、最終形だが、
Total PEが上限値なので、その付近まで、領域を拡張すれば良い。

    Finding all volume groups
    Finding volume group "VolGroup00"
  --- Volume group ---
  VG Name               VolGroup00
  System ID           
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  6
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               168 GB
  PE Size               32.00 MB
  Total PE              14901
  Alloc PE / Size       14563 / 455.09 GB
  Free  PE / Size       338 / 10.56 GB
  VG UUID               Ys3H7T-UY61-MnKG-Ue0I-bMGI-mRHd-1oYDvm



# lvextend -l 14500 /dev/VolGroup00/LogVol00 

最初は、14500でなく、14901でコマンドを叩いたのだが、
他に使われている領域が有るらしく、エラーが出たので、
わりと近めのきれいな数値でコマンド実行した。

その結果が、上の状態。




# resize2fs /dev/VolGroup00/LogVol00
resize2fsでサイズを変更。










途中迷走し、fdiskで一端sda2を消して、Wで保存する前に、
再度、目一杯の領域でsda2を作り直してWして、
再起動したが、効果が有ったのか不明。

ほんとは、 resize2fsの前に、
#fsck -f /dev/VolGroup00/LogVol00 でディスクチェックすべきかも。
 
 
# df -H
Filesystem             Size   Used  Avail Use% マウント位置
/dev/mapper/VolGroup00-LogVol00
                       472G   164G   308G  34% /
/dev/sda1              104M    64M    35M  65% /boot

この形になれば、成功。



2014/02/01

Linux rsyncで差分バックアップの実装

基本的な使い方
 $ rsync -av /コピー元 /コピー先
フルパスで行けた。

差分バックアップについては、
rsync -av --delete --link-dest=../<<比較元>> <<バックアップ元>> /<<バックアップ先>>
で行ける。(比較元のパスはバックアップ先から相対パスで指定すること

cronで毎日稼働させるようであれば、次のように修正して稼働させればよい。
既に先人が偉大な資料を残してくれているので、参考に作成した。


--link-dest コマンド:インクリメンタルバックアップ
ハードリンクを作ってくれるので、ディスク圧迫を防げるので、コマンド採用している。

Webエンジニア・インフラエンジニアゐくをの日常 様のほぼそのままです。

詳しくは、この方のWEBサイトを確認してください。


□□□□□□シェルスクリプトの内容ここから□□□□□□□

#!/bin/bash

# バックアップ先を指定
back_up_dir=/<<バックアップ先のディレクトリのパス>>/dailyBack
mkdir -p $back_up_dir

# バックアップログ名
backup_log=/<<ログを残すディレクトリ>>/log/rsync_backup.log
rm -f $backup_log
touch $backup_log
chmod 600 $backup_log

# エラー処理 あった方がよさそうなので、そのまま使わせて頂いた。
error_exit () {
exit 1
}

# バックアップ実行
echo "毎日のバックアップ開始" >> $backup_log
#このあたりは素敵な感じ。当初別の方法で書いたが、ゐくをさんの方法の方が分かりやすいので、パクった。
latest=`ls -t $back_up_dir | grep backup | head -1`
newly=`date +%Y%m%d`backup

mkdir $back_up_dir/$newly
rsync -av --delete --link-dest=../$latest /<<バックアップ元のディレクトリ>> $newly/$latest >>

#ここから下もそのまま利用させて頂いた。

$backup_log 2>&1
code=$?
if [ $code -ne 0 ]; then
    cat $backup_log | mail -s "BACKUP NG CODE IS $code" root
    rm -rf $back_up_dir/$newly
    error_exit
fi
echo "毎日のバックアップ完了" >> $backup_log


□□□□□□□□ここまで□□□□□□□□□

Linux ディレクトリ・ファイル容量の確認コマンド du

dfはHDD等の利用率や容量の確認コマンド

duはカレントディレクトリの容量を調べることができる。

du --オプション ファイル名やディレクトリ 


オプション
-s 引数で指定したファイルやディレクトリの総計を表示する
-h 適当なサイズで表示 K G等
-d シンボリック・リンク・ファイルは元ファイルの容量を集計する


良く使うのはこのあたり

最初に調べたいディレクトリに移ってからコマンドを打っても良い。

du -sh

大概はこれでOK。  

2014/01/21

PostgreSQL 配列関数 複数行帰ってくるクエリを一行で表示させる表現 ARRAY関数

複数のテーブルを跨いだクエリで、selectの結果が複数行で返ってくる場合、
pg_fetch_array等で、一覧表として表現したい事がある。

通常、LEFT JOIN等を行っても、複数行がそのまま表示されてしまう。
ただ内容を見る場合は、これでも良いのだが、
pg_num_rows 等で件数を合わせて管理したい場合、カウントがおかしくなってしまう。

いろいろと探したところ、配列関数でクエリを投げれるようなので、実装した際のオボエガキ。

条件

テーブル
tab1
tab2

tab1 のカラム
seqnumber
name
add



tab2 のカラム
tab2seqnumber
number こいつもユニークでこれを軸に番号を発番している。
memo



クエリ生成

select seqnumber,
( select array_to_string(ARRAY(select number||memo from tab2
where tab1.seqnumber=tab2.tab2seqnumber ), ',') ) AS
combine,name,add from tab1 where seqnumber=7777;


このような表現でOK

大枠のクエリの抽出条件の中に、
select array_to_string(ARRAY・・・, ',' )を入れ子にしているのがポイント。

たとえば、
select seqnumber,number||memo,name,add from  tab1 left join tab2 on tab1.seqnumber=tab2.tab2seqnumber where seqnumber=7777;

この場合、3行の検索結果が返ってくるとすると、
seqnumber,101memo1,102memo2,103memo3,name,add
のように
number||memo が若い順にカンマ区切りで文字列として表示される。

何気にすごく使える。

本家の解説ページ
http://www.postgresql.jp/document/8.0/html/functions-array.html

2013/08/02

windows7 シンボリックリンク


Linuxで運用中のプログラムをwindows7で走らせることになった。

内部構成でシンボリックリンクを使っていたので、
同じものを配置するか~、メンテナンス性悪いな~と思っていたら、
windowsVista以降は何とシンボリックリンクが使えるらしい。
これは助かるので、忘れ無いように残す。


コマンドラインでのみ作成可能なため、コマンドプロンプトを管理者権限で起動

◆ファイルのシンボリックリンクを作成
mklink <シンボリックリンクの名前> <リンク先パス>
◆ディレクトリのシンボリックリンクを作成
mklink /d <シンボリックリンクの名前> <リンク先パス>

2013/07/23

grep 指定ディレクトリ内のファイルの中に入っている単語の検索

追記あり

grep -i -r -n -e "検索したい単語"  /検索したいディレクトリ

option

-i 大文字・小文字の区別をなくす。
-r サブディレクトリ以下も再帰的に検索する。
-n パターンに一致した行のファイル内での行番号を表示する。
-e 検索条件を指定 -e "内容" のセットで使う。

その他option
-w 指定したパターンを単語として含む行を抜き出す。
-c マッチした総行数を表示
--include='*.拡張子' 指定した拡張子を含む
--exclude='*.拡張子' 指定した拡張子を除く


応用編
find | xargs grep -n [pattern]
 
入力したパターンをカレントディレクトリ以下で検索してくれる。
最初の 
grep -i -r -n -e "検索したい単語"  /検索したいディレクトリ
ほぼ同じ。


今更だけど、option -e "" を忘れて
余計な時間が掛かったので、残す。 

2013/06/24

postgresql 他の拠点(ホスト)からのアクセスを許可する設定

postgresの

/usr/local/pgsql/data/postgresql.conf を修正

listen_addresses = '*'
コメントになっている場合は、コメントを消す(#を取る)

接続ホストの制限をしている設定ファイル
/usr/local/pgsql/data/pg_hba.conf を修正

末尾に新しい拠点(ホスト)を記載。
host    all         all         192.168.XXX.0/24       password
 
補足
サブネットマスクは忘れず記載。 
passwordで md5ベースのパスワード
md5は総当たりでやられるらしく、
SHA-2とかのほうがセキュアらしいが、
その辺はルーターで穴を塞いでいるので、
ローカルレベルのパスワード定義で十分。
 
# /etc/rc.d/init.d/postgresql restart
でpostgresqlを再起動して、設定を有効にする。
 

2013/03/18

CentOS6.0以降のcrontab設定

Logwatchをrpmでインストールして 、メールを携帯飛ばして状態管理をしており、
CentOS6.0のマシンからも、メールを飛ばすようした際のオボエガキ。
CentOS6.0以降のcrontabはrootでも定義されていない。
 crontabのdailyを7時半に定義したところ、 
3時半と、指定した時間2回送られてくるようになった
All about linuxさん に解説があったので、残す。
何やら、anacron (cronie-anacron)によって、ランダム化をし、
スクリプトシェルが重なったりして実行できない等の問題を解決しているようだ。
/etc/anacrontab

# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22

#period in days   delay in minutes   job-identifier   command
1       5       cron.daily              nice run-parts /etc/cron.daily
7       25      cron.weekly             nice run-parts /etc/cron.weekly
@monthly 45     cron.monthly            nice run-parts /etc/cron.monthly
 
赤字の 1 (左端) が実行周期 (日時実行=1) で、
次の数字 5 は、実行開始タイミングになってから、5 分間の遅延を入れる指定
実行開始する時間帯は START_HOURS_RANGEで制御され、
3-22 とは、3時から22時までの範囲 (3:00 ≦ t < 22:00) を指定
ランダム化の幅はRANDOM_DELAY で制御され、
45 とは 0~45 分の範囲 (乱数計算の実装上、正確には 44 分まで) 
でランダムに遅延を行うことを指定している。
 
とのこと。詳しくは、manにて
起動時間帯が、3-22時の場合は、3:05~3:50に(正確には3:06となるらしい)起動することになる。
  
7時半頃飛んで来ればいいので、
START_HOURS_RANGE=7-22
変更。
これで、7時前半となる場合は、
1       5       cron.daily              nice run-parts /etc/cron.daily
 5を30とかにすれば、いいはず。

cronie-noanacronというパッケージをインストールすると、ランダム化されないそうだ。
パッケージの依存関係のため、事前に cronie-noanacron をインストールし、
その後に cronie-anacron を削除するという手順を踏む。

# yum install cronie-noanacron
..略..
Installed:
  cronie-noanacron.x86_64 0:1.4.4-7.el6
Complete!

# rpm -e cronie-anacron
 
/etc/cron.d/dailyjobsというものが生成され、こいつに、見慣れたcromtabを指定すればよい。
 
中身 
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
02 4 * * * root [ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.daily
22 4 * * 0 root [ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.weekly
42 4 1 * * root [ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.monthly  

cronie-anacron パッケージを削除しないと有効化されないようにガードされているそうだ。

cron.weekly および cron.monthlyも同様。

2011/09/03

DELL VOSTRO230 WOL

会社で使っているDELL VOSTRO 230 のWOLを仕込んだ。
支店に行く用事があったので、BIOSをF2で立ち上げ、
Low Power Mode [Disable]
Remote On LAN [Enable]
と変更し、セーブして終了。
XPだったので、S5で起せる様に、LANの電源管理等を変更
コントロールパネル
 システム
  ハードウェア
   デバイスマネージャ
    ネットワークアダプタ
     Broadcom NetLink
      詳細設定
       Wake Up capabilities を magic packet
      電源の管理
       このデバイスで、コンピュータのスタンバイ状態を解除できるようにする にチェック

あとは、YAMAHA RTX1200 から マジックパケット投げて起動。
administrator になって
# wol send lan1 [MACアドレス XX:XX:XX:XX:XX:XX]
で立ち上がる。

ちなみにWindows系なので、Real VNCも仕込んでおいた。
益々、新築時に固定IPアドレスが欲しくなってきた。
といっても、固定費が掛かってしまうので、検討中。

2011/08/16

Yamaha RTX1200 で WOL

別のネットワークからでは、アクセスできなかったので、
いろいろ方法を探してみる。
固定IPを振っていれば問題なんだが、
支店はIPをそんなにもっていないので、
トンネルで対応できる方法を考えた。
ルータ越しにマジックパケット
を送信できないので、(恐らくリジェクトされる)
ルータからwolが出来ないか調べたところ、
コマンドがあったので、忘れないうちに残しておく。

RTX1200にログインして、
administratorになる
#wol send lan1 xx:xx:xx:xx:xx:xx
xxはマックアドレス

細かくパケットの送信回数や、ポート等の指定が可能のようだ。
wol send [-i INTERVAL] [-c COUNT] INTERFACE MAC-ADDRESS [IP-ADDRESS [udp PORT]]
INTERVAL ...パケットの送信間隔 (秒), 1~21474836
COUNT ...パケットの送信回数, 1~21474836
INTERFACE ...LANインタフェース名
MAC-ADDRESS ...MACアドレス
IP-ADDRESS ...IPv4アドレス
PORT ...UDPポート番号(10進数)
TYPE ...イーサネットタイプフィールドの値(10進数)