【Git】Pushの際にユーザー名とパスワード入力を省略するツールを作ってみた

どうもハヤシです。

前回の記事では、Gitでリモートレポジトリにプッシュする際にコマンドラインから一括で実行できるツールの紹介をしました。

【Git】コマンドラインから一括でPushするツールを作ってみた

ただ、このツールだとプッシュの際にユーザー名とパスワードの入力をする必要があるんですよね。
折角だからこのユーザー名とパスワードの入力も省略してしまおう。
ということで、今回はPushの際にユーザー名とパスワード入力を省略するツールの紹介をしたいと思います。

ツール説明


本ツールは、以下のリンクから入手することが出来ます。
今回紹介するツールはリンク先の「git_omit.authentication.sh」という名前のシェルスクリプトです。

https://github.com/go12lim/UtilityTool

めんどくさい説明は要らないからさっさとツールを使いたいという人は、Readmeにも本ツールの使用方法が記載されてるのでそちらをご参考ください。

ツール概要

本ツールを実行し、設定ファイルを作成することで、以降のプッシュの際にユーザー名/パスワードの入力を省略することができます。
Gitでプッシュする際に毎回ユーザー名とパスワードを聞かれるのが煩わしい人向けです。

動作環境

動作環境はLINUXです。

使用方法

任意のディレクトリで本ツールを実行することで対話形式で設定ファイル(~/.netrc)を作成することができます。

※Gitのドメイン名の入力について
例)GitHub(https://github.com/)の場合、 github.comと入力してください。

解説

以上がツールの説明でした。
本章では、Gitの解説(そもそもツールで何をしてるんだ)とシェルスクリプトの解説を行います。

Gitの解説

まずは、Gitの解説から行きます。
このツールで何をしているのかというと結局は~/.netrcという設定ファイルを作成して以下のような記述をしているだけです。

machine gitのドメイン名
login gitのユーザー名
password gitのパスワード

~/.netrcという設定ファイルにgitのドメイン名、ユーザー名、パスワードを入力することでgitのプッシュの際に自動でユーザー名とパスワードを参照してくれます。
なので結論から言えば本ツールを使わずとも直接~/.netrcファイルを作成すればGitのプッシュの際のユーザー名とパスワード入力を省力することが出来ます。

シェルスクリプトの解説

続いて、シェルスクリプトの解説をします。


#!/bin/bash

FILE_PATH="$HOME/.netrc"

askYesNo(){
	while true; do
		read -p "$1 (y/n)>" input
		case $input in
		[yY] | [yY]es | YES ) return 0;;
		[nN] | [nN]o | NO) return 1;;
		*) echo "Please enter a valid value."
		esac
	done
}

writeFile(){

	read -p "Gitのドメイン名を入力してください:" domain
	echo "machine $domain" >> $FILE_PATH
	read -p "ユーザー名を入力してください:" user
	echo "login $user" >> $FILE_PATH
	read -p "パスワードを入力してください:" password
	echo "password $password" >> $FILE_PATH
}

if [ -e $FILE_PATH ]; then
	askYesNo "File exists. Do you want to overwrite it?"
	if [ $? -eq 0 ]; then
		>$FILE_PATH
		writeFile
	fi
else 
	touch $FILE_PATH
	writeFile
fi

1行目の#!/bin/bashはシェルスクリプトを書く際のおまじないです。
3行目では変数FILE_PATHを宣言しています。これは今回作成するファイルのパスです。
$HOMEはホームディレクトリを表します。
※ただし、FILE_PATHの宣言の際に、"~/.netrc"としないように注意してください。
~(tilde)$HOMEもホームディレクトリを表しますが、ダブルクォーテーションの中では~は展開されません。
詳しく知りたい方は、チルダ展開(tilde expansion)で調べてみてください。

5~14行目では、askYesNo()という関数を定義しています。
この関数は、ユーザーの入力がYesのとき0を返し、Noのとき1を返します。
案外説明が長くなるので今回は説明を割愛して別の記事で解説したいと思います。

16~24行目では、writeFile()という関数を定義しています。
readを用いることによってユーザーからのキー入力を読み込みます。
オプションに-pを指定することでコマンド上にメッセージを表示することが出来ます。
18行目では、ユーザーからのキー入力を変数domainに格納しています。

19行目では、リダイレクトを行っています。
シェルスクリプトでは通常キーボードから入力し、画面に出力しています。
>>を使うことによりこの出力先を変更することが出来ます。
たとえば、echo "hello" >> test.txtは、「hello」という文字をtest.txtに出力します。

26~35行目が、メインの処理になります。
メインの処理ではif文を用いて条件分岐を行っています。

シェルスクリプトでは、if文は

if [ 条件1 ]; then
処理1
fi

のように表します。

もし、条件1に当てはまらないときの記述もしたければ、

if [ 条件1 ]; then
処理1
else
処理2
fi

のように表します。

今回は、~/.netrcファイルの作成を行いたいので、if文で「~/.netrcファイル」がすでに存在しているか調べます。
ファイルが存在している場合は、上書きして良いか尋ねてファイルの上書き(あるいは何もしない)をします。
ファイルが存在していない場合は、ファイルの新規作成を行います。

if文でファイルが存在するか確認するには、if [ -e ファイル名 ]; thenのように記述します。
ファイルが存在するときにtrue, 存在しないときにfalseを返します。

touch ファイル名と記述することでファイルを作成することが出来ます。
29行目ではファイルの上書きを行っています。
これは、先述のリダイレクトを利用しています。
>>は追記を行うのに対して、>は上書きを行います。

ユーザーの許可なしにファイルの上書きをすると困りますよね。
ユーザーがファイルの上書きに同意した場合のみ上書きを行うのが良さそうです。
なので、ファイルの上書きを行う前に28行目でif文で条件分岐を行っています。
シェルスクリプトでは、$?という変数に直前に実行された関数の終了時ステータスが格納されています。
直前に実行された関数はaskYesNo()関数でこれはYesの場合(ファイルの上書きをしてよい場合)、0を返します。
なので、if [ $? -eq 0 ]; thenのようにif文を書きます。
-eqはイコールを表します。なので、$?(直前に実行された関数の終了時ステータス)が0のときtrueを返します。

注意点


パスワードを平文で保存することになるのでセキュリティ的に好ましくないです。
すでに別のシステムで.netrcファイルを利用している場合本ツールを使用することでファイルの内容が上書きされてしまいます。

【Git】コマンドラインから一括でPushするツールを作ってみた

どうも、ハヤシです。

GitでリモートレポジトリにPushする際に、毎回コマンドラインからgit addgit commitgit pushと3回コマンドを入力するのは面倒くさくないですか?

少なくともぼくは面倒くさいです。

というわけで、コマンドラインで実行することで、自動でローカルレポジトリの変更をコミットし、リモートレポジトリにプッシュしてくれるツールを作ったので公開します。

本ツールのみでは、プッシュの際にユーザー名とパスワードを入力する必要があります。
プッシュの際にユーザー名とパスワードの要求がされないようにするための方法については下記の記事で解説しています。

【Git】Pushの際にユーザー名とパスワード入力を省略するツールを作ってみた

ツール説明


本ツールは、以下のリンクから入手することが出来ます。
今回紹介するツールはリンク先の「git_automatic.sh」という名前のシェルスクリプトです。

https://github.com/go12lim/UtilityTool

めんどくさい説明は要らないからさっさとツールを使いたいという人は、Readmeにも本ツールの使用方法が記載されてるのでそちらをご参考ください。

ツール概要

このシェルスクリプトを実行することで自動でローカルレポジトリの変更をコミットし、リモートレポジトリにプッシュしてくれます。
git add, git commit, git pushと毎回3コマンドを打つのがめんどくさい人向けです。

動作環境

動作環境はLINUXです。

使用方法①

本ツールを当該プロジェクト直下(.gitが作成されている階層)に配置します。
ターミナルで当該プロジェクト直下に移動し、sh git_automatic.sh (引数1)と入力することでツールが実行されます。
例)

sh git_automatic.sh "commit message"

引数にコメントを入力することで任意のコミットメッセージを設定することができます。
引数にコメントを入力しない場合、デフォルトのメッセージがコミットメッセージとして設定されます。
デフォルトメッセージは、git_automatic.shの2行目にあるMESSAGE=${1:-"Default Message"}"Default Message"を直接書き換えることで変更されます。

使用方法②

本ツールを任意の位置に配置します。
環境変数が設定されているディレクトリにシンボリックリンクを生成します。
あるいは、シンボリックリンクを生成したディレクトリを環境変数に追加します。
環境変数は、echo $PATHで確認することができます。
シンボリックリンクは、ln -s (リンク元のファイルの絶対パス) (作成されるシンボリックリンクまでの絶対パス)で生成することができます。
例)

sudo ln -s $HOME/workspace/utility-tool/git_automatic.sh /usr/local/bin/gitauto

この際に、権限がないとエラーが生じた場合はlnの前にsudoを追加して再度実行してください。
当該プロジェクト直下で作成したシンボリックリンク名を入力することでツールが実行されます。
例)

gitauto "commit message"

それ以降は使い方①と共通です。

シェルスクリプトの解説


以上がツールの説明でした。
本章では、シェルスクリプトの解説をします。

#!/bin/bash
MESSAGE=${1:-"Default Message"}

git add -A
git commit -m "${MESSAGE}"
git push origin master 

1行目の#!/bin/bashはシェルスクリプトを書く際のおまじないみたいなもんです。
2行目では、変数MESSAGEを宣言しています。
シェルスクリプトでは、変数の宣言の際に他のプログラミング言語と同様に を使用します。
ただし、ほかの言語とは違い の前後にスペースをいれてはいけません。

$1は、シェルスクリプト実行時に指定した1番目の引数が設定される変数です。
同様に、2番目に指定した引数は$2に、n番目に指定した引数は$nに設定されます。
ちなみに、$0には、実行時のコマンド名が設定されます。
sh git_automatic.sh と実行した場合には「sh git_automatic.sh」が$0に設定されます。

${1:-"Default Message"}は、(1つ目の)引数が与えられている場合$1を返し、引数が与えられていない場合"Default Message"を返します。

したがって2行目では、引数が与えられている場合はその引数を変数MESSAGEに設定し、引数が与えられていない場合は「”Default Message”」を変数MESSAGEに設定するという処理を行っています。

4,5,6行目は普段コマンドラインに直接入力しているgit addgit commitgit pushのコマンドです。
git addのオプションには、-Aを指定しています。
これにより、新規作成・削除したファイルを含めgit管理内のすべての変更がステージングされます。
git commitのオプションには、-mを指定しています。
これによりコマンドラインからコメントを入力することが出来ます。
このオプションを省略した場合、対話形式でコメントを入力することになります。
また、コメントの内容には"${MESSAGE}"を指定しています。
${MESSAGE}とした場合だと変数MESSAGEに設定された文字列内に空白スペースがあった場合複数の引数として扱われてしまうためエラーが発生します。

注意点


本ツールでは、git addのオプションに-Aを指定しています。
したがって、本ツールを実行するとgit管理内のすべての変更がステージングされリモートレポジトリにプッシュされます。
そのためGitのもつバージョン管理といった本来の目的からはそれる使い方になっています。

【WordPress】SHH接続でサイトURL名をすっきりさせる方法

はじめに


上の画像を見て何か思うことはないでしょうか。

ん?何も思わない?

もういちど良く見てください。

ダサい。

そう絶望的にダサいのである(大事でもないけど2回言う)。

レンタルサーバーにWordPressをインストールした後、そのまま設定を変更しないでいると、ブログURLの後ろに「wordpress」やら「wp」などの余計なものがついた状態になっています。

今回は、このブログURLについている余計な部分を消す方法を紹介したいと思います。

この記事を読めばあなたのサイトのURLは以下のようにすっきりと表示させることができるようになります。

大まかな流れ


今回紹介するサイトURLを変更する方法の全体の流れは以下のようになっています。
①サイトアドレスのURLを変更
②レンタルサーバーに接続
③index.phpのディレクトリを変更
④index.phpを変更

今回はSSH接続でリモートからサーバーにアクセスして、サーバー上でindex.phpの編集を行います。

前提条件


前提条件というか、ぼく側の動作環境について。サーバーやOSなどの動作環境が異なると挙動が異なる恐れがあるので事前にご了承ください。
レンタルサーバーはロリポップを使用しています。
OSはWindows10を使用しています。

サイトアドレスのURLを変更


まず、WordPressにログインします。
ログインできたら、左側のメニューから「設定」→「一般」とクリックして「一般設定」画面に移動してください。

「一般設定」画面にあるサイトアドレスから「wordpress」を削除して変更してください。
そうするとサイトアドレスが本来表示したいアドレスになります。

ただ、この時点ではこのアドレスで意図するページにアクセスすることはできません。
それは、サイトアドレスを変更したものの、サーバー上でのファイルの位置を変更していないからです。
つまり、このURLで参照される場所にはファイルが存在しないのです。
なので、ファイルを読み込む場所を変更する必要があります。

レンタルサーバーに接続


Tera Termを使ってロリポップのサーバーにSSH接続をします。
接続方法は、以前の記事を参考にしてください。
【WordPress】SSH接続でWordPress作成

index.phpのディレクトリを変更


WordPressのインストール方法にも拠りますが、おそらく初期状態ではindex.phpは/wordpress/というディレクトリにインストールされます。ファイルを読み込む場所を変更するには、まずindex.phpを/wordpress/というディレクトリと同じ階層に移動させてあげる必要があります。

WordPressインストール時のディレクトリ構成図
index.phpを移動させた後のディレクトリ構成図
Tera Term上でのコマンド実行画面

index.phpの保存場所を変更するために、Tera Term上でLinuxコマンドを使用します。
今回使用したLinuxコマンドについてはのちほど詳細を解説します。

mv index.php ../

ざっくりと説明するとwordpressのディレクトリ上で上記のコマンドを入力することでindex.phpをwordpressと同じ階層に移動することができます。

index.phpを変更


index.phpを一旦ダウンロードしてローカル上で編集して再度アップロードするという方法でもサーバー上のindex.phpを書き換えることはできます。
ただ、今回はリモートでファイルの中身の書き換えも行おうと思います。

index.php(編集前)
index.php(編集後)
vi index.php

index.phpが存在するディレクトリで上記のコードを入力することでvi(vim)が立ち上がりindex.phpを編集する画面に移動します。vi(vim)エディタの使い方の詳細についてはのちほど解説します。

//before
require(dirname(_FILE_), '/wp-blog-header.php');
//after
require(dirname(_FILE_), 'wordpress/wp-blog-header.php');

index.phpの/wp-blog-header.phpという部分の前に/wordpressと追加してください。
これでサイトURL名の変更は完了です。お疲れさまでした。

Linuxコマンドの詳細な解説


Tera Term上でのコマンド実行画面

改めて今回使用したLinuxコマンドの詳細を解説していきます。

pwd #カレントディレクトリを絶対パスで表示します。

簡単に言うと、ディレクトリ階層上の現在地を表示します。前述のディレクトリ構成図の場合、wordpressというディレクトリでpwdを使用すると、/example.jp/wordpressという値が表示されます。

dir #カレントディレクトリにあるファイル・ディレクトリを表示します。

前述の例のwordpressというディレクトリでdirを使用すると、wp-admin, wp-includes, wp-contentのディレクトリとindex.php, wp-config.phpのファイルが表示されます。

cd dirname #カレントディレクトリを変更します。

dirnameに変更したいディレクトリ名を入力することでカレントディレクトリを変更します。
ディレクトリの指定には相対パスと絶対パスの両方を使うことが出来ます。

mv index.php ../ #ファイルを移動します。

上記のコマンドの場合、index.phpを../というディレクトリに移動するという意味です。../は相対パスによる指定であり、1つ上のディレクトリを指します。

Viコマンドの詳細な解説


vi index.php #vi(vim)エディタを開きます。

それでは、viエディタで最低限必要なコマンドを解説していきます。

「編集コマンド i」
コマンドモード(デフォルトの状態)でこのコマンドを入力することで編集モードに移動することが出来ます。編集モードの場合は、エディタの下の方にINSERTと黄色い文字で表示されています。

「編集モードを終了するコマンド Esc」
編集モードでエスケープキーを入力することで、編集モードからコマンドモードに移動することが出来ます。

「Viを終了するコマンド :q」
コマンドモードでこのコマンドを入力することでviエディタを終了することができます。このコマンドを使った場合は編集した内容は保存されません。

「保存してViを終了するコマンド :wq」
コマンドモードでこのコマンドを入力することでviエディタを終了することができます。このコマンドを使った場合は編集した内容は保存されます。

一応最低限これだけ覚えていればindex.phpを変更することができると思います。

【WordPress】SSH接続でWordPress作成

WordPressでブログを作ってみたのでその方法を共有したいと思います。
多くのレンタルサーバーには簡単にWordPressをインストールしてくれる機能があります。
ですが、それを使うとWordPressの構造が捉えるのが難しくなり結果的にその後の拡張で躓くことになると考えています。
なので、今後のことも考えて今回はあえて手動でインストールをしてみました。

サーバーについて


サーバーはロリポップというレンタルサーバーにしました。
理由は、ずばり値段です。PHP5.2.4、 MySQL5.0に対応してるレンタルサーバーの中では1番安いのではないでしょうか。
ただ、アクセスが集中する時間帯には速度が遅くなってしまうそうので、ある程度PVを稼げるようになったらほかのサーバーに移行することを検討しています。

ドメインについて


ドメインは今のところ独自では取得していません。こちらもある程度PVを稼げるようになったら取得しようと思います。

SSH接続でWordPressをインストール


さて、本題に入ります。今回は、SSH接続でWordPressをインストールします。

SSH接続にはTera Termを用いました。
Tera Termはこちらからインストールできます。

ロリポップ!ではデフォルトでSSH接続が有効になっていないので、「WEBツール→SSH」からSSH接続を有効にする必要があります。

SSH接続の有効化
ロリポップ!でSSH接続を有効にする。

次に、Tera Termを起動してサーバーとSSH接続をします。
ホスト名は、ロリポップ上のSSHのページから確認してください。
ホスト名はSSHページ上のサーバーに対応しています。
また、この際にポート番号をデフォルトの22から2222に変更することを忘れないでください。

TeraTerm_SSH接続
TeraTermのSSH接続画面

接続がうまくいくとSSH認証のログイン画面に移行します。
これもSSHのページから確認して入力してください。
SSH認証画面上のユーザー名がアカウント名、パスフレーズがSSHパスワードに対応します。

サーバー上にワードプレスをインストールします。
webディレクトリの直下で以下のコマンドを入力することでワードプレスをインストールするのに必要なZIPファイルをサーバーにダウンロードすることができます(2017年3月11日現在)。

また、直接ワードプレスのホームページからZIPファイルをダウンロードすることもできます。
この場合はダウンロードしたZIPファイルをSCP通信で同じくwebディレクトリの直下に転送してください。

wget --no-check-certificate https://ja.wordpress.org/wordpress-4.7.3-ja.zip

つぎに以下のコマンドを入力してZIPファイルを解凍してください。
lsコマンドで確認するとwebディレクトリの下にwordpressディレクトリが作成されていることが確認できるはずです。

unzip wordpress-4.7.3-ja.zip

ここで一旦ロリポップ!に戻り「WEBツール→データベース」からデータベースを作成してください。
その後、http://ドメイン名/wordpress/にアクセスして残りの設定を完了してください。
以上です。
少し端折った箇所もあり、何か分からないところがあれば気軽にコメント欄から質問してください。

次のステップ(2017年10月23日追記)


無事にワードプレスをインストールすることができました。
ある程度記事も増えてきてワードプレスを使いこなせるようになったあなたはこう思うはずです。

ブログURLの後ろにくっついている「wordpress」邪魔じゃね?

URLアドレスバー1
イメージ画像

以下の記事を読むことで、この問題を解決することが出来ます。

【WordPress】SHH接続でサイトURL名をすっきりさせる方法

さあ、この記事を読んでサイトURLをすっきりさせましょう。