%20%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95.png)
次のようにしてプロジェクトを複製できます。
$ 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_SOCK
root
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 にはさまざまな注意点があります。たとえば、バックアップ ソフトウェアがそれらをどのように処理するかなどを確認してください。