一般ユーザーのSSHキーを使用しますが、すべてのコマンド(gitなど)に対するsudoファイル権限を持つ方法

一般ユーザーのSSHキーを使用しますが、すべてのコマンド(gitなど)に対するsudoファイル権限を持つ方法

次のようにプロジェクトを複製できます。

$ git clone [email protected]:root/myproject.git ~/bla

しかし、今はそれを複製したいと思います/var/www

$ git clone [email protected]:root/myproject.git ~/var/www

しかし残念ながら、執筆の権限はありません/var/www。スドが救いに来ます!

$ sudo git clone [email protected]:root/myproject.git ~/var/www
Cloning into 'www'...
[email protected]'s password:

これは何ですか?パスワードの入力を求められますか?臭いパスワードは必要ありません!

明らかに、リクエストとともにrootユーザーのSSHキーを送信していますが、そのキーをgitリポジトリにインポートしていないため、拒否されます。過去に私の解決策は、フォルダの権限を一時的に変更するか、最初にアクセスできる場所に複製してからsudoを使用して移動することでしたが、正しい方法を学びたいと思いました。

それでは...一般的なユーザーのsshキーでsudoファイル権限を使用してgitをどのように使用しますか?

ベストアンサー1

ssh実行中のエージェントがある場合は、次の操作を行います。

sudo SSH_AUTH_SOCK="$SSH_AUTH_SOCK" git clone...

これは、デフォルトでgitこのコマンドで始まるコマンドroot(またはsshこのコマンドで始まるコマンドgit)にプロキシを使用するように指示します(すべての権限があるため、ssh接続できる必要があります)。root

実行中のSSHエージェントがない場合は、事前に起動できます。

eval "$(ssh-agent)"

(そして必要に応じて追加のキーを使用してくださいssh-add)。

または、次のものを使用できます。

sudo -E git clone...

渡すすべて環境変数sudo$SSH_AUTH_SOCK

私はできます。いいえコメントで、@NgOon-Eeが提案したようにリスト$SSH_AUTH_SOCKに追加されましたenv_keep。通常、rootサービスを開始したユーザーは環境を汚染したくありません。たとえばsudo sshd、サービスを開始するとは、そのサービスを介して開始されたすべてのセッションがユーザーエクスペリエンスを継承し、使用できなくなり、使用しないでユーザーエクスペリエンスを汚染することを意味しますsshd。ターゲットユーザーは認証プロキシを使用できないため、ターゲットユーザー以外のターゲットユーザーにもこの変数を渡す必要はありません。ssh$SSH_AUTH_SOCKroot

これで、キー認証の問題のみが解決されます。rootの設定も継承したい場合は、環境変数を使用してこれを行うこと~/.ssh/configはできませんが、ssh可能ですgit。たとえば、sugit関数を次のように定義します。

sugit() {
  sudo "GIT_SSH_COMMAND=
    exec ssh -o IdentityAgent='$SSH_AUTH_SOCK' \
             -o User=$LOGNAME \
             -F ~$LOGNAME/.ssh/config" git "$@"
}

つまり、ルートの代わりにSSHプロファイル、プロキシ、およびユーザー名を使用gitするようにコマンドに指示します。ssh

または、元のユーザーとして実行するように指示することをお勧めしますgitssh

sugit() {
  sudo "GIT_SSH_COMMAND=
    exec sudo -Hu $LOGNAME SSH_AUTH_SOCK='$SSH_AUTH_SOCK' ssh" git "$@"
}

おすすめ記事