エックスサーバーにsshコマンドで接続しgit pushでファイルアップロードする手順(ターミナル利用)
エックスサーバーに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環境を構築する手順は以下を参考にしてください。
次の流れで進めて行きます。
- Xserverにgitリポジトリ作成
- localの開発環境でgit init
- 開発中のファイルをアップロード
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出来る環境は構築できませんでしたが、無事にローカルで表示していたサイトを公開することが出来ました。
発生した問題とその対応
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したら出来ました!(上記の説明は修正済みです。)
ディスカッション
コメント一覧
まだ、コメントがありません