エックスサーバーにsshコマンドで接続しgit pushでファイルアップロードする手順(ターミナル利用)

2020年6月16日

エックスサーバーにsshコマンドで接続する方法を紹介します。
説明の都合上、サーバーIDを「sample]として説明してますので、ご自身のサーバーIDに置き換えてください。

エックスサーバーのssh設定

公式のSSH設定の手順に沿って、公開鍵認証用の鍵ペアを作成。作成された秘密鍵をダウンロードします。
ダウンロードした秘密鍵は、任意の場所に保存。

ダウンロードした秘密鍵のファイルを移動

後々、git pushでエックスサーバーにソースファイルをアップロードする野望があるので、Git Bash環境にて以下のコマンドで設定します。

$ mkdir ~/.ssh
$ mv ~/Downloads/sample.key ~/.ssh/

秘密鍵のファイル名を変更

秘密鍵の名前を変更します。今回は、「id_xserver_rsa.key」としています。

$ mv ~/.ssh/sample.key ~/.ssh/id_xserver_rsa.key

sshコマンドでログイン

次のコマンドでログインします。

$ ssh -l sample -i ~/.ssh/id_xserver_rsa.key sample.xsrv.jp -p 10022

次の表示が出たときは、「yes」と入力してください。で無い場合もあるようです。

Are you sure you want to continue connecting (yes/no/[fingerprint])?

次のようにパスワードの入力を求められるので、公開鍵用の鍵ペアを作成した時に入力したパスワードを入力します。
パスワード入力でよくある、入力した文字を記号で隠す機能はありません。何も表示されていなくても入力は出来ているので、パスワード入力してEnterキーを押しちゃってください。

Enter passphrase for key 'id_xserver_rsa.key’:

ログアウト

ログアウトする場合は以下コマンドを入力します。

$ exit

sshコマンドによるログインの簡略化

上記コマンドを毎回入力するのは面倒なので、configファイルを作成してログインコマンドを簡略化します。

$ touch ~/.ssh/config

viコマンドや、テクストエディタで、configを次のように記入します。

なお、「IdentityFile “~/.ssh/id_server_rsa.key"」がダブルクオーテーションで囲われているのは、ユーザー名に全角が入っているからです。
windowsのユーザーに全角が入っている場合は上手く動かなかったのですが、ダブルクオーテーションで囲むとログインできました。

Host sample
HostName sample.xsrv.jp
Port 10022
User rott
IdentityFile “~/.ssh/id_xserver_rsa.key"
ServerAliveInterval 60

これで以下コマンドでログイン可能です。

$ ssh sample

XserverにGitリポジトリの作成

FlaskでHello Worldを表示した環境にgitを構築していきます。
ローカルで開発したソースコードをgit pushして即時反映されることを想定してます。
なお、XserverにFlask環境を構築する手順は以下を参考にしてください。

次の流れで進めて行きます。

  1. Xserverにgitリポジトリ作成
  2. localの開発環境でgit init
  3. 開発中のファイルをアップロード

Xserverにgitリポジトリを作成

$ git init

gitプロジェクトで任意のファイルを除外する設定

gitプロジェクト直下に「.gitignore」ファイルを作成

$ touch .gitignore

「.gitignore」ファイルを編集して、除外ファイルを指定。1行に1つの除外ファイルを記載
「__pycache__/」を除外します

初回コミット

ソースコードを「git add」して初回コミット。
commitしたら、メールアドレスが未登録だと怒られたので登録しています。

$ git add -A
$ git config –global user.email “you@example.com"
$ git config –global user.name “Your Name"
$ git commit -m “Flask環境構築"

ローカル環境にクローン

以下のコマンドでクローン。パスワード入力を求められるので、入力します。
上に書いている通り、ssh sampleでアクセスできるようにしているため、ホスト名やポートの指定は必要なしです。※後述しますがここでハマりました。
cloneすると、public_htmlにクローンされるのですが、このままだと、どこのサイトのソースコードかわからなくなってしまうので、target_domainにリネームしてます。

$ git clone ssh://sample/home/sample/target_domain/public_html/.git
$ mv public_html target_domain

ローカル環境に開発したソースをコミット

あらかじめ、PC内でgit管理していたソースコードをローカルリポジトリ内に移動。コミットして、git pushしました。

$ git add -A
$ git commit -m "ソースコード追加"
$ git push origin

しかし、git pushでエラーが発生。
push先のgitがノンベアなのがエラーの原因。git構成を見直す必要があり面倒なので、ファイルアップロードにシフト。
リモートgitにpush出来る環境は時間があるときに・・・。

 ! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'ssh://sample/domain/public_html/.git'

scpコマンドでファイルアップロード

git pushは一旦あきらめて、ファイルアップロードでサーバーに送り、リモート環境でgit pushすることにしました。

ファイルのアップロードはscpコマンドを使用します。
ssh用にconfigを設定しているので、以下のコマンドでアップロードします

$ scp app.py sample:~/domain/public_html/
$ scp -r static/ templates/ src/ sample:~/domain/public_html/

ファイルアップロード後に、ssh接続してgit commitします。

xserverにデプロイ完了

結果的に、git push出来る環境は構築できませんでしたが、無事にローカルで表示していたサイトを公開することが出来ました。

https://video-collected.com/

発生した問題とその対応

git cloneでPermission deniedエラー発生【解決】

ホスト名、ポートなど指定してgit cloneしてみたがエラー

$ git clone ssh://sample@sample.xsrv.jp:10022/home/sample/target_domain/public_html/.git
Cloning into 'public_html’…
sample@sample.xsrv.jp: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

httpsでcloneを試すもnot foundエラー

$ git clone https://target_domain/.git
Cloning into 'target_domain’…
fatal: repository 'https://target_domain/.git/’ not found

gitのリポジトリの概念が理解できてない

そもそも、僕がやろうとしていた、リモートにもワーキングディレクトリをもって、ローカルリポジトリで作成したソースコードをpushすれば良さそうと、素人考えて思っていたのですが、そもそも、それが良くないようです。
単純にgitの構成、特にベアリポジトリ、ノンベアリポジトリの理解が足りてなかった。
と一瞬だけ思ったが、cloneは本番リポジトリからしているので、これが問題ではなさそう

gitのノンベアリポジトリ、ベアリポジトリでわかりやすかったサイト

~/.ssh/config ファイルを作成した時は、コマンドが異なる

gitのコマンドでsshの鍵がうまく使えていないのでは?という疑問に達し見つかったのがこのページ。
記載されているコマンドを参考にcloneしたら出来ました!(上記の説明は修正済みです。)

git

Posted by きむら