Added windows powershell setup for gitea #1
248
README.md
248
README.md
@@ -15,3 +15,251 @@
|
|||||||
`ssh code.kpuig.net`
|
`ssh code.kpuig.net`
|
||||||
|
|
||||||
If this command gives you anything but an affirmative that you're configured correctly, that means you have misconfigured something, most likely in SSH but possibly in git.
|
If this command gives you anything but an affirmative that you're configured correctly, that means you have misconfigured something, most likely in SSH but possibly in git.
|
||||||
|
|
||||||
|
# Using PowerShell for Git/Gitea over SSH (Windows)
|
||||||
|
|
||||||
|
This guide assumes some PowerShell experience. It walks you from setup → generating SSH keys → fixing permissions → testing → cloning/pushing with Git. It also includes simple PowerShell basics you’ll reuse later.
|
||||||
|
|
||||||
|
### 1) Open PowerShell (two ways)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
- **Normal window (most tasks):** Press **Start** → type **PowerShell** → Enter.
|
||||||
|
- **Administrator window (needed for ownership/ACL fixes):** Start → type **PowerShell** → **Right‑click → Run as administrator**.
|
||||||
|
|
||||||
|
How to tell: the title bar will say **Administrator: Windows PowerShell** if elevated.
|
||||||
|
|
||||||
|
### 2) Check/OpenSSH is installed (client)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Most modern Windows include it already.
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
ssh -V # shows version if installed
|
||||||
|
```
|
||||||
|
|
||||||
|
If you see an error:
|
||||||
|
|
||||||
|
1. **Settings** → **Apps** → **Optional features** → **Add a feature** → Install **OpenSSH Client**.
|
||||||
|
2. Reopen PowerShell and try `ssh -V` again.
|
||||||
|
|
||||||
|
### 3) PowerShell basics you’ll use
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
- **Current user home**: `C:\Users\<YourName>` (shortcut in PowerShell: `$env:USERPROFILE`)
|
||||||
|
- **Change directory**: `cd <path>`
|
||||||
|
Example: `cd $env:USERPROFILE\.ssh`
|
||||||
|
- **List files**: `dir` or `ls`
|
||||||
|
- **Create folder**: `New-Item -ItemType Directory -Path <path>`
|
||||||
|
- **View a file**: `type <file>` (or `notepad <file>` to open Notepad)
|
||||||
|
|
||||||
|
### 4) Create the **.ssh** folder (if it doesn’t exist)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
$ssh = "$env:USERPROFILE\.ssh"
|
||||||
|
if (!(Test-Path $ssh)) { New-Item -ItemType Directory -Path $ssh | Out-Null }
|
||||||
|
cd $ssh
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5) Generate an SSH key pair (private + public)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Use **ed25519** unless your host requires RSA.
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
ssh-keygen -t ed25519 -C "your.email@example.com" -f "$env:USERPROFILE\.ssh\some_id"
|
||||||
|
```
|
||||||
|
|
||||||
|
- When prompted for a passphrase: press **Enter** (no passphrase) or set one for extra security.
|
||||||
|
- This creates two files:
|
||||||
|
|
||||||
|
- **`some_id`** (private key — **keep secret**)
|
||||||
|
- **`some_id.pub`** (public key — you’ll upload this)
|
||||||
|
|
||||||
|
> If you already have a key, skip generation and just make sure you know the file name.
|
||||||
|
|
||||||
|
### 6) Lock down private‑key permissions (Windows ACLs)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Open **PowerShell as Administrator** for this section.
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
$k = "$env:USERPROFILE\.ssh\some_id"
|
||||||
|
# Make you the owner
|
||||||
|
icacls $k /setowner "$env:USERNAME"
|
||||||
|
# Stop inheriting broader folder permissions
|
||||||
|
icacls $k /inheritance:r
|
||||||
|
# Remove groups that make it too open (ignore errors if not present)
|
||||||
|
icacls $k /remove "BUILTIN\Administrators" "Users" "Authenticated Users" "Everyone" 2>$null
|
||||||
|
# Grant yourself read access (enough for SSH)
|
||||||
|
icacls $k /grant:r "$env:USERNAME:R"
|
||||||
|
# (Optional) allow SYSTEM read
|
||||||
|
icacls $k /grant:r "NT AUTHORITY\SYSTEM:R"
|
||||||
|
# Verify
|
||||||
|
icacls $k
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected output includes only **`<YourName>:(R)`** (and optionally **`NT AUTHORITY\SYSTEM:(R)`**).
|
||||||
|
|
||||||
|
> If you see: **“WARNING: UNPROTECTED PRIVATE KEY FILE!”** later, re‑run the ACL steps above.
|
||||||
|
|
||||||
|
### 7) Upload your **public** key to Gitea
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
1. Show/copy your public key:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
type "$env:USERPROFILE\.ssh\some_id.pub"
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Go to your Gitea **Profile → Settings → SSH / GPG Keys → Add Key**.
|
||||||
|
3. Paste the entire single‑line key (starts with `ssh-ed25519` or `ssh-rsa`). Save.
|
||||||
|
|
||||||
|
> **Never** upload the private key (`some_id`). Only the `.pub` file.
|
||||||
|
|
||||||
|
### 8) Tell SSH which key to use for your host
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Create/edit `C:\Users\<You>\.ssh\config`:
|
||||||
|
|
||||||
|
```text
|
||||||
|
Host code.kpuig.net
|
||||||
|
User git
|
||||||
|
IdentityFile C:\Users\<You>\.ssh\some_id
|
||||||
|
IdentitiesOnly yes
|
||||||
|
# Port 22 # If your Gitea shows a different port, set it here
|
||||||
|
```
|
||||||
|
|
||||||
|
You can create this file via Notepad:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
notepad "$env:USERPROFILE\.ssh\config"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 9) Test the SSH connection
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
ssh -T git@code.kpuig.net # add -p <port> if needed
|
||||||
|
```
|
||||||
|
|
||||||
|
**Success looks like:**
|
||||||
|
|
||||||
|
```
|
||||||
|
Hi there, <username>! You've successfully authenticated ... but Gitea does not provide shell access.
|
||||||
|
```
|
||||||
|
|
||||||
|
If you see **PTY allocation request failed** — that’s normal; it’s just saying there’s no shell. Authentication still worked.
|
||||||
|
|
||||||
|
### 10) Use Git with SSH (clone, fetch, push)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
# Navigate to where you keep projects
|
||||||
|
cd $env:USERPROFILE\Projects
|
||||||
|
# Clone via SSH (check the clone URL in Gitea)
|
||||||
|
git clone git@code.kpuig.net:owner/repo.git
|
||||||
|
cd repo
|
||||||
|
# Typical workflow
|
||||||
|
git pull
|
||||||
|
# make changes
|
||||||
|
git add .
|
||||||
|
git commit -m "Your message"
|
||||||
|
git push
|
||||||
|
```
|
||||||
|
|
||||||
|
> If Git says “Permission denied (publickey)”: verify your `~/.ssh/config` host, the key path, and that the **matching** public key is in Gitea.
|
||||||
|
|
||||||
|
### 11) Common errors & quick fixes
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**A) `Load key "... .pub": invalid format`**
|
||||||
|
You pointed SSH to the **public** key. Use the **private** key (no `.pub`).
|
||||||
|
|
||||||
|
**B) `WARNING: UNPROTECTED PRIVATE KEY FILE!`**
|
||||||
|
Reapply the ACLs from step 6 (only you should have Read on the private key).
|
||||||
|
|
||||||
|
**C) `Permission denied (publickey)`**
|
||||||
|
|
||||||
|
- Ensure the public key in Gitea matches your private key:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
ssh-keygen -y -f "$env:USERPROFILE\.ssh\some_id" > "$env:USERPROFILE\.ssh\some_id.pub"
|
||||||
|
```
|
||||||
|
|
||||||
|
- Confirm your SSH config host & port; try `ssh -vvv -T git@code.kpuig.net` and read the last lines.
|
||||||
|
|
||||||
|
**D) Host key changed / MITM warning**
|
||||||
|
If the server was rebuilt, clear the old fingerprint:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
ssh-keygen -R code.kpuig.net
|
||||||
|
```
|
||||||
|
|
||||||
|
Retry to accept the new host key.
|
||||||
|
|
||||||
|
### 12) Optional: `ssh-agent` convenience (cache passphrase)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
If your private key has a passphrase:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
Start-Service ssh-agent # may require admin the first time
|
||||||
|
Get-Service ssh-agent
|
||||||
|
ssh-add "$env:USERPROFILE\.ssh\some_id"
|
||||||
|
```
|
||||||
|
|
||||||
|
Now SSH/Git can use the key without asking for the passphrase every time.
|
||||||
|
|
||||||
|
### 13) Quick glossary
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
- **PowerShell**: Windows command shell
|
||||||
|
- **SSH**: Secure shell protocol for authentication and Git
|
||||||
|
- **Private key**: Stays on your PC; keep secret
|
||||||
|
- **Public key**: Safe to upload; server uses it to verify you
|
||||||
|
- **ACL/Permissions**: Who can read a file
|
||||||
|
- **Gitea**: Self‑hosted Git service
|
||||||
|
|
||||||
|
### 14) Copy‑paste checklist (TL;DR)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
# 1) Create folder
|
||||||
|
mkdir $env:USERPROFILE\.ssh -ea 0
|
||||||
|
|
||||||
|
# 2) Generate key
|
||||||
|
ssh-keygen -t ed25519 -C "your.email@example.com" -f "$env:USERPROFILE\.ssh\some_id"
|
||||||
|
|
||||||
|
# 3) Lock private key (Run PowerShell as Admin)
|
||||||
|
$k = "$env:USERPROFILE\.ssh\some_id"
|
||||||
|
icacls $k /setowner "$env:USERNAME"
|
||||||
|
icacls $k /inheritance:r
|
||||||
|
icacls $k /remove "BUILTIN\Administrators" "Users" "Authenticated Users" "Everyone" 2>$null
|
||||||
|
icacls $k /grant:r "$env:USERNAME:R"
|
||||||
|
|
||||||
|
# 4) Put pubkey into Gitea
|
||||||
|
notepad "$env:USERPROFILE\.ssh\some_id.pub" # copy to Gitea → Settings → SSH Keys
|
||||||
|
|
||||||
|
# 5) SSH config
|
||||||
|
notepad "$env:USERPROFILE\.ssh\config" # paste Host block pointing to some_id
|
||||||
|
|
||||||
|
# 6) Test
|
||||||
|
ssh -T git@code.kpuig.net
|
||||||
|
```
|
||||||
|
|
||||||
|
You’re ready to clone and push.
|
||||||
|
|||||||
Reference in New Issue
Block a user