【VPNサーバ】OpenVPN導入その4

Windowsを利用してOpenVPNの動作確認ができたので、
元々やりたかったiPhoneで外からRaspberry Piに繋げます。

OpenVPNクライアントを追加するため、まずはサーバー側で証明書、鍵を作成します。

  • OpenVPN設定(クライアント用の証明書と鍵作成(追加))
    1度Windows用に証明書と鍵作成を行っているため、手順が短くて済みます。

    cd /etc/openvpn/easy-rsa
    source ./vars
    ./build-key クライアント名(追加)
    

    varsファイルを読み込むと「you run ./clean-all」が表示されますが、
    これは以前に1度実行しているため、実行不要です。
    実行すると「/etc/openvpn/easy-rsa/keys」内が初期化され、
    再度、認証局から作り直しとなります。(やりました)

    iPhoneでOpenVPNを利用する場合もWindowsと同様で、
    「OpenVPN導入その1」で作成した証明書や鍵のうち、
    クライアントで利用するものをWindowsにUSB等で持ってきて、設定を行います。

  • クライアント設定ファイル(iPhone用)
    iPhone用のクライアント設定ファイルとして「クライアント名(追加).ovpn」ファイルを作成します。

    下記内容を追加
    # tunデバイス、udpプロトコル、OpenVPNサーバの1194番ポートをクライアントとして利用
    dev tun
    proto udp
    remote z-area.net 1194
    client
    
    # 名前解決試みのリトライ数(無限)
    resolv-retry infinite
    
    # ローカルポートをバインドしない
    nobind
    
    # 再接続時に鍵読み込み、tunデバイスオープン
    persist-key
    persist-tun
    
    # OpenVPNのログ設定
    verb 3
    
    # LZO圧縮を利用
    comp-lzo
    
    # 認証局証明書、クライアント(追加)証明書、クライアント(追加)秘密鍵の内容貼り付け
    <ca>
    -----BEGIN CERTIFICATE-----
    ca.crtの内容を貼り付け
    -----END CERTIFICATE-----
    </ca>
    <cert>
    -----BEGIN CERTIFICATE-----
    クライアント名(追加).crtの内容を貼り付け
    -----END CERTIFICATE-----
    </cert>
    <key>
    -----BEGIN PRIVATE KEY-----
    クライアント名(追加).keyの内容を貼り付け
    -----END PRIVATE KEY-----
    </key>
    
  • iPhoneへ証明書と鍵の移動
    Apple StoreからVPNクライアントのアプリとして「OpenVPN」をダウンロードします。
    次にiTunesからダウンロードした「OpenVPN」を選択して、
    「クライアント名(追加).ovpn」を移動します。

    次にiPhoneの操作に戻ると、「+」マークが出ているので、
    設定ファイルを読み込み、OpenVPNに接続します。
    「Connected」になれば成功です。
    左上に「4G VPN」と表示されるはずです。

    はまりやすい注意点は自宅で作業をしている場合、
    ルーターのWifiには接続しないように4G回線や別回線でやること。

  • iPhoneから自宅のLinuxへ接続
    OpenVPNアプリで「4G VPN」接続状態になったら
    SSH接続アプリで自宅のLinuxに接続確認を行います。

    私は「vSSH Lite」を利用しました。
    有名なのは「Prompt」ですが、無印は公開中止になり、
    「Prompt2」のみになってしまったようなので、「vSSH Lite」を利用してみました。

    接続するLinuxはSSHで接続する際、秘密鍵が必要になるので、
    iTunesから「vSSH Lite」を選択して秘密鍵を移動します。

    2つのLinuxに外から接続確認してみました。
    【Raspberry Pi】
    IPは10.8.0.1でOpenVPNサーバーの仮想IPを指定してみました。

    【VMWare上のCentOS】
    IPは192.168.XXX.XXXで自宅LAN内のIPを指定してみました。

    どちらも無事接続成功です。

【VPNサーバ】OpenVPN導入その3

OpenVPNクライアントをWindowsにインストールしてみました。

利用したファイルは「openvpn-install-2.3.4-I605-x86_64.exe」で、
インストール時に右クリックし「管理者として実行」で、画面に従いインストールしました。

「OpenVPN導入その1」で作成した証明書や鍵のうち、
クライアントで利用するものをWindowsにUSB等で持ってきて、
「OpenVPNインストールフォルダ/OpenVPN/config」に配置します。

  • クライアント設定ファイル
    OpenVPNクライアント側の設定を行います。

    先ほど配置したconfigフォルダに「クライアント名.ovpn」を作成します。

    下記内容を追加
    # tunデバイス、udpプロトコル、OpenVPNサーバの1194番ポートをクライアントとして利用
    dev tun
    proto udp
    remote z-area.net 1194
    client
    
    # 認証局証明書、クライアント証明書、クライアント秘密鍵のパス設定
    ca ca.crt
    cert クライアント名.crt
    key クライアント名.key
    
    # 名前解決試みのリトライ数(無限)
    resolv-retry infinite
    
    # ローカルポートをバインドしない
    nobind
    
    # 再接続時に鍵読み込み、tunデバイスオープン
    persist-key
    persist-tun
    
    # OpenVPNのログ設定
    verb 3
    
    # LZO圧縮を利用
    comp-lzo
    
    # 共有鍵の利用
    #tls-auth ta.key 1
    

「OpenVPN GUI」を起動し、接続が成功すれば
サーバーの設定、クライアントの設定とも完了です。
接続完了後、コマンドプロンプトから「ipconfig /all」を打つと
「ローカルエリア接続2」という接続情報が増えており、
「10.8.0.X」とIPが振られていることが確認できます。

【VPNサーバ】OpenVPN導入その2

鍵の作成が終わったので、次に設定ファイルを作成、修正していきます。

  • パケット転送設定
    下記2ファイルを修正します。

    vi /etc/sysctl.conf
    
    下記コメントアウトを外す。
    #net.ipv4.ip_forward=1
    ↓
    net.ipv4.ip_forward=1
    

    viじゃなぜか編集できなかったので、リダイレクトで設定変更。

    echo 1 > /proc/sys/net/ipv4/ip_forward
    
  • サーバー設定ファイル

    vi /etc/openvpn/server.conf
    
    下記内容を追加
    # tunデバイス、udpプロトコル、1194番ポートを利用
    dev tun
    proto udp
    port 1194
    
    # 認証局証明書、サーバー証明書、サーバー秘密鍵、鍵交換用のパス設定
    ca /etc/openvpn/ca.crt
    cert /etc/openvpn/サーバー名.crt
    key /etc/openvpn/サーバー名.key
    dh /etc/openvpn/dh1024.pem
    
    # OpenVPNの実行権限(OpenVPNインストール時に作成されるユーザとグループ)
    user nobody
    group nogroup
    
    # OpenVPNの仮想ネットワークと仮想サブネットマスク
    server 10.8.0.0 255.255.255.0
    
    # 起動時に鍵読み込み、tunデバイスオープン
    persist-key
    persist-tun
    
    # OpenVPNのログ設定
    status /var/log/openvpn-status.log
    log-append /var/log/openvpn
    verb 3
    
    # OpenVPNクライアント間の接続許可
    client-to-client
    
    # OpenVPNクライアント側の全てのトラフィックをOpenVPNサーバー経由(デフォルトゲートウェイ:10.8.0.2)
    # 「route -n」で確認可能
    push "redirect-gateway def1"
    
    # DHCP設定(DHCP利用しないため、詳細不明)
    push "dhcp-option DNS 8.8.8.8"
    push "dhcp-option DNS 8.8.4.4"
    
    # LZO圧縮を利用
    comp-lzo
    
    # OpenVPNクライアントのIP固定設定を利用
    client-config-dir ccd
    
    # 共有鍵の利用
    #tls-auth ta.key 0
    

    下記サイトを参考にしました。
    英語サイトですが、コマンドは一緒なので雰囲気で。
    http://raspberrypihelp.net/tutorials/1-openvpn-server-tutorial

  • サーバー設定ファイル(注意点1)
    pushを「”」で括っていますが、色々な参考サイトを見ていると、
    「”」(全角のダブルクォーテーション)になっているサイトがありますが、
    正しくは「”」(半角のダブルクォーテーション)です。

    クライアントはWindowsとiPhoneでそれぞれ試したところ、
    WindowsはどちらでもOpenVPNに接続成功しますが、
    iPhoneでは「”」(半角のダブルクォーテーション)でないとエラーになりました。

    全く同事象でエラーとなっていた人がいました。
    https://forums.openvpn.net/topic12789.html

  • サーバー設定ファイル(注意点2)
    「tls-auth ta.key 0」はコメントアウトしています。
    前回も記載していますが、有効になっているとiPhoneからの接続が出来なかったためです。
  • クライアントの仮想IP固定設定
    VPNクライアントの仮想IPは固定が推奨らしいので、設定を行います。

    mkdir /etc/openvpn/ccd
    vi /etc/openvpn/ccd/クライアント名
    
    下記内容を追加
    ifconfig-push 10.8.0.X 10.8.0.X+1
    

    Xは決まった数値がありますが、他のサイトを参考にしてください。

  • OpenVPN起動

    /etc/init.d/openvpn start
    

    エラーが発生する場合、下記のログを確認します。

    view /var/log/openvpn
    

    私のRaspberry Piでは下記の内容が出力されていました。

    Note: Cannot open TUN/TAP dev /dev/net/tun: No such device (errno=19)
    

    下記サイトを確認するとrebootが有効とのことで、
    再起動後にコマンドを実行してみたところ、無事起動しました。

    http://blog.paulregan.co.uk/2013/02/raspberry-pi-openvpn.html

  • ファイアウォール設定
    ファイルウォールの設定を行います。
    私のRaspberry Piはiptablesのラッパー的な役割をするufwを導入しているため、
    iptablesだけではなく、ufwの設定も行います。

    • iptablesの設定

      iptables -t filter -A INPUT -i eth0 -p udp -m udp --dport 1194 -j ACCEPT
      iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j SNAT --to 192.168.XXX.XXX
      

      「–to」にはRaspberry Piの通常のIPを指定します。
      再起動すると設定が消えるため、自動設定できるようにするのが良いです。
      (ここでは記載省略)

    • ufwの設定

      ufw allow 1194
      vi /etc/ufw/before.rules
      
      下記内容を「# End required lines」と「# allow all on loopback」の間に追加
      # OpenVPN Configuration
      -A ufw-before-input -i tun+ -j ACCEPT
      -A ufw-before-output -i tun+ -j ACCEPT
      -A ufw-before-forward -s 10.8.0.0/24 -j ACCEPT
      -A ufw-before-forward -d 10.8.0.0/24 -j ACCEPT
      
      ufw disable
      ufw enable
      

【VPNサーバ】OpenVPN導入その1

外から自宅サーバをいじってみたくなったので、OpenVPNを導入します。
Raspberry Piで動いてるサービスをNUCに移行したら
Raspberry PiはOpenVPNサーバ専用かもしれません。

  • OpenVPN導入
    まずはパッケージを最新化します。
    しばらくやってなかったので、結構長かったです。

    aptitude update
    aptitude upgrade
    

    OpenVPNをインストールします。
    相変わらずインストールはコマンドで一瞬。

    aptitude install openvpn openssl
    

    opensslは以前にApache2にSSLを導入した際に
    最初から入ってたような気がしたのですが、入れちゃいました。

  • OpenVPN設定(準備)
    Apache2のSSLではサーバー側で公開鍵、秘密鍵を利用していましたが、
    OepnVPNを利用するにはサーバー側、クライアント側の両方で公開鍵、秘密鍵を利用します。

    Apache2の時と同様に鍵の正当性を証明するために、OpenVPN用のオレオレ認証局を作成します。
    OpenVPNをインストールするとOpenSSLを簡単に利用できるツール「easy-rsa」が
    同時にインストールされるのでそれを利用します。
    OpenVPNのディレクトリにツール「easy-rsa」をコピーしておきます。

    現在では「easy-rsa」は3.0まで公開されていて、
    それを利用すると以降に記述した2.0の手順よりさらに短く簡単に設定できるようです。
    今回は2.0の手順になります。

    cd /etc/openvpn
    cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0 ./easy-rsa
    

    認証局作成、サーバー用の証明書と鍵作成、クライアント用の証明書と鍵作成で
    参照する変数用のファイル作成もしておきます。
    作成しておくと入力の手間が省けます。

    vi /etc/openvpn/easy-rsa/vars
    
    下記内容を変更
    export EASY_RSA="`pwd`"
    ↓
    export EASY_RSA="/etc/openvpn/easy-rsa"
    
    export KEY_COUNTRY="US"
    ↓
    export KEY_COUNTRY="JP"
    
    export KEY_PROVINCE="CA"
    ↓
    export KEY_PROVINCE="TOKYO"
    
    export KEY_CITY="SanFrancisco"
    ↓
    export KEY_CITY="Akihabara"
    
    export KEY_ORG="Fort-Funston"
    ↓
    export KEY_ORG="OreOreCA"
    
    export KEY_EMAIL="me@myhost.mydomain"
    ↓
    export KEY_EMAIL=""
    
    export KEY_CN=changemeからexport PKCS11_PIN=1234はコメントアウト
    
  • OpenVPN設定(認証局作成)
    認証局を作成する際に「openssl.cnf」を参照するため、
    サンプルファイルの「openssl-1.0.0.cnf」を「openssl.cnf」としてコピーしておきます。

    cd /etc/openvpn/easy-rsa
    cp -pi openssl-1.0.0.cnf openssl.cnf
    

    さらに先ほど事前作成しておいたvarファイルを環境変数として有効化しておきます。

    source ./vars
    
    NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys
    

    初期化してから実行しろということなので、初期化後にオレオレ認証局を作成します。

    ./clean-all
    ./build-ca オレオレ認証局名(適当)
    
    Generating a 1024 bit RSA private key
    ...............++++++
    ....++++++
    writing new private key to 'ca.key'
    -----
    略
    

    括弧内にvarsファイルで予め設定しておいた設定内容が表示されるので、
    問題なければそのままEnter押下して作業を進めます。

  • OpenVPN設定(DHパラメータ作成)
    DHパラメータはサーバーとクライアントで鍵を交換するために利用するそうです。

    ./build-dh
    
  • OpenVPN設定(サーバー用の証明書と鍵作成)

    ./build-key-server サーバー名
    

    途中でチャレンジパスワード、会社名付属、署名にサインされるか聞かれますが、
    チャレンジパスワード、会社名付属はブランクでEnter、署名はyで入力します。
    最後のコミットもyで入力します。

  • OpenVPN設定(クライアント用の証明書と鍵作成)

    ./build-key クライアント名
    

    実行するファイル名がサーバーと似ていますが微妙に違うので注意。

  • OpenVPN設定(共有鍵作成)
    セキュリティ強化の一環として、共有鍵をさらに作成可能です。
    この鍵はツール「easy-rsa」ではなく、openvpnコマンドを利用して作成します。

    openvpn --genkey --secret /etc/openvpn/easy-rsa/keys/ta.key
    

    私の環境では、iphoneから利用する場合、ta.keyがあると
    OpenVPNに接続できなかったので、利用しませんでした。

作業完了すると「/etc/openvpn/easy-rsa/keys」に下記ファイルが作成されています。
他にも作業ファイルが作成されていますが、記載していません。

ファイル名概要権限備考
ca.crtオレオレ認証局の証明書644サーバー、クライアントで利用
ca.keyオレオレ認証局の秘密鍵--
サーバー名.crtサーバーの証明書644サーバーで利用
サーバー名.csrサーバーの公開鍵--
サーバー.keyサーバーの秘密鍵600サーバーで利用
クライアント名.crtクライアントの証明書-クライアントで利用
クライアント名.csrクライアントの公開鍵--
クライアント.keyクライアントの秘密鍵-クライアントで利用
dh1024.pem鍵交換用644サーバーで利用
ta.key共有鍵--

サーバーで利用する4ファイルはディレクトリ移動しておきます。
実行権限も表の通りではない場合は修正しておきます。

cd /etc/openvpn
cp -pi /etc/openvpn/easy-rsa/keys/ca.crt .
cp -pi /etc/openvpn/easy-rsa/keys/サーバー名.crt .
cp -pi /etc/openvpn/easy-rsa/keys/サーバー.key .
cp -pi /etc/openvpn/easy-rsa/keys/dh1024.pem .

クライアントで利用する3ファイルはUSBメモリ等でクライアントに移動しておきます。
keysディレクトリ内のファイルは削除しても問題ないようですが、
クライアントを追加したい場合、ca.crtやca.keyを参照したりするので、一旦削除しないでおきます。

【CentOS】無線LNA設定

  • 「wpa_supplicant」の設定

    無線LAN設定には「wpa_supplicant」というサービスが必要らしいので、
    インストール有無を確認します。

    rpm -qa | grep -i wpa_supplicant
    

    何も画面に出ない場合はインストールされていません。
    案の定、画面に出てこなかったので、インストールします。

    yum install wpa_supplicant
    

    「wpa_supplicant」の設定ファイルを編集します。

    cp /etc/wpa_supplicant/wpa_supplicant.conf  /etc/wpa_supplicant/wpa_supplicant.conf.org
    wpa_passphrase "SSID" "パスワード" >> /etc/wpa_supplicant/wpa_supplicant.conf
    

    SSIDはルーターの固有のIDを設定します。
    パスワードはルーターの側面とかに貼ってあるKEYを設定します。
    設定内容を確認します。

    cat /etc/wpa_supplicant/wpa_supplicant.conf
    
    ctrl_interface=/var/run/wpa_supplicant
    ctrl_interface_group=wheel
    
    network={
            ssid="SSID"
            #psk="パスワード"
            psk=パスワードが暗号化された文字列
    }
    

    上記内容を変更していきます。

    vi /etc/wpa_supplicant/wpa_supplicant.conf
    
    ctrl_interface=/var/run/wpa_supplicant
    ctrl_interface_group=wheel
    
    network={
            ssid="SSID"
            key_mgmt=WPA-PSK
            proto=WPA WPA2
            pairwise=CCMP TKIP
            group=CCMP TKIP
            psk=パスワードが暗号化された文字列
    }
    

    暗号化される前のパスワードは削除しておきます。
    暗号に関する設定値は2つ設定すると前者が先に有効になり、
    前者が適用できない場合、後者の設定を参照します。

    暗号の組み合わせは5通りかな。
    WEP、WPA-TKIP、WPA-CCMP(AES)、WPA2-TKIP、WPA2-CCMP(AES)
    WEPは暗号強度が弱いので選択肢から除外しました。

    もう1ファイル設定します。

    vi /etc/sysconfig/wpa_supplicant
    
    下記内容を変更
    INTERFACES=""
    ↓
    INTERFACES="-iwlan0"
    
    DRIVERS=""
    ↓
    DRIVERS="-Dwext"
    
  • NIC(wlan0)の設定

    「wpa_supplicant」の設定が完了したので、NICの設定を行います。
    有線LNAで設定したeth0は無効化しておきます。

    vi /etc/sysconfig/network-scripts/ifcfg-eth0
    
    下記内容を変更
    ONBOOT=yes
    ↓
    ONBOOT=no
    

    wlan0に無線LANの設定を行います。

    vi /etc/sysconfig/network-scripts/ifcfg-wlan0
    
    下記内容に変更
    DEVICE=wlan0
    HWADDR=初期設定
    TYPE=Wireless
    UUID=初期設定
    ONBOOT=yes
    NM_CONTROLLED=yes
    BOOTPROTO=static
    NETWORK=192.168.XXX.0
    NETMASK=255.255.255.0
    GATEWAY=192.168.XXX.1
    IPADDR=192.168.XXX.AAA
    BROADCAST=192.168.XXX.255
    DNS1=192.168.XXX.1
    ESSID=SSID
    

    有線LANと違うところは「DEVICE」「TYPE」「ONBOOT」「ESSID」の4つ。

  • 「wpa_supplicant」の起動設定

    サーバーが再起動しても自動起動できるようにしておきます。

    vi /etc/rc.d/rc.local
    
    下記内容を最終行に追加
    sevice wpa_supplicant start
    ifup wlan0
    

    自動起動といえば「chkconfig」かと思い、設定してみましたが、
    上手くいかなったので、上記設定でやっています。

    これで無線LAN繋げましたが、重すぎます。
    別端末からTeraTermで接続すると重すぎて入力が遅れて返ってきます。
    有線LANに戻すかしばらく様子見です。

【Java】JavaでXML解析

JavaでXMLを解析します。

  • XMLファイル

    <?xml version="1.0" encoding="UTF-8"?>
    <sample>
    	<location>
    		<area name="area1">
    			<shop type="kanto_shopName1" required="111" />
    		</area>
    		<area name="area2">
    			<shop type="sikoku_shopName1" required="222" />
    			<shop type="sikoku_shopName2" required="333" />
    		</area>
    		<area name = "area3">
    			<shop type="kansai_shopName1" required="444" />
    			<shop type="kansai_shopName2" required="555" />
    			<shop type="kansai_shopName3" required="666" />
    		</area>
    	</location>
    </sample>
    
  • XMLファイル読取

    /*
     * メイン処理を実行します。
     * @param args 引数
     */
    public static void main(String[] args) {
    
        try {
            File fileObject = new File("src/conf/test.xml");
            DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
            Document document = docBuilder.parse(fileObject);
            NodeList nodeList = document.getChildNodes();
            scanNodes(nodeList);
            System.out.println("マップサイズ:" + resultMap.size());
    
            for (String key : resultMap.keySet()) {
                List<Z_XmlAnalyzerBean> list = resultMap.get(key);
                System.out.print("全体キーは" + key + "@");
                for (int i=0; i<list.size(); i++) {
                    Z_XmlAnalyzerBean bean = list.get(i);
                    System.out.print(bean.getKey() + ":" + bean.getValue() + ", ");
                }
                System.out.println("");
            }
    
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
  • XMLファイル解析

    /*
     * ノードリストを再帰的に解析します。
     * @param nodeList ノードリスト
     */
    public static void scanNodes(NodeList nodeList) {
    
        for (int i=0; i<nodeList.getLength(); i++) {
            Node node = nodeList.item(i);
            if (Node.ELEMENT_NODE == node.getNodeType()) {
                NamedNodeMap nodeMap = node.getAttributes();
                if (nodeMap != null) {
                    for (int j=0; j<nodeMap.getLength(); j++) {
                        if (nodeMap.item(j).getNodeName().equals("name")) {
                            String mapKey = nodeMap.item(j).getNodeValue();
                            List<Z_XmlAnalyzerBean> list = new ArrayList<Z_XmlAnalyzerBean>();
                            resultMap.put(mapKey, list);
                        }
    
                        if (nodeMap.item(j).getNodeName().equals("type")) {
                            String mapValueKey = nodeMap.item(j).getNodeName();
                            String mapValueValue = nodeMap.item(j).getNodeValue();
                            System.out.println(mapValueKey + ":" + mapValueValue);
    
                            Node parentNode = node.getParentNode();
                            NamedNodeMap parentNodeMap = parentNode.getAttributes();
                            String parentZokuseiName = parentNodeMap.item(0).getNodeName();
                            String parentZokuseiValue = parentNodeMap.item(0).getNodeValue();
                            System.out.println("親:" + parentZokuseiName + "," + parentZokuseiValue);
    
                            List<Z_XmlAnalyzerBean> list = resultMap.get(parentZokuseiValue);
                            Z_XmlAnalyzerBean bean = new Z_XmlAnalyzerBean();
                            bean.setKey(mapValueKey);
                            bean.setValue(mapValueValue);
                            list.add(bean);
                        }
                    }
                }
            }
    
            if (node.hasChildNodes()) {
                scanNodes(node.getChildNodes());
            }
        }
    }
    
  • XML要素格納Bean

    public class Z_XmlAnalyzerBean {
    
        private String key = null;
        private String value = null;
    
        public String getKey() {
            return key;
        }
        public void setKey(String key) {
            this.key = key;
        }
        public String getValue() {
            return value;
        }
        public void setValue(String value) {
            this.value = value;
        }
    }
    

【Java】Javaからシェル呼び出し

JavaからWindowsのコマンドプロンプトを呼び出して、
ファイルコピーは実施したことありましたが、
現場の実作業でLinuxのシェルを呼び出して欲しいと言われました。
普通はナイナイと話していたのに実際にあるとは驚きました。

自宅で試してみました。

  • 呼ばれる側

    cat /home/ユーザ名/java/シェル名.sh
    #!/bin/sh
    echo "Hellow World !!"
    cd aaaa
    

    標準出力とエラー出力の両方があった場合を試したかったので、
    わざと存在しないディレクトリに移動しています。
    実行権限をつけておきます。

    chmod -x シェル名
    
  • 呼び出し側

    /**
     * メイン処理
     * @param args 引数
     */
    public static void main(String[] args) {
    
        ArrayList<String> cmd = new ArrayList<String>();
        cmd.add("/home/ユーザ名/java/シェル名.sh");
    
        try {
                ProcessBuilder processBuilder = new ProcessBuilder(cmd);
                processBuilder.redirectErrorStream(true);
                Process process = processBuilder.start();
                InputStream inputStream = process.getInputStream();
                printInputStream(inputStream);
                System.out.println(process.waitFor());
        } catch (Exception e) {
                e.printStackTrace();
        }
    }
    
    /**
     * 入力ストリームの内容を出力する。
     * @param inputStream 入力ストリーム
     * @throws IOException [入出力エラーが発生した場合]
     */
    public static void printInputStream(InputStream inputStream) throws IOException {
            try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));) {
                for (;;) {
                    String line = bufferedReader.readLine();
                    if (line == null) {
                        break;
                }
                    System.out.println(line);
            }
        }
    }
    
  • 実行結果

    javac クラス名.java
    java クラス名
    
    Hellow World !!
    /home/ユーザ名/java/シェル名.sh: line 3: cd: aaa: そのようなファイルやディレクトリはありません
    1
    

    ProcessBuilderクラスのredirectErrorStreamをtrueにしたので、
    標準出力とエラー出力が同時に出力されています。
    ただしこのバッファは1024バイトまでらしいです。
    ⇒echoで1050バイトほど出力するようなシェルにしてみましたが、
     出力できてしまいました。謎です。

    また、異常終了したので戻り値も「1」になっています。

  • 恥ずかしながらはまったこと
    シェル名.shをWindowsで作成していたため、改行コードがCRLFのままでした。
    改行コードがCRLFのままシェルを実行すると、下記エラーが出力されます。

    -bash: ./シェル名.sh: /bin/bash^M: bad interpreter: そのようなファイルやディレクトリはありません
    

    「^M」が出ているのがわかります。
    sedコマンドでLFに置換しました。

    sed -i 's/r//' /home/ユーザ名/java/シェル名.sh
    

【CentOS】初期設定

  • パッケージ最新化
    最初にyumで利用可能なパッケージを最新化しておきます。

    yum -y update
    
    Loaded plugins: fastestmirror, security
    Determining fastest mirrors
    Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=6&arch=x86_64&repo=os error was
    14: PYCURL ERROR 6 - "Couldn't resolve host 'mirrorlist.centos.org'"
    Error: Cannot find a valid baseurl for repo: base
    

    DNS1がないためエラーになってました。名前解決できなかった模様。
    DNS1を設定し再度実行すると成功しました。

    最小構成でインストールした分を最新化。

    yum -y groupinstall "Base" "Development tools" "Japanese Support"
    
  • cron導入
    次にcronをインストールし、起動しておきます。

    yum -y install yum-cron
    /etc/rc.d/init.d/yum-cron start
    

    さらにchkconfigでサーバ起動時に自動起動できるように登録しておきます。

    chkconfig yum-cron on
    chkconfig --list yum-cron
    
    yum-cron        0:off   1:off   2:on    3:on    4:on    5:on    6:off
    

    数字のメモ。

    0:システム停止モード
    1:セーフモード
    2:マルチユーザーモード(NFSマウントなし)
    3:X Windows以外のデーモンのほとんどを起動する動作モード
    4:未使用
    5:X Windowsのデーモンも起動する動作モード
    6:システム再起動モード
    

    「/etc/rc.d」を確認すると下記構成。
    init.d ディレクトリ:各機能の起動ファイルあり
    rc[0-6].d ディレクトリ:ランレベルに応じた起動ファイルあり
    rc.local ファイル:起動時に実施したい外部ファイルを指定
    rc ファイル:中身確認してません
    rc.sysinit ファイル:中身確認してません

  • ホストネーム変更
    ホストネームを変更しておきます。

    vi /etc/hosts
    
    下記内容に変更
    localhost.localdomain
    ↓
    任意のホスト名
    
    vi /etc/sysconfig/network
    
    下記内容を追加
    HOSTNAME=任意のホスト名
    

    私の環境ではインストール時にホスト名を入力したので、自動設定されたようです。

  • 文字コード
    文字コードがUTF-8になっていることを確認します。

    cat /etc/sysconfig/i18n
    
    LANG="ja_JP.UTF-8"
    
  • nkfの導入
    nkfで文字コードや改行コードの確認や変換で便利なので導入します。

    yum -y install nkf
    

    インストール後に確認を行います。

    nkf -g /var/log/secure
    
    ASCII (LF)
    

再起動、シャットダウンはRaspberry Piと同じコマンドでした。

【CentOS】有線LAN設定

家庭の事情で無線LANになりそうですが、初期設定を行うまでは
ひとまず有線LANで繋ぐので、有線LANの設定を行います。
NICがちゃんと認識されているか確認。

ifconfig
lo 略
eth0 略
wlan0 略

eth0が有線用、wlan0が無線用。
eth0の設定を行います。

cd /etc/sysconfig/network-scripts
cp ifcfg-eth0 ifcfg-eth0.org
vi ifcfg-eth0
下記内容に変更
DEVICE=eth0
HWADDR=初期設定
TYPE=Ethernet
UUID=初期設定
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
NETWORK=192.168.XXX.0
NETMASK=255.255.255.0
GATEWAY=192.168.XXX.1
IPADDR=192.168.XXX.AAA
BROADCAST=192.168.XXX.255
DNS1=192.168.XXX.1

私の環境ではDNS1の設定がないと動きませんでした。
上記設定を行い、ネットワーク再起動します。

/etc/rc.d/init.d/network restart

これで他の端末からTeraTermで接続できます。

CentOSのネットワークの設定ファイルについてメモ。

  • /etc/sysconfig/network
    共通のネットワーク設定ファイル。
  • /etc/sysconfig/network-scripts/ifcfg-eth[0-9]
    個別のネットワーク設定ファイル。共通のネットワーク設定内容を継承している。
  • /etc/resolv.conf
    DNSサーバのIPを記述するファイル。
    DNS1の設定を行い、ネットワークを再起動すると自動で設定される。
  • /etc/hosts
    IPアドレスとホスト名をマッピングするファイル。
    DNSを参照する前にこっちを参照する。
  • /etc/host.conf
    「/etc/hosts」やDNSのどれから参照するかの順番を定義するファイル。

【CentOS】NUC(DN2820FYKH)にCentOS6.5導入

USBの準備ができたので、CentOS 6.5をインストールします。
起動後にログが出たらF2を押下し、
BIOSのBootOrderのAdvancedを選択します。
UFFIのチェックを外し、LegacyのUSBを選択してEnterを押下すると、
インストールが始まります。

  • 言語
    Japaneseを選択します。
    テキストモードでは日本語表示できないから、英語で続けるとか注意書きが出ますが、
    OKを選択して進めます。
  • キーボード
    jp106を選択します。
  • InstallationMethod
    USBなのでHard driveを選択します。
  • Select Partition
    どのディスクパーティションからインストールするかを選択します。
    下記のような選択肢がありましたが、「/dev/sdb1」を選択。

    /dev/sda1
    /dev/sdb1
    Direcory holding image:ブランク
    

    1つ目がHDD、2つ目がUSBかな。
    ここで1つ目がUSBになっている場合、かつ、
    以降のインストールもテキストモードでインストールする場合、
    インストーラーがブートローダーを自動的に設定するので、
    ブートローダーがUSBに作られてしまうことがあるらしいです。

    私の環境では以降のインストールがグラフィックモードで、
    ブートローダーを選択できたため、問題は発生しませんでした。

グラフィックモードでインストール中は基本デフォルト設定で
変更したのは下記の通り。

  • タイムゾーンの設定
    「システムクロックでUTCを使用」はチェックを外します。
  • CentOSのインストールタイプ
    Minimalと今すぐカスタマイズを選択し、下記の3つをチェックします。
    言語/日本語のサポート
    開発/開発ツール
    ベースシステム/ベース

これでCentOS 6.5がインストール完了です。