通常のユーザーの ssh キーと sudo ファイル権限を使用して任意のコマンド (git など) を使用する方法

通常のユーザーの ssh キーと sudo ファイル権限を使用して任意のコマンド (git など) を使用する方法

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

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

しかし、今はそれをクローンしたいと思っています/var/www。だから私は試します

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

しかし、残念ながら、 に書き込む権限がありません/var/www。Sudo が助けに来ます!

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

これは何ですか? パスワードを要求されていますか? パスワードなんて必要ないはずです!

明らかに、ルート ユーザーの 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 "$@"
}

つまり、root の代わりに自分の ssh 設定ファイルとエージェントとユーザー名を使用するコマンドをgit使用するように指示します。ssh

あるいは、さらに良い方法として、元のユーザーとしてgit実行するように指示します。ssh

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

答え2

実行しているユーザーがキー ファイル (またはソケット) を読み取ることができない場合、ファイル (またはソケット) のアクセス許可は複雑になる可能性がありますsudo。これには、アクセス許可のないrootネットワーク共有にファイルが存在する場合やroot、ホーム ディレクトリが暗号化されていてアクセスが拒否される可能性がある場合などが含まれますroot

拡張 ACL をサポートする Unix システムでの別の方法は、それらを使用することです。この場合、通常の基本権限に加えて追加の書き込みアクセスを許可できます。

$ sudo chown apache:www /var/www/html
$ sudo chmod g+s /var/www/html
$ sudo setfacl -m g:webedit:rwx /var/www/html
$ groups
jdoe webedit
$ ls -ld /var/www/html
drwxrwsr-x+ 4 apache www 25 Nov 21 19:42 /var/www/html
$ 

しかし、webeditグループには権限があり、setfacl

$ git clone ~/repo /var/www/html
Cloning into '/var/www/html'...
done.
$ ls -al /var/www/html
total 0
drwxrwsr-x+ 4 apache www   25 Nov 21 19:42 .
drwxr-xr-x  4 root   root  31 Oct 19 20:39 ..
drwxrwsr-x  3 jdoe   www   14 Nov 21 19:42 a
drwxrwsr-x  8 jdoe   www  152 Nov 21 19:42 .git
$ 

ただし、拡張 ACL にはさまざまな注意点があります。たとえば、バックアップ ソフトウェアがそれらをどのように処理するかなどを確認してください。

関連情報