次のようにプロジェクトを複製できます。
$ 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キーでgitを使用するにはどうすればよいですか。
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...
every環境変数を$SSH_AUTH_SOCK
だけでなく、Sudo
全体に渡します。
私はnot @ 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 "$@"
}
つまり、ルートの代わりにssh設定ファイルとエージェントおよびユーザー名を使用するgit
コマンドを使用するようにssh
に指示します。
または、もっと良いのは、git
に元のユーザーとしてssh
を実行するように伝えることです。
sugit() {
Sudo "GIT_SSH_COMMAND=
exec Sudo -Hu $LOGNAME SSH_AUTH_SOCK='$SSH_AUTH_SOCK' ssh" git "$@"
}
Sudo
を実行しているユーザーがキーファイル(またはソケット)を読み取れない場合、ファイル(またはソケット)のアクセス許可は複雑になる可能性があります。これには、root
にアクセス権がないネットワーク共有にファイルが存在する場合、またはホームディレクトリを暗号化してroot
アクセスを再び拒否する場合に、root
が最も確実に含まれます。
拡張ACLをサポートするUnixシステムでのもう1つの方法は、それらを使用することです。この場合、通常の基本アクセス権に加えて追加の書き込みアクセス権を付与できます。
$ 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にはさまざまな問題があります。たとえば、バックアップソフトウェアがそれらをどのように処理するかを確認します。