【Linux】 Windows上ファイルのアクセス ( mount cifs ) サンプルシェルスクリプト2009年02月01日 09:08



メモ : 物忘れがひどく?なった私の覚書です。

☆ Linuxマシン側 設定ポイント

・Windows上のファイルにアクセスする為には samba-client パッケージが必要・・・たぶん (^-^;
 インストールされているか、まず確認!

  # rpm -aq | grep samba-client
  samba-client-3.0.25b-1

 インストールされていれば上記のように何か表示される。
 もし、このパッケージがインストールされていない場合は、
 yumコマンドでインストールする。

  # yum install samba-client 

・iptables によりパケットの検査が行われたりすると上手く接続できない場合がある。
 そんな時は以下のように Windows マシンのIPアドレス・ポート(139,445)を開放する  ように設定を行う。

  # iptables -A OUTPUT_ALLOW -m state --state NEW -p tcp -d
                                                   192.168.1.123 --dport 139 -j OK
  # iptables -A OUTPUT_ALLOW -m state --state NEW -p tcp -d 
                                                   192.168.1.123 --dport 445 -j OK


☆ Windowsマシン側 設定ポイント

Windows側も準備が必要!
ファイルのアクセスを許可するフォルダの共有化と、
Windowsファイアウォールを有効としている場合はLinux側からのアクセスに対して 許可(ポート開放)が必要となる。

・ファイルアクセス対象となるフォルダの共有化設定
    Wondowsエクスプローラでフォルダを選択
    右クリックメニューの「共有とセキュリティ」を選択
    
  ① D:\FILE を共有化する。 ・・・例) D:ドライブのFILEフォルダ
    
    Wondowsエクスプローラでフォルダを選択
    右クリックメニューの「共有とセキュリティ」を選択
    ---<共有タグ>---

    「このフォルダを共有する」を選択

       ※ 共有名(=FILE)等設定値はデフォルト値のまま。
    
  ② アクセス許可 

    ---<セキュリティタグ>---    

     everyone = フルコントロール 設定

       ※ 任意ユーザ名を作成しアクセスできるようにする方が理想かも


・Windowsファイアウォールの設定  
    
  ① Windowsファイアウォール = "有効" 設定 ?

     もし、"無効" (・・・危ないよ!) となっている場合は②は必要なし

  ② 「例外」タグの「ファイルとプリンタ共有」をチェック、
     さらに【編集】ボタンを押下しの TCP 139 及び TCP 445 をチェックする。 



○ シェルスクリプト mount cifs

---<Windowsファイルマウント サンプルシェルスクリプト>----------

#!/bin/bash

SRC_PATH="//192.168.1.123/FILE"
MNT_PATH="/mnt/win"
                             # マウントポイント作成
if [ ! -d ${MNT_PATH} ]; then
    /bin/mkdir -p ${MNT_PATH}
fi
                             # マウント済チェック
mount_flag=`/bin/mount | /bin/grep "${MNT_PATH}" | /usr/bin/wc -l`
if [ ${mount_flag} -ne 0 ]; then
    exit 0
fi
                             # マウント!
/bin/mount -t cifs -o username=Administrator,password=※) ${SRC_PATH} ${MNT_PATH}
                   # ※) ユーザ(Administrator)のパスワードを設定 retval=$?
if [ ${retval} -ne 0 ]; then
    echo "mount error !"
    exit 1
fi
exit 0

これで、ls コマンドを実行してWindows上のファイルが見えるかチェック!

  # ls -la /mnt/win

  何かファイルが見えたらOK (^-^)v


---<Windowsファイルアンマウント サンプルシェルスクリプト>----------

#!/bin/bash

MNT_PATH="/mnt/win"
                             # アンマウント済チェック
mount_flag=`/bin/mount | /bin/grep "${MNT_PATH}" | /usr/bin/wc -l`
if [ ${mount_flag} -eq 0 ]; then
    exit 0
fi
                             # アンマウント!
/bin/umount ${MNT_PATH}
retval=$?
if [ ${retval} -ne 0 ]; then
    echo "umount error !"
    exit 1
fi
exit 0



【Linux】 パラメータ取り込み ( shift ) サンプルシェルスクリプト2009年02月01日 08:56


メモ : 物忘れがひどく?なった私の覚書です。

シェルスクリプトに渡されるパラメータの取得方法(変数)は、

  引数1 = $1
  引数2 = $2
  引数3 = $3
     :

と '$' に続く数字がカウントアップされた変数に入っている。

でも、何個パラメータが指定されるか分からないような場合
shift を使用して指定されたパラメータをシフトして
パラメータを順次取り込むことが出来る。

以下に簡単な例を

#!/bin/bash

TEST_FLAG=0
while [ ! -z "$1"  ]; do
    case $1 in
        -a)
            TEST_FLAG=1
            ;;
        -b)
            TEST_FLAG=2
            ;;
        *)
            param=$1
            ;;
    esac

    shift;

done

echo ${TEST_FLAG} : ${param}

このシェルをいろんなパターンで起動してみると

# /bin/bash /tmp/test.sh
0 :
# /bin/bash /tmp/test.sh -a
1 :
# /bin/bash /tmp/test.sh -a 123
1 : 123
# /bin/bash /tmp/test.sh -b 123
2 : 123
# /bin/bash /tmp/test.sh 123
0 : 123
# /bin/bash /tmp/test.sh -c
0 : -c
# /bin/bash /tmp/test.sh -a -b 123
2 : 123
# /bin/bash /tmp/test.sh -b -a 123
1 : 123


うん、shift を使えばパラメータ個数、パラメータ指定の順番など任意指定の
対応が簡単に出来そう (^-^)




【Linux】サンプルシェルスクリプト ( while, for )2009年01月10日 19:41


物忘れがひどく?なった私のメモです。

○ シェルスクリプト While, for文 繰返し 

・変数を使用する場合では

    #!bin/bash
    #---< Sample 1 >-----------------
    i=1
    while [ ${i} -le 3 ]
    do
        echo "Count=${i}"
        let i=i+1
    done

   ちょっと変数を定義したり、
   変数値をインクリメント(+1)したりするのがちょっと面倒 (^-^;

そこで、seqコマンドを使って

    #!bin/bash
    #---< Sample 2 >-----------------
    for i in `/usr/bin/seq  1 3`
    do
        echo "Count=${i}"
    done

これで、前述のwhile文と同じ・・・

    man の結果を拝借すると

    seq - 単調増加 (減少) する数値列を表示する

        seq [-w] [-f FORMAT] [-s SEP] [--equal-width] [--format=FORMAT]
           [--separator=SEP] <LAST | FIRST LAST | FIRST INCR LAST>
        seq [--help] [--version]

        seq は FIRST から LAST まで、INCR ずつ加えた数値を表示する。
        LAST または INCR が省略された場合、デフォルトは 1 になる。
        すべての数値は浮動小数点数として解釈される。

        オプション
           -f FORMAT, --format=FORMAT
              printf(3) のフォーマットに FORMAT を用いる。(デフォルト: %g)
           -s SEP, --separator=SEP
              数値を SEP で区切る。(デフォルト: ‘\n’)
           -w, --equal-width
              桁数を揃えるために (先頭を) 0 で埋める。
           --help 使用法のメッセージを標準出力に表示し、正常終了する。
           --version
              バージョン情報を標準出力に表示し、正常終了する。
    すなわち

    /usr/bin/seq  1 3

    初期値(1) から 最大値(3)までデフォルト値(1)を加えた結果が返ってくる。
    プロンプトから以下のように
    実行してみるとすぐ分かる (^-^)

    #/usr/bin/seq  1 3
    1
    2
    3
    #


【Linux】 サンプルシェルスクリプト2007年10月01日 08:23


物忘れがひどく?なった私のメモです。


○ シェルスクリプト プロセスの停止(kill) 

    #!/usr/bin/sh
    ######################################################################
    #
    #  プロセスを停止(kill)シェルスクリプト
    #
    #        起動されているプロセスを停止(kill)する
    #
    #        proc_kill.sh
    #
    #
    #     Ver  Date        Author   Comment
    #     0.00 yyyy/mm/dd  Name     
    #
    ######################################################################
    #
    ### 停止対象プロセス名 ###########################
                                    # 停止したいプロセス情報
    PMAX=6                      # 停止したいプロセスの個数
    PNAME[1]="main_proc"        #   ※  ps コマンドで表示されるプロセス名を記述
    PNAME[2]="sub_proc1"        #    停止したいプロセスが親子関係にある場合は
    PNAME[3]="sub_proc2"        #    親プロセスを先に記述
    PNAME[4]="sub_proc3"        #    たまに、子プロセスが停止すると親プロセスが監視
                                    #    していて再起動される場合がある。
    PNAME[5]="child_proc1"
    PNAME[6]="child_proc2"
    #
    ### シェルスクリプト処理 #########################
    i=1
    while [ ${i} -le ${PMAX} ]
    do
                                    # 停止対象プロセスが存在するかチェック
         PEXIST=`/bin/ps -ef | /bin/grep ${PNAME[${i}]} | /bin/grep -v grep | /usr/bin/wc -l`
         if [ ${PEXIST} -ne 0 ]; then
                                    # 同プロセス名全て停止(Kill)
            for PID in `/bin/ps -ef | /bin/grep ${PNAME[${i}]} | /bin/grep -v grep | /bin/awk '{print $2}'`
            do
                /bin/kill -9 ${PID} 1> /dev/null 2>&1
            done
            sleep 1                 # 無くても・・・
        fi
        let i=i+1
    done
    exit
    
    

【Linux】パッケージソフトの確認2007年10月01日 08:04


物忘れがひどく?なった私のメモです。


○ rpm 《 RPM パッケージマネージャ 》

  パッケージの検索と検査、パッケージのインストール・アップグレード・削除
  などの機能を持つコマンド
  はたして今どんなソフトがインストールされているのか?
  rpm コマンドを使用してチェックしてみる。


   以下にコマンド実行例を。。。

  # rpm -qa --qf '%{name}-%{version}-%{release}.%{arch}.rpm\n' | more
  4Suite-1.0-3.x86_64.rpm
  Canna-3.7p3-7.EL4.x86_64.rpm
  Canna-libs-3.7p3-7.EL4.x86_64.rpm
  FreeWnn-1.10pl020-5.x86_64.rpm
     : 中略
  a2ps-4.13b-41.x86_64.rpm
  acl-2.2.23-5.x86_64.rpm
  acpid-1.0.3-2.x86_64.rpm
  actlog-1.10-2.noarch.rpm
  alchemist-1.0.34-1.x86_64.rpm
  --続ける--  【スペース】キーで次頁
           【改行(Enter)】キーで1行スクロール
           【q】キーで終了

 もし、パッケージの名称が一部でもわかっているら grep を
 組み合わせてみる。

  # rpm -qa --qf '%{name}-%{version}-%{release}.%{arch}.rpm\n' | grep X

  %{name}など、どのようなものがあるかというと、;--querytagsオプション
  をつけてみると一覧が表示される。

   [root@EWSTUDIO01 ~]# rpm --querytags
  HEADERIMAGE
  HEADERSIGNATURES
  HEADERIMMUTABLE
  HEADERREGIONS
  HEADERI18NTABLE
  SIGSIZE
  SIGPGP
  SIGMD5
  PKGID
  SIGGPG
  PUBKEYS
  DSAHEADER
  RSAHEADER
  SHA1HEADER
  HDRID
  NAME         ← パッケージ名
  N
  VERSION       ← バージョン
  V
  RELEASE       ← リリース
  R
  EPOCH
    : 以下略


これらの文字は小文字指定でもOK


 パッケージの詳細?は、%{group} と %{summary} を組み合わせてみると大体何のパッケージかわかるかも

  # rpm -aq --qf '%{GROUP}\t%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}.rpm\t%{SUMMARY}\n'
  システム環境/ベース hwdata-0.146.22.EL-1.noarch.rpm ハードウェアー識別用データ
  システム環境/ライブラリ libgcc-3.4.6-3.i386.rpm GCC バージョン 3.0 共有サポートライブラリ
  システム環境/ベース redhat-logos-1.1.26-1.noarch.rpm Red Hat 関連のアイコンとロゴ
    : 以下略


  この例では、グループ・パッケージ名・内容がタブで区切られているので
  この出力内容をカット&ペーストでエクセルのシートに貼り付ければ簡単に
  表にすることも