文系seの備忘録

Excelの改行でひたすらスペースを打っていた機械音痴の文系seが日々の備忘録を綴る。

公開鍵方式でパスワードなしのssh接続を行う

最近linuxをちょっと触る機会があったので、そのとき毎回パスワード入れてアクセスするの面倒だなぁ・・と思っていたら
パスワードなしでssh接続が出来るというのが分かったのでやってみました。




ssh接続とは

Secure Shell(セキュアシェル)の略称で、リモートコンピュータと通信するためのプロトコル
Windowsでいう「リモートデスクトップ」と同じ役割です。
ssh接続での認証方式には、パスワード認証と公開鍵認証があります。
デフォルトではパスワード認証になっています。


■ パスワード認証の場合

[user1@clientserver ~]$ ssh tomcat@192.168.137.127
 (もしくは、[user1@clientserver ~]$ ssh tomcat@hostserver.sample-net.com としてもOK)
と入れると
tomcat@hostserver.sample-net.com's password:
パスワードを聞かれます。

これがおなじみのパスワード認証です。



■ 公開鍵認証の場合

あらかじめ、接続元でカギを作っておいて、そのカギで通信します。

パスワード認証だと適当にパスワードを入れて中に入られてしまう危険があります。
誰がサーバーに接続しているかは、「/var/log/secure」のログを見ると分かります。

Sep 5 16:25:40 aaaserver login[8276]: FAILED LOGIN SESSION FROM (null) FOR sakurai,Authentication failure
Sep 5 16:26:40 aaaserver login[8276]: FAILED LOGIN SESSION FROM (null) FOR sakurai,Authentication failure
Sep 5 16:26:59 aaaserver login[8276]: FAILED LOGIN SESSION FROM (null) FOR sakurai,Authentication failure

こんなのがずらっと並んでると思います。
上記では"sakurai"というユーザーが何度もパスワードを入れて失敗しているのが分かります。
外部からのアクセスかもしれませんし、社内であれば予想されるパスワードを入れて悪用するといったことも考えられます。


公開鍵方式の場合は、接続元で秘密鍵と公開鍵を作成し、接続先には公開鍵だけ渡します。
接続先は渡された公開鍵で暗号化し、接続元に送ります。
これを秘密鍵で復号化します。

公開鍵暗号方式の説明はこのリンクの図が分かりやすいです)
viral-community.com



***************************


今回はこの公開鍵方式を利用して、ssh接続をパスワード入力なしで行ったときのつまずいた箇所を書き留めておきます。
(公開鍵の作成方法はネットを見れば沢山情報があるかと思うので割愛します)




・気を付けたいこと(超初心者向け)



■ 接続するユーザーで鍵を作り、接続されるユーザーに鍵を登録する

 私が見たネットの説明だと「root権限で鍵を作る」と書いてありました。
 何も考えず鵜呑みにしてrootで作ったら失敗しました。

 接続される側の/root/.ssh/authorized_keysを確認すると分かりますが
 
 ssh-rsa xxxABC9876564321・・・・ root@sampleserver
 ssh-rsa xxxZYX1234567890・・・・ ninomiya@sampleserver
 
 といったように、ユーザーごとに公開鍵の情報が登録されているためです。
 
 公開鍵を作ったのにまだパスワードを聞かれるぞ・・・となったら、
 ログインしようとしているユーザーの「/home/ユーザー/.ssh以下を確認し、id_rsa.pub(公開鍵)
 が存在しているか確認してください。



■ 別のツールから実行する場合、PasswordAuthenticationがyesになっていることを確認する

SSH pluginを利用してjenkinsからリモートサーバーのコマンドを実行するように設定した。
そしたら以下のエラーが発生


[SSH] Exception:Auth fail
com.jcraft.jsch.JSchException: Auth fail
at com.jcraft.jsch.Session.connect(Session.java:452)
at com.jcraft.jsch.Session.connect(Session.java:150)
at org.jvnet.hudson.plugins.SSHSite.createSession(SSHSite.java:141)
at org.jvnet.hudson.plugins.SSHSite.executeCommand(SSHSite.java:151)
at org.jvnet.hudson.plugins.SSHBuilder.perform(SSHBuilder.java:60)
at hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.java:20)
at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:782)
at hudson.model.Build$BuildExecution.build(Build.java:205)
at hudson.model.Build$BuildExecution.doRun(Build.java:162)
at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:534)
at hudson.model.Run.execute(Run.java:1738)
at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
at hudson.model.ResourceController.execute(ResourceController.java:98)
at hudson.model.Executor.run(Executor.java:410)
Build step 'Execute shell script on remote host using ssh' marked build as failure


認証に失敗。。。
/etc/ssh/sshd_config の PasswordAuthentication がnoになってました。

参考:PowerVM クラウド・プロバイダーからのエクスポートの状況が「Auth fail」になる
http://www.ibm.com/support/knowledgecenter/ja/SSGRP3_2.1.0/doc/ICON/topics/tsicn_authfail.html


「PasswordAuthentication」は冒頭に書いたパスワード認証のことなので、これはyesにしておいたほうが良いと思います。




・・と、色々と躓きましたが公開鍵を使うとパスワードなしでssh接続ができて、セキュリティ的にも、操作的にもメリットが沢山あります。


これでパスなし接続が出来るようになりました!ばんざい。

linuxにoracleを入れてsqlplusを起動・実行する(ORA-12154 トラブルシューティング編)

昨日の続きです。
linuxにoracleを入れてsqlplusを起動する - 文系seの備忘録

昨日はsqlplusを入れて起動させるところまでやりました。
こんどはログインして実際にsqlを発行しデータのやりとりを行うところです。

私はこの設定であれこれ苦戦しましたので記録を残しておきます。
具体的に言うと、これから記載する内容に抜けがわんさかあったせいで、実行するたびに何度も

ORA-12154: TNS: サービス名を解決できませんでした。
ORA-12154: TNS: 指定された接続識別子を解決できませんでした
ORA-12154: TNS:could not resolve service name
ORA-12154: TNS:could not resolve the connect identifier specified

このメッセージを見るはめになりました・・・orz




1.環境変数の設定
ホームディレクトリの .bashrc / .bash_profile に設定しておく
前回記事でも書いたように、「export」では端末をオフして再度ログインしたときには
その情報は消えてしまいます。
su でrootユーザーに切り替えて、/home/ユーザー/.bash_profileに環境変数を設定しておきます。

パスの設定などで使うもの
ORACLE_BASE
  ベースとなるディレクトリ。例:/opt/app/oracle
  必須ではないが設定しておくと他の環境変数の記述やバージョン管理が容易になったりする。
ORACLE_HOME
  (必須)Oracleがインストールされているディレクト
ORACLE_SID
  (必須)接続する識別子
PATH
  (必須)ORACLE_HOME/bin を追加しておく。




2.tnsnames.ora の設定
クライアント側に必要なファイル。
$ORACLE_HOME/network/admin ディレクトリにあるものが参照されるので、そこに作成する。

tnsnames.oraを検索すると

# find / -name tnsnames.ora

/opt/app/oracle/product/11.2.0/dbhome_1/network/admin/samples/tnsnames.ora


samplesの中にサンプルのファイルがあったけど、サンプル見てもよく分かんなかったので以下のページを参考に作成しました。
tnsnames.ora - オラクル・Oracleをマスターするための基本と仕組み


ここで注意。
・ tnsnames.oraに無駄な半角、全角スペースがないことを確認する
 慣れないlinuxのviでの編集で、知らないうちに先頭にスペースが入ってしまってこれが原因で動作しないというケースがありました。
その他、サービス名などをスペルミスしたり等の記述ミスに注意してください・・・。




3.sqlnet.ora の設定

クライアントとサーバ両方に必要なファイル。
これも$ORACLE_HOME/network/admin ディレクトリ 以下に作っておきます。

NAMES.DIRECTORY_PATH= (TNSNAMES, ONAMES, HOSTNAME)






これで自分の場合はsqlplusにてsql実行することが出来ました。

もし、これでもtnsエラーが出る場合について、メモしておきます。




トラブルシューティング

・古いバージョンのoracleがインストールされてて、そっちのtnsnames.oraが参照されてしまっている
ORACLE_HOMEに古いオラクルのパスが記述されていたら、それを一旦コメントアウトしてみるか、順番を変えて実行してみる

・TNS_ADMIN環境変数が間違って登録されている
TNS_ADMIN は本来設定されてないと思いますが、おかしなディレクトリに設定されてしまったりしてないか念のため確認しておく。
.bash_profileに参照すべきtnsnames.oraの場所が指定されていればOK

・他環境のtnsnames.oraの記述をコピってきて、一部だけ変更した際に情報が誤っていた
私はこれをやらかしました。凡ミスです。
コピー元が「12.1.0」で、自分の環境は「11.2.0」なのに気付かず実行してました。




このエラーが出たとき、何が原因なのか、何が足りてないのか?
何を設定すればよいのか?
全てが分からず混乱でした。。

ネットで調べても、「tnsnames.oraについて」といった個別にピックアップされた情報は出てくるんだけど、
必要なもの一覧的なものは見つからなかったのでしらみつぶし的な進め方になってしまった。


意外と苦戦しちゃったなぁ。。。

linuxにoracleを入れてsqlplusを起動する

1.sqlplusのダウンロード

Instant Client downloads for Linux x86-64
oracleのアカウント登録が必要。

rpmというコマンドでインストールする。
# rpm -ivh oracle-instantclient12.1-sqlplus-12.1.0.2.0-1.x86_64.rpm
zipファイルみたいに圧縮されててサーバーから展開することも可能なコマンドです。

ダウンロードする場所は/opt/app/oracleあたりでいいかと思います。

んで、これをやったら
「エラー: 依存性の欠如:」
と言われました。あーめんどくさ!
なんか足りないものがあるようですが解凍したいだけなので一時的に解決させときます。
# rpm -ivh --nodeps oracle-instantclient12.1-sqlplus-12.1.0.2.0-1.x86_64.rpm
「--nodeps」が依存性を無視して実行するオプションです。

Preparing... ################################# [100%]
Updating / installing...
1:oracle-instantclient12.1-sqlplus-################################# [100%]

こんなんが出てきてsqlplusとライブラリがインストールされます。






2.パスを通す

マシンの起動時にパスを読み込むようにするため、各ユーザーの設定ファイルに書いておきます。
export~でパスを通すと端末を再ログインした際にはその情報はクリアされてしまうので注意。

・home/ユーザ名/.bash_profile
の「# User specific environment and startup programs」の下あたりに以下を追加。


 ・export ORACLE_SID=接続するDBのサービス名
 ・export ORACLE_HOME=/opt/app/oracle/product/xx.x.x/dbhome_x(インストールしたverによって異なる)
 ・PATH=$PATH:$ORACLE_HOME/bin

この3つを追加して動いたので、とりあえずはこれで大丈夫なんじゃないかと思います。


上記を設定し終えたら起動してみます。


# sqlplus

SQL*Plus: Release 11.2.0.4.0 Production on Mon Aug 29 17:17:43 2016

Copyright (c) 1982, 2013, Oracle. All rights reserved.

Enter user-name:


でも、これだけではログインしようとしても「 ORA-12154: TNS:could not resolve the connect identifier specified」と言われてしまいます。
その対策は後半戦で。

HTMLファイルをjspに変換する

■ HTMLって?

HTML(Hyper Text Markup Language)
タグを使って作られてます。


阿部寛さんの公式ホームページが分かりやすいので使用させてもらいます。
阿部寛のホームページ


このページ上で F12 もしくはオプションから「開発者ツール」「デベロッパー ツール」(ブラウザにより名前が違います)
をクリックしてコードを見てみます。

f:id:ron623:20160725193116p:plain
※ なんだか懐かしい造りですが公式HPですよ!


下になんか出てきました。これがこのホームページのソースコードです。

ここでダブルクリックすると編集できます。(chromeで実施。他のブラウザは出来ないかも)
ためしに「ドラマ出演」のページで、出演記録の内容を変えてみました。
f:id:ron623:20160725193300p:plain
※ 実際のホームページの内容は書きかわっておらず、あくまで自分のPCでの表示が変わっただけです



jspって?

java server page
サーバー上で動き、htmlページの中にjavaのコードを書けます。

jspの作り方

0.tomcatをダウンロードしておく
  jspはサーバー上で動きます。なのでTomcatを入れておきます。
Tomcat/ webapps/ arashi(任意のフォルダ名)/ jsp
  jspを入れる
Tomcat/ webapps/ arashi/ WEB-INF
  こっちにjavascriptとかライブラリとか入れとく

1.拡張子を「.jsp」にする
先ほどの阿部寛さんホームページもメモ帳に貼り付けて「.jsp」で保存すればjspになります。
・・ので、HTMLページに動作を加えたいってときにはjspファイルにしてスクリプトを埋め込めばOKです。

2.スクリプトを記述する
<%> ~ <%>のなかにjavaのコードを書きます。
例) 現在日時を取得
現在日時:<%= new java.util.Date() %>


今回は好きなアイドルグループのメンバーにメッセージを送るページを作ってみました。

<!-- このようにしてコメントをかけます -->
<!-- これは文字コードを指定するためのもの。なくても動く(環境による) -->
<%@ page contentType="text/html;charset=Shift_JIS" %>

<html>
<head>
<title></title>
</head>
<body>
<font color = " dimgray">
<p align="left">&nbsp;</p>
<fieldset class="black_bokashi" style="HEIGHT: 614px; WIDTH: 515px">
<br>
<p align="left"><strong><font size="7" color="darkgray">message for member<br></font></strong>
<br><br>

<!-- javaコード記述で現在日時を取得 -->
<strong>現在日時:<%= new java.util.Date() %></strong>
<br><br>
<strong>アーティスト区分</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<select style="WIDTH: 174px"><option selected>アーティスト区分選択</option><option value="1">1</option><option value="2">2</option><option value="3">3</option><option value="4">4</option><option value="5">5</option><option value="6">6</option><option value="7">7</option><option value="8">8</option><option value="9">9</option></select><br>
・
・
・
(以下省略)


jspは以下においたので
f:id:ron623:20160725195520p:plain

URLはこうなります。
http://localhost:8080/arashi/jsp/message.jsp


ブラウザから見てみます。
f:id:ron623:20160725202042p:plain

f:id:ron623:20160725201918p:plain

データベースからメンバー情報をとってきたり時刻を表示したり、javaのプログラムの処理が行えました。



これがhtmlだとどうなるかというと、、
f:id:ron623:20160725195241p:plain
当然ですがjavaプログラムと認識されずそのまま文字として表示されます。

java gold紫本の新版が3年越しでついに発売

java 紫本、ついに新版出ます。


・オラクル認定資格教科書 Javaプログラマ Gold SE 8 (EXAMPRESS)

オラクル認定資格教科書 Javaプログラマ Gold SE 8 (EXAMPRESS)

オラクル認定資格教科書 Javaプログラマ Gold SE 8 (EXAMPRESS)



2013年に発売した紫本から実に3年。

SE 8へのバージョンアップによって拡大した出題範囲を詳しく解説。
サンプルコードで動作を確認しながら学習できるとともに、試験対策として豊富な練習問題と模擬試験を掲載。

サンプルコード付きなのが良いです。
silverのときもテキストでの学習だけでなく、けっこうコーディングをして実際に動かして理解したので・・。



java se7と比較して

ラムダ式
・Stream API
・Date and Time API

などが追加になりました。


APIの使い方と、se8で新しく増えた機能を理解することがカギとなりそうです。




最近rubyばかりでjavaはご無沙汰なので、javaの基本文法と概念(オブジェクト指向など)を復習しなくては。
こういう試験は期間をあけずに取るべきだなぁ~と改めて感じました。
リハビリたいへん。

Encoding::CompatibilityError の対処方法と cannot load such file -- 2.2/gherkin_lexer_en

rubyのバージョンを上げて以来、Encoding::CompatibilityError というエラーが発生。

Encoding::CompatibilityError は互換性のない文字列連結などで発生するらしい。

けど、ソースいじってないし実行マシンの設定も変えてない。


実行時のログを見てみると
WARNING: cannot load such file -- 2.3/gherkin_lexer_en


"cannot load such file" 再び。
今度は「gherkin_lexer_en」ってのが見つからないよって言われた。

なんだこのファイルは。GENKINGと空目してしまう。
調べたらfeatureファイルの書式の1つに「Gherkin 書式」というものがあるそう。


このファイルが読めてないせいで、エンコーディングがうまくいかずにエラーになってるっぽい。




下記ページに対処方法が載っている
watir - cucumber Couldn't load 2.1/gherkin_lexer_en - Stack Overflow



対処方法

1.gherkin 2.12.2 をインストールする
2.c_lexer.rbのprefix = の部分を置き換える

  ・ファイルの場所
  例)version2.3.0の場合
  C:\Ruby23-x64\lib\ruby\gems\2.3.0\gems\gherkin-2.12.2-x86-mingw32\lib\gherkin

  ・元々書いてある以下をコメントアウトして、
  prefix = RbConfig::CONFIG['arch'] =~ /mswin|mingw/ ? "#{RbConfig::CONFIG['MAJOR']}.#{RbConfig::CONFIG['MINOR']}/" : ''

  ・以下を追記
  prefix = ''



注意点

※ 上記対応は動かしているrubyのバージョンのファイルに対して行います。

インストールしたrubyディレクトリ以下それぞれにファイルが作られているため。。

これは2.2系
f:id:ron623:20160714100959p:plain

これは2.3系
f:id:ron623:20160714101008p:plain

関連:rubyの最新バージョンをインストールするとろくなことがない (cannot load such file -- ffi_c (LoadError)) - 文系seの備忘録


ただし・・・
・バージョンアップするごとに毎回書き換えるのが面倒
・別の環境で実行したときにわざわざ書き換えなきゃいけないのは面倒
という問題があるかと思います。
その場合は実行時にcopyコマンドでファイルごと上書きするよう設定しておくと良いと思います。

例) バグ対応パッチをどこかにおいておいて、それを2.3系にコピーする
copy /Y xxx\c_lexer.rb C:\Ruby23-x64\lib\ruby\gems\2.3.0\gems\gherkin-2.12.2-x86-mingw32\lib\gherkin\c_lexer.rb
※ 別のrubyバージョンを使うときにはcopy先のフォルダを変更すればOKです




再度実行してみたところ、Encoding::CompatibilityError は消えました。

rubyの最新バージョンをインストールするとろくなことがない (cannot load such file -- ffi_c (LoadError))

7/5

Rubyの最新バージョンを入れて、jenkinsからジョブを実行したところこんなエラーがでました。
C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/ffi-1.9.13-x64-mingw32/lib/ffi.rb:6:in `require': cannot load such file -- ffi_c (LoadError)

ffiってのはForeign Function Interfaceという多言語を呼び出すためのIFらしい。
これが読み込めないよって言われてる。


ジョブを実行してるノードで以下コマンドを実行したところ、
gem list

ffi自体は入ってるっぽい。
ffi (1.9.10 x64-mingw32)


しかたなく実際にそのディレクトリを覗いてみました。
f:id:ron623:20160713195234p:plain
・・・ああ。確かに2.3系用のファイルがありません。



7/12

上記エラーが解消されてました。
LoadErrorと言われてたパスの場所を見に行くと
f:id:ron623:20160713195350p:plain

2.3系用のライブラリフォルダが作成されてました。


今回はほっといたら直ったので良かったけど、すぐに動かしたいってときにはgemを入れなおすとかする必要があるみたいです
can't find ffi_c with ruby 2.2.1 on Windows · Issue #432 · ffi/ffi · GitHub



最新版を適用するとこういうことがあるので厄介ですね。。