-
Apache2導入
yum -y install httpd yum list installed | grep httpd
インストールした内容 httpd.x86_64 2.2.15-39.el6.centos httpd-tools.x86_64 2.2.15-39.el6.centos
cp -pi /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.org vi /etc/httpd/conf/httpd.conf
下記内容を変更 # サーバ情報表示内容 ServerTokens OS ↓ ServerTokens ProductOnly # サーバ署名表示内容 ServerSignature On ↓ ServerSignature Off # サーバー名 #ServerName www.example.com:80 ↓ ServerName z-area.net:80
【CentOS】セキュリティ向上その2
-
TCP WrapperによるSSH接続アクセス制御
SSH接続のセキュリティを高めるため、指定したクライアントのみから
サーバーにSSH 接続できるようにします。vi /etc/hosts.deny
下記内容を追加 ALL: ALL
vi /etc/hosts.allow
下記内容を追加 sshd: ALL
書式は「サービス名: IP」です。
denyは拒否するサービスとIPを指定。
allowは許可するサービスとIPを指定し、denyより優先。
ALLは「全て」を表します。ただしALLとはいってもLinuxの全てのサービスを拒否するわけではなく、
サービスのデーモンがTCP Wrapperのライブラリであるlibwrapを
含んでいるかどうかで決まるそうです。
-
SSH接続設定
vi /etc/ssh/sshd_config
下記内容のコメントを削除 # rootでのログイン禁止 #PermitRootLogin yes ↓ PermitRootLogin yes # 空パスワード禁止 #PermitEmptyPasswords no ↓ PermitEmptyPasswords no 下記内容を追加 # hogeユーザのみログイン許可 AllowUsers hoge
/etc/rc.d/init.d/sshd restart
-
SELinux無効化
vi /etc/sysconfig/selinux
下記内容を変更 SELINUX=enforcing ↓ SELINUX=disabled
-
バッファオーバーフロー対策
vi /etc/sysctl.conf
# 下記内容を最終行に追加 # exec-shield kernel.exec-shield = 2
-
TeraTermの公開鍵設定
Raspberry Piと同様なので省略。
TeraTermで生成した鍵を保存する際は任意の名前に変更できます。
サーバーの数が複数ある場合、秘密鍵の名前は変えておいた方が管理が楽。
【CentOS】セキュリティ向上その1
-
作業ユーザ追加
useradd hoge passwd hoge
パスワードを2回入力 ユーザー hoge のパスワードを変更。 新しいパスワード: 新しいパスワードを再入力してください: passwd: 全ての認証トークンが正しく更新できました。
-
rootになれるユーザへ追加
usermod -G wheel hoge
-
rootになれるユーザの制限
vi /etc/pam.d/su
下記内容のコメントを解除 #auth required pam_wheel.so use_uid ↓ auth required pam_wheel.so use_uid
コメント解除するのはsufficientの方ではなく、requiredの方です。
vi /etc/login.defs
下記内容を追加 SU_WHEEL_ONLY yes
visudoコマンドも制御します。
visudo
下記内容を変更 # %wheel ALL=(ALL) ALL ↓ %wheel ALL=(ALL) ALL
【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
-
iptablesの設定
【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