ssh接続で制限してるgitアカウントに対して別アカウントからpushできるようにする

概要

gitアカウントに対して別アカウントからpushできるようにしたら便利だな〜と思い、 git push origin mainした時に Permissionエラーになった。

どうやらssh接続でcloneは誰でもできるがpushは特定のユーザーしかできないように過去の自分は設定していたようだ(偉い。。) 別gitアカウントのレポジトリにpushできるように調べた。

エラー内容

ERROR: Permission to [ユーザーID]/[レポジトリ名].git denied to [会社のgitのユーザーID].
fatal: Could not read from remote repository.

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

対応

  • 別アカウントhogeからアクセスできるように鍵を作成
$ ssh-keygen -t rsa -f id_rsa_hoge -b 4096 -C ""
// 何も入力せずEnter or パスワードとなる文字列を入力
$ cd ~/.ssh/
$ vi config

Host github_hoge   <---- アクセスするときの名称
  HostName github.com
  IdentityFile ~/.ssh/id_rsa_hoge <----自分の秘密鍵
  User git
  • 公開鍵の中身をコピー(mac
$ pbcopy < ~/.ssh/id_rsa_hoge.pub
  • アクセスしたいレポジトリのユーザーの「setting」 → 「SSH and GPG keys」で公開鍵を追加  ※レポジトリのsettingではない!

  • テスト

$ ssh -T github_hoge
$ Hi hoge! You've successfully authenticated, but GitHub does not provide shell access.
  • リモートレポジトリでmainがあれば削除しておく
  • ローカルにクローン
$ git clone git@github.com:hoge/sample_repository.git
  • リモートの向き先でホスト名を変更。(~/.ssh/configで設定している場合)
$ cd レポジトリのディレクトリ
$ git remote set-url origin [Host名]:[ユーザID]/[リポジトリ].git

// こんな感じになる
[remote "origin"]
        url = github_hoge:hoge/sample_repository.git
  • push
$ git push origin main

参考になりました、ありがとうございます。

https://tofusystem.work/programming-hack/easy-ssh-login-setting/

https://qiita.com/shizuma/items/2b2f873a0034839e47ce

ssh接続されたgitアカウントに対して別アカウントからpushできるようにする

概要

ssh接続されたgitアカウントに対して別アカウントからpushできるようにする。 git push origin mainした時に Permissionエラーになった。

ssh接続で制限されている別gitアカウントのレポジトリにpushできるようにする。

エラー内容

ERROR: Permission to [ユーザーID]/[レポジトリ名].git denied to [会社のgitのユーザーID].
fatal: Could not read from remote repository.

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

対応

  • 別アカウントhogeからアクセスできるように鍵を作成
$ ssh-keygen -t rsa -f id_rsa_hoge -b 4096 -C ""
// 何も入力せずEnter or パスワードとなる文字列を入力
$ cd ~/.ssh/
$ vi config

Host github_hoge   <---- アクセスするときの名称
  HostName github.com
  IdentityFile ~/.ssh/id_rsa_hoge <----自分の秘密鍵
  User git
  • 公開鍵の中身をコピー(mac
$ pbcopy < ~/.ssh/id_rsa_hoge.pub
  • アクセスしたいレポジトリのユーザーの「setting」 → 「SSH and GPG keys」で公開鍵を追加  ※レポジトリのsettingではない!

  • テスト

$ ssh -T github_hoge
$ Hi hoge! You've successfully authenticated, but GitHub does not provide shell access.
  • リモートレポジトリでmainがあれば削除しておく
  • ローカルにクローン
$ git clone git@github.com:TOMOYUKI-n/ManagementTwitter.git
  • リモートの向き先でホスト名を変更。(~/.ssh/configで設定している場合)
$ cd レポジトリのディレクトリ
$ git remote set-url origin [Host名]:[ユーザID]/[リポジトリ].git

// こんな感じになる
[remote "origin"]
        url = github_hoge:hoge/sample_repository.git
  • push
$ git push origin main

(sanctum不使用)Laravel+VueでSession認証を作る時はKernel.phpの順番に注意

Laravel8 + Vue-cli でSPAを作成するにあたって、セッション認証の箇所でハマりました。 仕様上データベースは別サーバーなので、sanctumは使わずRedisを用いてsession認証を行います。 その際ページリロードでセッションが継続できない事態にハマってしまいました。

注意:ここでははまった箇所のメモ書き程度なので、本格的な SPAの作成手順はわかっているものとして記述しています。

状況

1、以下の処理を作成 ・ログインするとアクセストークンを作成、セッションとRedisに保存する。 ・その後リクエストが来ると、セッションから登録したキーを取得、Redisの内容と一致するかチェック ・OkならActionへ、NGなら認証エラーを返却

2、app/Http/Kernel.phpapiでもセッションが利用できるように登録

            // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
            'throttle:api',
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,

3、ログインしてmiddlewareが適用されている適当なapiを作成して叩く 4、ページを更新して再度適当なapiを叩く ・・・ここでDebugで出しているセッションが出ずにnullになっていました。

結論、app/Http/Kanel.phpに記述するapiの箇所にて throttle:api よりも上に記述する必要があった。

            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
            'throttle:api',
            \Illuminate\Routing\Middleware\SubstituteBindings::class,

取り急ぎ覚え書き。

docker起動時にPort でエラー

ふと触る時があったので。 

 

docker-compose up -d

 これでdockerを起動すると、、、

 

Cannot start service https-portal: Ports are not available: listen tcp 0.0.0.0:80: bind: address already in use

 

 というエラーに遭遇。

 

 

以下、解決方法 

今使っている portを確認

 

sudo lsof -i -P | grep ":80"

f:id:TMLabo:20210703200403p:plain

 

lsofでhttpdと出ている場合は Apatchのプロセスが既に起動している。

:80ポートを使用している複数のプロセス(105, 879)は、

すべてApache httpdの親プロセスが管理している子プロセスに当たる。

よって、親プロセスを停止させることで対応。

 

sudo apachectl stop

 

 以上

【Ruby on Rails】undefined method `each' for nil:NilClassの原因と対応

環境:

Ruby 2.6.3

発生事象:

undefined method `each' for nil:NilClass

f:id:TMLabo:20200201132538p:plain

結論:

エラーが出たので探っていくと、コードの後ろに全角スペースがある。

恐怖の全角スペースエラー探しを、身をもって味わいました。

viewファイルがこちら:

h1.c-page_title 日記一覧

= link_to '日記の登録', new_diary_path, class: 'c-btn'

table.c-table
tbody.c-table__body
- @diaries.each do |diary|
tr.c-table__tr
td.c-table__td = link_to diary.title, diary, class: 'c-link'
td.c-table__td = diary.created_at

 

コントローラー:

class DiariesController < ApplicationController
 
def index
@diaries = Diary.all
end

def show
end

このindex の後ろに、全角スペースが隠れておりました。

 

過程:

エラーの意味は、undefined method `each' for nil:NilClass

 →つまり「each」メソッドがないから、そんなものは実行できない、という意味です。

 したがってここの @diaries  nil らしい。

 

次に@diariesというインスタンス変数は、コントローラで作成されている。

コントローラが怪しいが一見大丈夫。

 

スペルを何度もみても、間違えていない。

カーソルを合わせて一つ一つみていくと、、、

 

あれ、??スペース入っっとる。消してきれいにしよう。

と思い消すと、なんということでしょう!

輝かしいバグが消えました!(やったー!)

 

indexアクションはindex[全角スペース]で定義されてしまっていたので、

アクションで呼び出した時に、indexがないよ!となって、その結果htmlファイルを実行できない状態でした。(たぶん)

 

補足:

ちなみに @diaries = Diary.all の後ろだけに全角スペースが入った場合は、

こんな感じで別のエラーです。

f:id:TMLabo:20200201134816p:plain

undefined method `all ' for #<Class:0x00007fe88a13ae28> Did you mean? all

 

気をつけてください。

【Ruby on Rails】アプリディレクトリ削除後の再作成でRailsがない

sample_appディレクトリを手動削除。

もう一度アプリを作成しようと、rails new sample_app -d postgresql

実行すると

エラー。

 

f:id:TMLabo:20200129231147p:plain

 

なんだと???

 

結論:ディレクトリ間違い。

確認が一番重要です。。

 

ディレクトリ合わせてから、

 

bundle exec rails g model Diary title:string description:text

実行で完了

 

 

いじょう。

【備忘録】scaffoldで作成されたコントローラ処理

 
users_controller.rb

# POST /users
# POST /users.json
def create
@user = User.new(user_params)//入力されたデータが入っている。新しいインスタンス変数に格納
 

respond_to do |format|
 if @user.save //これだけでユーザー情報を登録している
          //そのあとにformatを返している。
   format.html { redirect_to @user, notice: 'User was successfully created.' }
   format.json { render :show, status: :created, location: @user }
  else
   format.html { render :new }
   format.json { render json: @user.errors, status: :unprocessable_entity }
  end
 end
end
 
 
private
 # Use callbacks to share common setup or constraints between actions.
 def set_user
  @user = User.find(params[:id])
 end

 # Never trust parameters from the scary internet, only allow the white list through.
//バリデーションを行っている。送信データはparamsという変数に入ってくる。
//reqire:必須項目チェックができるメソッド
//userというデータグループが送られているかチェックしている
//その後に、中身のチェックpermitを実行
 
 def user_params
 params.require(:user).permit(:name, :age, :prof)
 end
 
 users_controller.rb
# GET /users/1
# GET /users/1.json
def show
end
 
showだけだが、htmlをきちんと返している。

ここに記載されている。

f:id:TMLabo:20200129221450p:plain

show.html.erb

 
<p id="notice"><%= notice %></p> //noticeの変数を表示

<p>
<strong>Name:</strong> //@userという変数の名前や年齢などを渡している。
<%= @user.name %>
</p>

<p>
<strong>Age:</strong>
<%= @user.age %>
</p>

<p>
<strong>Prof:</strong>
<%= @user.prof %>
</p>

<%= link_to 'Edit', edit_user_path(@user) %> |
<%= link_to 'Back', users_path %>
インスタンス変数を作っていないが、
なぜ、コントローラでshowだけなのに、インスタンス変数をビューで使えるのか?
 ↓
class UsersController < ApplicationController
before_action :set_user, only: [:show, :edit, :update, :destroy]
・・・
 
 
private 
//これ
//ここでユーザー情報を取得して、@userに格納している
before_actionでset_userを実行することにしている
# Use callbacks to share common setup or constraints between actions.
//paramsにサーバーに送ったデータをfindメソッドに引き渡す
//findでDBに接続して、idを渡す。そのidに該当する情報を取得できる。
 
 def set_user
  @user = User.find(params[:id])
 end

# Never trust parameters from the scary internet, only allow the white list through.
def user_params
params.require(:user).permit(:name, :age, :prof)
end
end