@fredlackey/devutils 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -5
- package/package.json +1 -1
- package/src/commands/install.js +374 -36
- package/src/installs/adobe-creative-cloud.js +527 -25
- package/src/installs/adobe-creative-cloud.md +605 -0
- package/src/installs/appcleaner.js +303 -26
- package/src/installs/appcleaner.md +699 -0
- package/src/installs/apt-transport-https.js +390 -0
- package/src/installs/apt-transport-https.md +678 -0
- package/src/installs/atomicparsley.js +624 -26
- package/src/installs/atomicparsley.md +795 -0
- package/src/installs/aws-cli.js +779 -26
- package/src/installs/aws-cli.md +727 -0
- package/src/installs/balena-etcher.js +688 -26
- package/src/installs/balena-etcher.md +761 -0
- package/src/installs/bambu-studio.js +912 -26
- package/src/installs/bambu-studio.md +780 -0
- package/src/installs/bash-completion.js +554 -23
- package/src/installs/bash-completion.md +833 -0
- package/src/installs/bash.js +399 -26
- package/src/installs/bash.md +993 -0
- package/src/installs/beyond-compare.js +585 -26
- package/src/installs/beyond-compare.md +813 -0
- package/src/installs/build-essential.js +511 -26
- package/src/installs/build-essential.md +977 -0
- package/src/installs/ca-certificates.js +618 -0
- package/src/installs/ca-certificates.md +937 -0
- package/src/installs/caffeine.js +490 -26
- package/src/installs/caffeine.md +839 -0
- package/src/installs/camtasia.js +577 -25
- package/src/installs/camtasia.md +762 -0
- package/src/installs/chatgpt.js +458 -26
- package/src/installs/chatgpt.md +814 -0
- package/src/installs/chocolatey.js +447 -0
- package/src/installs/chocolatey.md +661 -0
- package/src/installs/chrome-canary.js +472 -26
- package/src/installs/chrome-canary.md +641 -0
- package/src/installs/chromium.js +645 -26
- package/src/installs/chromium.md +838 -0
- package/src/installs/claude-code.js +558 -26
- package/src/installs/claude-code.md +1173 -0
- package/src/installs/curl.js +361 -26
- package/src/installs/curl.md +714 -0
- package/src/installs/cursor.js +561 -26
- package/src/installs/cursor.md +970 -0
- package/src/installs/dbschema.js +674 -26
- package/src/installs/dbschema.md +925 -0
- package/src/installs/dependencies.md +435 -0
- package/src/installs/development-tools.js +600 -0
- package/src/installs/development-tools.md +977 -0
- package/src/installs/docker.js +1010 -25
- package/src/installs/docker.md +1109 -0
- package/src/installs/drawio.js +1001 -26
- package/src/installs/drawio.md +795 -0
- package/src/installs/elmedia-player.js +328 -25
- package/src/installs/elmedia-player.md +556 -0
- package/src/installs/ffmpeg.js +870 -25
- package/src/installs/ffmpeg.md +852 -0
- package/src/installs/file.js +464 -0
- package/src/installs/file.md +987 -0
- package/src/installs/gemini-cli.js +793 -26
- package/src/installs/gemini-cli.md +1153 -0
- package/src/installs/git.js +382 -26
- package/src/installs/git.md +907 -0
- package/src/installs/gitego.js +931 -26
- package/src/installs/gitego.md +1172 -0
- package/src/installs/go.js +913 -26
- package/src/installs/go.md +958 -0
- package/src/installs/google-chrome.js +801 -25
- package/src/installs/google-chrome.md +862 -0
- package/src/installs/gpg.js +412 -73
- package/src/installs/gpg.md +1056 -0
- package/src/installs/homebrew.js +1015 -26
- package/src/installs/homebrew.md +988 -0
- package/src/installs/imageoptim.js +950 -26
- package/src/installs/imageoptim.md +1119 -0
- package/src/installs/installers.json +2297 -0
- package/src/installs/jq.js +382 -26
- package/src/installs/jq.md +809 -0
- package/src/installs/keyboard-maestro.js +701 -26
- package/src/installs/keyboard-maestro.md +825 -0
- package/src/installs/latex.js +771 -26
- package/src/installs/latex.md +1095 -0
- package/src/installs/lftp.js +338 -26
- package/src/installs/lftp.md +907 -0
- package/src/installs/lsb-release.js +346 -0
- package/src/installs/lsb-release.md +814 -0
- package/src/installs/messenger.js +829 -26
- package/src/installs/messenger.md +900 -0
- package/src/installs/microsoft-office.js +550 -26
- package/src/installs/microsoft-office.md +760 -0
- package/src/installs/microsoft-teams.js +782 -25
- package/src/installs/microsoft-teams.md +886 -0
- package/src/installs/node.js +886 -26
- package/src/installs/node.md +1153 -0
- package/src/installs/nordpass.js +698 -26
- package/src/installs/nordpass.md +921 -0
- package/src/installs/nvm.js +977 -26
- package/src/installs/nvm.md +1057 -0
- package/src/installs/openssh.js +734 -64
- package/src/installs/openssh.md +1056 -0
- package/src/installs/pandoc.js +644 -26
- package/src/installs/pandoc.md +1036 -0
- package/src/installs/pinentry.js +492 -26
- package/src/installs/pinentry.md +1142 -0
- package/src/installs/pngyu.js +851 -26
- package/src/installs/pngyu.md +896 -0
- package/src/installs/postman.js +781 -26
- package/src/installs/postman.md +940 -0
- package/src/installs/procps.js +425 -0
- package/src/installs/procps.md +851 -0
- package/src/installs/safari-tech-preview.js +355 -25
- package/src/installs/safari-tech-preview.md +533 -0
- package/src/installs/sfnt2woff.js +640 -26
- package/src/installs/sfnt2woff.md +795 -0
- package/src/installs/shellcheck.js +463 -26
- package/src/installs/shellcheck.md +1005 -0
- package/src/installs/slack.js +722 -25
- package/src/installs/slack.md +865 -0
- package/src/installs/snagit.js +566 -25
- package/src/installs/snagit.md +844 -0
- package/src/installs/software-properties-common.js +372 -0
- package/src/installs/software-properties-common.md +805 -0
- package/src/installs/spotify.js +858 -25
- package/src/installs/spotify.md +901 -0
- package/src/installs/studio-3t.js +803 -26
- package/src/installs/studio-3t.md +918 -0
- package/src/installs/sublime-text.js +780 -25
- package/src/installs/sublime-text.md +914 -0
- package/src/installs/superwhisper.js +687 -25
- package/src/installs/superwhisper.md +630 -0
- package/src/installs/tailscale.js +727 -26
- package/src/installs/tailscale.md +1100 -0
- package/src/installs/tar.js +389 -0
- package/src/installs/tar.md +946 -0
- package/src/installs/termius.js +780 -26
- package/src/installs/termius.md +844 -0
- package/src/installs/terraform.js +761 -26
- package/src/installs/terraform.md +899 -0
- package/src/installs/tidal.js +752 -25
- package/src/installs/tidal.md +864 -0
- package/src/installs/tmux.js +328 -26
- package/src/installs/tmux.md +1030 -0
- package/src/installs/tree.js +393 -26
- package/src/installs/tree.md +833 -0
- package/src/installs/unzip.js +460 -0
- package/src/installs/unzip.md +879 -0
- package/src/installs/vim.js +403 -26
- package/src/installs/vim.md +1040 -0
- package/src/installs/vlc.js +803 -26
- package/src/installs/vlc.md +927 -0
- package/src/installs/vscode.js +825 -26
- package/src/installs/vscode.md +1002 -0
- package/src/installs/wget.js +415 -0
- package/src/installs/wget.md +791 -0
- package/src/installs/whatsapp.js +710 -25
- package/src/installs/whatsapp.md +854 -0
- package/src/installs/winpty.js +352 -0
- package/src/installs/winpty.md +620 -0
- package/src/installs/woff2.js +535 -26
- package/src/installs/woff2.md +977 -0
- package/src/installs/wsl.js +572 -0
- package/src/installs/wsl.md +699 -0
- package/src/installs/xcode-clt.js +520 -0
- package/src/installs/xcode-clt.md +351 -0
- package/src/installs/xcode.js +542 -26
- package/src/installs/xcode.md +573 -0
- package/src/installs/yarn.js +806 -26
- package/src/installs/yarn.md +1074 -0
- package/src/installs/yq.js +636 -26
- package/src/installs/yq.md +944 -0
- package/src/installs/yt-dlp.js +683 -26
- package/src/installs/yt-dlp.md +946 -0
- package/src/installs/yum-utils.js +297 -0
- package/src/installs/yum-utils.md +648 -0
- package/src/installs/zoom.js +740 -25
- package/src/installs/zoom.md +884 -0
- package/src/scripts/README.md +567 -45
- package/src/scripts/STATUS.md +208 -0
- package/src/scripts/afk.js +395 -7
- package/src/scripts/backup-all.js +731 -9
- package/src/scripts/backup-source.js +711 -8
- package/src/scripts/brewd.js +373 -7
- package/src/scripts/brewi.js +505 -9
- package/src/scripts/brewr.js +512 -9
- package/src/scripts/brews.js +462 -9
- package/src/scripts/brewu.js +488 -7
- package/src/scripts/c.js +185 -7
- package/src/scripts/ccurl.js +325 -8
- package/src/scripts/certbot-crontab-init.js +488 -8
- package/src/scripts/certbot-init.js +641 -9
- package/src/scripts/ch.js +339 -7
- package/src/scripts/claude-danger.js +253 -8
- package/src/scripts/clean-dev.js +419 -8
- package/src/scripts/clear-dns-cache.js +525 -7
- package/src/scripts/clone.js +417 -7
- package/src/scripts/code-all.js +420 -7
- package/src/scripts/count-files.js +195 -8
- package/src/scripts/count-folders.js +195 -8
- package/src/scripts/count.js +248 -8
- package/src/scripts/d.js +203 -7
- package/src/scripts/datauri.js +373 -8
- package/src/scripts/delete-files.js +363 -7
- package/src/scripts/docker-clean.js +410 -8
- package/src/scripts/dp.js +426 -7
- package/src/scripts/e.js +375 -9
- package/src/scripts/empty-trash.js +497 -7
- package/src/scripts/evm.js +428 -9
- package/src/scripts/fetch-github-repos.js +441 -10
- package/src/scripts/get-channel.js +329 -8
- package/src/scripts/get-course.js +384 -11
- package/src/scripts/get-dependencies.js +290 -9
- package/src/scripts/get-folder.js +783 -10
- package/src/scripts/get-tunes.js +411 -10
- package/src/scripts/get-video.js +352 -9
- package/src/scripts/git-backup.js +561 -9
- package/src/scripts/git-clone.js +477 -9
- package/src/scripts/git-pup.js +303 -7
- package/src/scripts/git-push.js +380 -8
- package/src/scripts/h.js +607 -9
- package/src/scripts/hide-desktop-icons.js +483 -7
- package/src/scripts/hide-hidden-files.js +522 -7
- package/src/scripts/install-dependencies-from.js +440 -9
- package/src/scripts/ips.js +647 -10
- package/src/scripts/iso.js +354 -8
- package/src/scripts/killni.js +561 -7
- package/src/scripts/ll.js +451 -8
- package/src/scripts/local-ip.js +310 -8
- package/src/scripts/m.js +508 -8
- package/src/scripts/map.js +293 -8
- package/src/scripts/mkd.js +287 -7
- package/src/scripts/ncu-update-all.js +441 -8
- package/src/scripts/nginx-init.js +702 -12
- package/src/scripts/npmi.js +366 -7
- package/src/scripts/o.js +495 -8
- package/src/scripts/org-by-date.js +321 -7
- package/src/scripts/p.js +208 -7
- package/src/scripts/packages.js +313 -8
- package/src/scripts/path.js +209 -7
- package/src/scripts/ports.js +582 -8
- package/src/scripts/q.js +290 -8
- package/src/scripts/refresh-files.js +378 -10
- package/src/scripts/remove-smaller-files.js +500 -8
- package/src/scripts/rename-files-with-date.js +517 -9
- package/src/scripts/resize-image.js +523 -9
- package/src/scripts/rm-safe.js +653 -8
- package/src/scripts/s.js +525 -9
- package/src/scripts/set-git-public.js +349 -7
- package/src/scripts/show-desktop-icons.js +459 -7
- package/src/scripts/show-hidden-files.js +456 -7
- package/src/scripts/tpa.js +265 -8
- package/src/scripts/tpo.js +264 -7
- package/src/scripts/u.js +489 -7
- package/src/scripts/vpush.js +422 -8
- package/src/scripts/y.js +267 -7
- package/src/utils/common/os.js +94 -2
- package/src/utils/ubuntu/apt.js +13 -7
- package/src/utils/windows/choco.js +82 -26
- package/src/utils/windows/winget.js +89 -27
|
@@ -0,0 +1,1056 @@
|
|
|
1
|
+
# Installing OpenSSH
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
OpenSSH (Open Secure Shell) is the premier suite of secure networking utilities based on the Secure Shell (SSH) protocol. Originally developed by the OpenBSD project, OpenSSH provides encrypted communication over unsecured networks, replacing insecure protocols like telnet, rlogin, and rsh.
|
|
6
|
+
|
|
7
|
+
OpenSSH includes:
|
|
8
|
+
|
|
9
|
+
- **ssh** - The SSH client for connecting to remote servers
|
|
10
|
+
- **sshd** - The SSH server daemon that accepts incoming connections
|
|
11
|
+
- **ssh-keygen** - Tool for generating SSH key pairs
|
|
12
|
+
- **ssh-agent** - Authentication agent for managing private keys
|
|
13
|
+
- **ssh-add** - Adds private keys to the authentication agent
|
|
14
|
+
- **scp** - Secure file copy utility
|
|
15
|
+
- **sftp** - Secure file transfer program
|
|
16
|
+
- **ssh-copy-id** - Tool for installing public keys on remote servers
|
|
17
|
+
|
|
18
|
+
This guide documents OpenSSH installation procedures for all platforms supported by DevUtils CLI.
|
|
19
|
+
|
|
20
|
+
## Dependencies
|
|
21
|
+
|
|
22
|
+
### macOS (Homebrew)
|
|
23
|
+
|
|
24
|
+
- **Required:** None (macOS includes system OpenSSH)
|
|
25
|
+
- **Optional:**
|
|
26
|
+
- `homebrew` - Install via `/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"` or `dev install homebrew` (provides newer version with FIDO2 support)
|
|
27
|
+
- **Auto-installed:**
|
|
28
|
+
- Xcode Command Line Tools (installed by Homebrew if not present)
|
|
29
|
+
|
|
30
|
+
### Ubuntu (APT/Snap)
|
|
31
|
+
|
|
32
|
+
- **Required:**
|
|
33
|
+
- `sudo` - Pre-installed on Ubuntu desktop/server
|
|
34
|
+
- APT package manager - Pre-installed on all Ubuntu systems
|
|
35
|
+
- **Optional:** None
|
|
36
|
+
- **Auto-installed:**
|
|
37
|
+
- systemd - Pre-installed on Ubuntu 15.04+ (used for SSH service management)
|
|
38
|
+
|
|
39
|
+
### Raspberry Pi OS (APT/Snap)
|
|
40
|
+
|
|
41
|
+
- **Required:**
|
|
42
|
+
- `sudo` - Pre-installed on Raspberry Pi OS
|
|
43
|
+
- APT package manager - Pre-installed on all Raspberry Pi OS installations
|
|
44
|
+
- **Optional:** None
|
|
45
|
+
- **Auto-installed:**
|
|
46
|
+
- systemd - Pre-installed on Raspberry Pi OS Jessie+ (used for SSH service management)
|
|
47
|
+
|
|
48
|
+
### Amazon Linux (DNF/YUM)
|
|
49
|
+
|
|
50
|
+
- **Required:**
|
|
51
|
+
- `sudo` - Pre-installed on Amazon Linux
|
|
52
|
+
- DNF (Amazon Linux 2023) or YUM (Amazon Linux 2) - Pre-installed based on version
|
|
53
|
+
- **Optional:** None
|
|
54
|
+
- **Auto-installed:**
|
|
55
|
+
- systemd - Pre-installed on Amazon Linux 2+ (used for SSH service management)
|
|
56
|
+
|
|
57
|
+
### Windows (Chocolatey/winget)
|
|
58
|
+
|
|
59
|
+
- **Required:**
|
|
60
|
+
- PowerShell 5.1+ - Pre-installed on Windows 10/11
|
|
61
|
+
- Administrator privileges - Required for Windows Capability installation
|
|
62
|
+
- Windows Update access - Required for downloading OpenSSH components
|
|
63
|
+
- **Optional:** None
|
|
64
|
+
- **Auto-installed:**
|
|
65
|
+
- Windows Firewall rules for SSH server (created automatically when server is installed)
|
|
66
|
+
|
|
67
|
+
### Git Bash (Manual/Portable)
|
|
68
|
+
|
|
69
|
+
- **Required:**
|
|
70
|
+
- Git for Windows - Install via `choco install git` or download from https://git-scm.com/download/win (OpenSSH is bundled)
|
|
71
|
+
- **Optional:**
|
|
72
|
+
- Windows OpenSSH - Install via `dev install openssh` from PowerShell (allows using native Windows SSH instead of bundled version)
|
|
73
|
+
- **Auto-installed:** None
|
|
74
|
+
|
|
75
|
+
## Prerequisites
|
|
76
|
+
|
|
77
|
+
Before installing OpenSSH on any platform, ensure:
|
|
78
|
+
|
|
79
|
+
1. **Internet connectivity** - Required to download OpenSSH packages
|
|
80
|
+
2. **Administrative privileges** - Required for system-wide installation (especially for the server component)
|
|
81
|
+
3. **Terminal access** - Required to run installation commands
|
|
82
|
+
|
|
83
|
+
## Platform-Specific Installation
|
|
84
|
+
|
|
85
|
+
### macOS (Homebrew)
|
|
86
|
+
|
|
87
|
+
#### Prerequisites
|
|
88
|
+
|
|
89
|
+
- macOS 10.15 (Catalina) or later (macOS 14 Sonoma or later recommended)
|
|
90
|
+
- Homebrew package manager installed
|
|
91
|
+
- Command line access via Terminal.app or iTerm2
|
|
92
|
+
|
|
93
|
+
macOS includes a pre-installed version of OpenSSH. However, Apple's bundled version may be older than the latest release. Homebrew provides a more recent version with additional features like FIDO2/U2F hardware key support.
|
|
94
|
+
|
|
95
|
+
If Homebrew is not installed, install it first:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
#### Installation Steps
|
|
102
|
+
|
|
103
|
+
Run the following command to install OpenSSH:
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
brew install --quiet openssh
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
The `--quiet` flag suppresses non-essential output, making the installation suitable for automation and scripts.
|
|
110
|
+
|
|
111
|
+
After installation, the Homebrew version of OpenSSH will be available. The macOS system SSH remains intact at `/usr/bin/ssh`.
|
|
112
|
+
|
|
113
|
+
**Note**: To use the Homebrew version by default, ensure Homebrew's bin directory is first in your PATH. Add the following to your `~/.zshrc`:
|
|
114
|
+
|
|
115
|
+
For Apple Silicon Macs:
|
|
116
|
+
```bash
|
|
117
|
+
export PATH="/opt/homebrew/bin:$PATH"
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
For Intel Macs:
|
|
121
|
+
```bash
|
|
122
|
+
export PATH="/usr/local/bin:$PATH"
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
#### Verification
|
|
126
|
+
|
|
127
|
+
Confirm the installation succeeded:
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
ssh -V
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Expected output (version numbers may vary):
|
|
134
|
+
|
|
135
|
+
```
|
|
136
|
+
OpenSSH_10.2p1, OpenSSL 3.6.0 10 Jun 2025
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Verify you are using the Homebrew version:
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
which ssh
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Expected output for Apple Silicon Macs:
|
|
146
|
+
|
|
147
|
+
```
|
|
148
|
+
/opt/homebrew/bin/ssh
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Expected output for Intel Macs:
|
|
152
|
+
|
|
153
|
+
```
|
|
154
|
+
/usr/local/bin/ssh
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
#### Troubleshooting
|
|
158
|
+
|
|
159
|
+
**Problem**: `ssh -V` shows the older macOS version
|
|
160
|
+
|
|
161
|
+
**Solution**: The system version of SSH is being used instead of Homebrew's version. Ensure Homebrew's bin directory is in your PATH before `/usr/bin`:
|
|
162
|
+
|
|
163
|
+
```bash
|
|
164
|
+
echo 'export PATH="/opt/homebrew/bin:$PATH"' >> ~/.zshrc
|
|
165
|
+
source ~/.zshrc
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
For Intel Macs, use `/usr/local/bin` instead of `/opt/homebrew/bin`.
|
|
169
|
+
|
|
170
|
+
**Problem**: `brew: command not found`
|
|
171
|
+
|
|
172
|
+
**Solution**: Homebrew is not installed or not in PATH. Install Homebrew first:
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
**Problem**: Permission errors during installation
|
|
179
|
+
|
|
180
|
+
**Solution**: Homebrew should not require sudo. If you encounter permission errors, fix Homebrew permissions:
|
|
181
|
+
|
|
182
|
+
```bash
|
|
183
|
+
sudo chown -R $(whoami) /opt/homebrew
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
### Ubuntu/Debian (APT)
|
|
189
|
+
|
|
190
|
+
#### Prerequisites
|
|
191
|
+
|
|
192
|
+
- Ubuntu 20.04 LTS or later, or Debian 11 (Bullseye) or later
|
|
193
|
+
- sudo privileges
|
|
194
|
+
- Internet connectivity
|
|
195
|
+
|
|
196
|
+
Ubuntu and Debian include OpenSSH in their default repositories. The SSH client is typically pre-installed on desktop systems, but the server component requires manual installation.
|
|
197
|
+
|
|
198
|
+
#### Installation Steps
|
|
199
|
+
|
|
200
|
+
**Step 1: Install OpenSSH client and server**
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
sudo DEBIAN_FRONTEND=noninteractive apt-get update -y
|
|
204
|
+
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y openssh-client openssh-server
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
The `DEBIAN_FRONTEND=noninteractive` environment variable ensures no interactive prompts appear during installation, making this suitable for scripts and automation.
|
|
208
|
+
|
|
209
|
+
**Step 2: Enable and start the SSH service**
|
|
210
|
+
|
|
211
|
+
```bash
|
|
212
|
+
sudo systemctl enable ssh --now
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
The `--now` flag enables the service for automatic startup and starts it immediately.
|
|
216
|
+
|
|
217
|
+
**Step 3: Configure firewall (if enabled)**
|
|
218
|
+
|
|
219
|
+
If UFW (Uncomplicated Firewall) is active, allow SSH connections:
|
|
220
|
+
|
|
221
|
+
```bash
|
|
222
|
+
sudo ufw allow ssh
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
#### Verification
|
|
226
|
+
|
|
227
|
+
Confirm the installation succeeded:
|
|
228
|
+
|
|
229
|
+
```bash
|
|
230
|
+
ssh -V
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
Expected output (version numbers may vary):
|
|
234
|
+
|
|
235
|
+
```
|
|
236
|
+
OpenSSH_9.6p1 Ubuntu-3ubuntu13, OpenSSL 3.0.13 30 Jan 2024
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
Verify the SSH service is running:
|
|
240
|
+
|
|
241
|
+
```bash
|
|
242
|
+
sudo systemctl status ssh
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
Expected output includes `Active: active (running)`.
|
|
246
|
+
|
|
247
|
+
Test local SSH connection (optional):
|
|
248
|
+
|
|
249
|
+
```bash
|
|
250
|
+
ssh localhost
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
This will prompt for your password and connect to your own machine, confirming the server is working.
|
|
254
|
+
|
|
255
|
+
#### Troubleshooting
|
|
256
|
+
|
|
257
|
+
**Problem**: `E: Unable to locate package openssh-server`
|
|
258
|
+
|
|
259
|
+
**Solution**: Update your package lists:
|
|
260
|
+
|
|
261
|
+
```bash
|
|
262
|
+
sudo DEBIAN_FRONTEND=noninteractive apt-get update -y
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
**Problem**: SSH service fails to start
|
|
266
|
+
|
|
267
|
+
**Solution**: Check the service status and logs:
|
|
268
|
+
|
|
269
|
+
```bash
|
|
270
|
+
sudo systemctl status ssh
|
|
271
|
+
sudo journalctl -xeu ssh
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
Common causes include port 22 already in use or missing host keys. Regenerate host keys if needed:
|
|
275
|
+
|
|
276
|
+
```bash
|
|
277
|
+
sudo rm /etc/ssh/ssh_host_*
|
|
278
|
+
sudo dpkg-reconfigure openssh-server
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
**Problem**: Connection refused when connecting remotely
|
|
282
|
+
|
|
283
|
+
**Solution**: Verify the firewall allows SSH:
|
|
284
|
+
|
|
285
|
+
```bash
|
|
286
|
+
sudo ufw status
|
|
287
|
+
sudo ufw allow ssh
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
**Problem**: Ubuntu 24.04+ shows ssh.service as inactive
|
|
291
|
+
|
|
292
|
+
**Solution**: Ubuntu 24.04 and later use socket-based activation. The service appears inactive until the first connection. This is expected behavior. The socket should be active:
|
|
293
|
+
|
|
294
|
+
```bash
|
|
295
|
+
sudo systemctl status ssh.socket
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
---
|
|
299
|
+
|
|
300
|
+
### Raspberry Pi OS (APT)
|
|
301
|
+
|
|
302
|
+
#### Prerequisites
|
|
303
|
+
|
|
304
|
+
- Raspberry Pi OS (Bookworm or Bullseye recommended)
|
|
305
|
+
- Raspberry Pi 3B+ or later (any model supported by Raspberry Pi OS)
|
|
306
|
+
- sudo privileges
|
|
307
|
+
- Internet connectivity
|
|
308
|
+
|
|
309
|
+
Raspberry Pi OS is based on Debian, so OpenSSH installation follows the Debian/APT method. OpenSSH works on both 32-bit (armhf) and 64-bit (arm64) architectures.
|
|
310
|
+
|
|
311
|
+
**Note**: SSH is disabled by default on Raspberry Pi OS for security reasons. This guide covers enabling it via the command line.
|
|
312
|
+
|
|
313
|
+
#### Installation Steps
|
|
314
|
+
|
|
315
|
+
First, verify your architecture:
|
|
316
|
+
|
|
317
|
+
```bash
|
|
318
|
+
uname -m
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
- `aarch64` = 64-bit ARM
|
|
322
|
+
- `armv7l` = 32-bit ARM
|
|
323
|
+
|
|
324
|
+
**Step 1: Install OpenSSH client and server**
|
|
325
|
+
|
|
326
|
+
```bash
|
|
327
|
+
sudo DEBIAN_FRONTEND=noninteractive apt-get update -y
|
|
328
|
+
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y openssh-client openssh-server
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
**Step 2: Enable and start the SSH service**
|
|
332
|
+
|
|
333
|
+
```bash
|
|
334
|
+
sudo systemctl enable ssh --now
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
**Alternative method for headless setup**: Create an empty file named `ssh` on the boot partition of the SD card before first boot:
|
|
338
|
+
|
|
339
|
+
```bash
|
|
340
|
+
# On the SD card boot partition (from another computer)
|
|
341
|
+
touch /Volumes/boot/ssh # macOS
|
|
342
|
+
# OR
|
|
343
|
+
touch /media/$USER/boot/ssh # Linux
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
This enables SSH on first boot without requiring keyboard/monitor access.
|
|
347
|
+
|
|
348
|
+
#### Verification
|
|
349
|
+
|
|
350
|
+
Confirm the installation succeeded:
|
|
351
|
+
|
|
352
|
+
```bash
|
|
353
|
+
ssh -V
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
Expected output (version numbers may vary):
|
|
357
|
+
|
|
358
|
+
```
|
|
359
|
+
OpenSSH_9.2p1 Debian-2+deb12u3, OpenSSL 3.0.14 4 Jun 2024
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
Verify the SSH service is running:
|
|
363
|
+
|
|
364
|
+
```bash
|
|
365
|
+
sudo systemctl status ssh
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
Test SSH is accessible from another machine:
|
|
369
|
+
|
|
370
|
+
```bash
|
|
371
|
+
# From another computer on the same network
|
|
372
|
+
ssh pi@<raspberry-pi-ip-address>
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
Find your Raspberry Pi's IP address:
|
|
376
|
+
|
|
377
|
+
```bash
|
|
378
|
+
hostname -I
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
#### Troubleshooting
|
|
382
|
+
|
|
383
|
+
**Problem**: SSH connection refused
|
|
384
|
+
|
|
385
|
+
**Solution**: Verify the SSH service is enabled and running:
|
|
386
|
+
|
|
387
|
+
```bash
|
|
388
|
+
sudo systemctl enable ssh --now
|
|
389
|
+
sudo systemctl status ssh
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
**Problem**: Host key verification failed after reinstalling OS
|
|
393
|
+
|
|
394
|
+
**Solution**: Remove the old host key from your local machine:
|
|
395
|
+
|
|
396
|
+
```bash
|
|
397
|
+
ssh-keygen -R <raspberry-pi-ip-address>
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
**Problem**: SSH service fails with host key errors
|
|
401
|
+
|
|
402
|
+
**Solution**: Regenerate host keys:
|
|
403
|
+
|
|
404
|
+
```bash
|
|
405
|
+
sudo rm /etc/ssh/ssh_host_*
|
|
406
|
+
sudo dpkg-reconfigure openssh-server
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
**Problem**: Cannot connect on first boot
|
|
410
|
+
|
|
411
|
+
**Solution**: Ensure the `ssh` file exists on the boot partition. On newer Raspberry Pi OS versions, you may also need to create a `userconf.txt` file with username and password hash.
|
|
412
|
+
|
|
413
|
+
---
|
|
414
|
+
|
|
415
|
+
### Amazon Linux (DNF/YUM)
|
|
416
|
+
|
|
417
|
+
#### Prerequisites
|
|
418
|
+
|
|
419
|
+
- Amazon Linux 2023 (AL2023) or Amazon Linux 2 (AL2)
|
|
420
|
+
- sudo privileges
|
|
421
|
+
- EC2 instance or compatible environment
|
|
422
|
+
|
|
423
|
+
Amazon Linux 2023 uses DNF as the default package manager. Amazon Linux 2 uses YUM. OpenSSH is typically pre-installed on Amazon Linux, but you may need to update it or install the server component.
|
|
424
|
+
|
|
425
|
+
**Note**: Amazon Linux EC2 instances come with SSH enabled by default (it is how you access the instance). The commands below ensure the latest version is installed.
|
|
426
|
+
|
|
427
|
+
#### Installation Steps
|
|
428
|
+
|
|
429
|
+
**For Amazon Linux 2023 (AL2023):**
|
|
430
|
+
|
|
431
|
+
```bash
|
|
432
|
+
sudo dnf install -y openssh-server openssh-clients
|
|
433
|
+
sudo systemctl enable sshd --now
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
**For Amazon Linux 2 (AL2):**
|
|
437
|
+
|
|
438
|
+
```bash
|
|
439
|
+
sudo yum install -y openssh-server openssh-clients
|
|
440
|
+
sudo systemctl enable sshd --now
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
The `-y` flag automatically confirms installation, enabling non-interactive execution.
|
|
444
|
+
|
|
445
|
+
**Note**: On Amazon Linux, the SSH service is named `sshd`, not `ssh`.
|
|
446
|
+
|
|
447
|
+
#### Verification
|
|
448
|
+
|
|
449
|
+
Confirm the installation succeeded:
|
|
450
|
+
|
|
451
|
+
```bash
|
|
452
|
+
ssh -V
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
Expected output for AL2023 (version numbers may vary):
|
|
456
|
+
|
|
457
|
+
```
|
|
458
|
+
OpenSSH_8.7p1, OpenSSL 3.0.8 7 Feb 2023
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
Verify the SSH service is running:
|
|
462
|
+
|
|
463
|
+
```bash
|
|
464
|
+
sudo systemctl status sshd
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
Check OpenSSH is listening on port 22:
|
|
468
|
+
|
|
469
|
+
```bash
|
|
470
|
+
sudo ss -tlnp | grep :22
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
#### Troubleshooting
|
|
474
|
+
|
|
475
|
+
**Problem**: `No match for argument: openssh-server` on Amazon Linux 2
|
|
476
|
+
|
|
477
|
+
**Solution**: Update the yum cache and retry:
|
|
478
|
+
|
|
479
|
+
```bash
|
|
480
|
+
sudo yum makecache
|
|
481
|
+
sudo yum install -y openssh-server openssh-clients
|
|
482
|
+
```
|
|
483
|
+
|
|
484
|
+
**Problem**: Cannot connect to EC2 instance
|
|
485
|
+
|
|
486
|
+
**Solution**: Verify the EC2 security group allows inbound SSH (port 22) from your IP address. Check in the AWS Console under EC2 > Security Groups.
|
|
487
|
+
|
|
488
|
+
**Problem**: Host key changed warning after instance replacement
|
|
489
|
+
|
|
490
|
+
**Solution**: Amazon Linux instances generate new host keys on first boot. Remove the old key from your known_hosts:
|
|
491
|
+
|
|
492
|
+
```bash
|
|
493
|
+
ssh-keygen -R <instance-ip-or-hostname>
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
**Problem**: SSH version is older than expected
|
|
497
|
+
|
|
498
|
+
**Solution**: Amazon's repositories prioritize stability. AL2023 includes OpenSSH 8.7. The `ssh-rsa` key exchange algorithm is disabled by default in OpenSSH 8.7+. Use Ed25519 keys for compatibility.
|
|
499
|
+
|
|
500
|
+
---
|
|
501
|
+
|
|
502
|
+
### Windows (PowerShell / winget)
|
|
503
|
+
|
|
504
|
+
#### Prerequisites
|
|
505
|
+
|
|
506
|
+
- Windows 10 version 1809 or later, or Windows 11
|
|
507
|
+
- Windows Server 2019 or later
|
|
508
|
+
- Administrator PowerShell
|
|
509
|
+
- Internet connectivity
|
|
510
|
+
|
|
511
|
+
Windows 10 (1809+) and Windows 11 include OpenSSH as an optional feature. Windows Server 2025 has OpenSSH installed by default.
|
|
512
|
+
|
|
513
|
+
#### Installation Steps
|
|
514
|
+
|
|
515
|
+
Open PowerShell as Administrator (right-click PowerShell and select "Run as administrator").
|
|
516
|
+
|
|
517
|
+
**Step 1: Install OpenSSH Client**
|
|
518
|
+
|
|
519
|
+
```powershell
|
|
520
|
+
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
|
|
521
|
+
```
|
|
522
|
+
|
|
523
|
+
**Step 2: Install OpenSSH Server (optional)**
|
|
524
|
+
|
|
525
|
+
Install only if you need to accept incoming SSH connections:
|
|
526
|
+
|
|
527
|
+
```powershell
|
|
528
|
+
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
|
|
529
|
+
```
|
|
530
|
+
|
|
531
|
+
**Step 3: Start and configure the SSH server (if installed)**
|
|
532
|
+
|
|
533
|
+
```powershell
|
|
534
|
+
Start-Service sshd
|
|
535
|
+
Set-Service -Name sshd -StartupType 'Automatic'
|
|
536
|
+
```
|
|
537
|
+
|
|
538
|
+
**Step 4: Configure firewall rule for SSH server (if installed)**
|
|
539
|
+
|
|
540
|
+
```powershell
|
|
541
|
+
if (!(Get-NetFirewallRule -Name "OpenSSH-Server-In-TCP" -ErrorAction SilentlyContinue)) {
|
|
542
|
+
New-NetFirewallRule -Name 'OpenSSH-Server-In-TCP' -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
|
|
543
|
+
}
|
|
544
|
+
```
|
|
545
|
+
|
|
546
|
+
**Alternative: Using winget**
|
|
547
|
+
|
|
548
|
+
For the latest beta/preview version with additional features:
|
|
549
|
+
|
|
550
|
+
```powershell
|
|
551
|
+
winget install Microsoft.OpenSSH.Beta --silent --accept-source-agreements --accept-package-agreements
|
|
552
|
+
```
|
|
553
|
+
|
|
554
|
+
#### Verification
|
|
555
|
+
|
|
556
|
+
Confirm the OpenSSH Client installation:
|
|
557
|
+
|
|
558
|
+
```powershell
|
|
559
|
+
ssh -V
|
|
560
|
+
```
|
|
561
|
+
|
|
562
|
+
Expected output (version numbers may vary):
|
|
563
|
+
|
|
564
|
+
```
|
|
565
|
+
OpenSSH_for_Windows_9.5p1, LibreSSL 3.8.2
|
|
566
|
+
```
|
|
567
|
+
|
|
568
|
+
Check the OpenSSH Server status (if installed):
|
|
569
|
+
|
|
570
|
+
```powershell
|
|
571
|
+
Get-Service sshd
|
|
572
|
+
```
|
|
573
|
+
|
|
574
|
+
Expected output includes `Status: Running`.
|
|
575
|
+
|
|
576
|
+
Verify the installation status:
|
|
577
|
+
|
|
578
|
+
```powershell
|
|
579
|
+
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
|
|
580
|
+
```
|
|
581
|
+
|
|
582
|
+
Expected output shows `State: Installed` for installed components.
|
|
583
|
+
|
|
584
|
+
#### Troubleshooting
|
|
585
|
+
|
|
586
|
+
**Problem**: `Add-WindowsCapability` fails with error
|
|
587
|
+
|
|
588
|
+
**Solution**: Windows Update must be accessible. This command downloads components from Windows Update. Verify internet connectivity and that Windows Update is not disabled.
|
|
589
|
+
|
|
590
|
+
**Problem**: SSH server fails to start
|
|
591
|
+
|
|
592
|
+
**Solution**: Check the event log for errors:
|
|
593
|
+
|
|
594
|
+
```powershell
|
|
595
|
+
Get-EventLog -LogName Application -Source sshd -Newest 10
|
|
596
|
+
```
|
|
597
|
+
|
|
598
|
+
Regenerate host keys if corrupted:
|
|
599
|
+
|
|
600
|
+
```powershell
|
|
601
|
+
cd $env:ProgramData\ssh
|
|
602
|
+
Remove-Item ssh_host_* -Force
|
|
603
|
+
ssh-keygen -A
|
|
604
|
+
Start-Service sshd
|
|
605
|
+
```
|
|
606
|
+
|
|
607
|
+
**Problem**: Firewall blocking SSH connections
|
|
608
|
+
|
|
609
|
+
**Solution**: Verify the firewall rule exists and is enabled:
|
|
610
|
+
|
|
611
|
+
```powershell
|
|
612
|
+
Get-NetFirewallRule -Name "OpenSSH-Server-In-TCP"
|
|
613
|
+
```
|
|
614
|
+
|
|
615
|
+
**Problem**: `ssh` command not found after installation
|
|
616
|
+
|
|
617
|
+
**Solution**: Close and reopen PowerShell to refresh the PATH. If still not working, verify installation:
|
|
618
|
+
|
|
619
|
+
```powershell
|
|
620
|
+
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH.Client*'
|
|
621
|
+
```
|
|
622
|
+
|
|
623
|
+
---
|
|
624
|
+
|
|
625
|
+
### WSL (Ubuntu)
|
|
626
|
+
|
|
627
|
+
#### Prerequisites
|
|
628
|
+
|
|
629
|
+
- Windows 10 version 2004 or higher, or Windows 11
|
|
630
|
+
- WSL 2 enabled with Ubuntu distribution installed
|
|
631
|
+
- sudo privileges within WSL
|
|
632
|
+
|
|
633
|
+
WSL runs Ubuntu (or another Linux distribution) within Windows. The SSH client is typically pre-installed. The SSH server requires additional configuration for external access.
|
|
634
|
+
|
|
635
|
+
**Important**: WSL SSH server is separate from Windows SSH server. They can run simultaneously on different ports.
|
|
636
|
+
|
|
637
|
+
#### Installation Steps
|
|
638
|
+
|
|
639
|
+
Open your WSL Ubuntu terminal and run:
|
|
640
|
+
|
|
641
|
+
**Step 1: Install OpenSSH client and server**
|
|
642
|
+
|
|
643
|
+
```bash
|
|
644
|
+
sudo DEBIAN_FRONTEND=noninteractive apt-get update -y
|
|
645
|
+
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y openssh-client openssh-server
|
|
646
|
+
```
|
|
647
|
+
|
|
648
|
+
**Step 2: Configure SSH for WSL (if running SSH server)**
|
|
649
|
+
|
|
650
|
+
Edit the SSH configuration to use a different port (to avoid conflict with Windows SSH):
|
|
651
|
+
|
|
652
|
+
```bash
|
|
653
|
+
sudo sed -i 's/#Port 22/Port 2222/' /etc/ssh/sshd_config
|
|
654
|
+
sudo sed -i 's/#ListenAddress 0.0.0.0/ListenAddress 0.0.0.0/' /etc/ssh/sshd_config
|
|
655
|
+
```
|
|
656
|
+
|
|
657
|
+
**Step 3: Start the SSH service**
|
|
658
|
+
|
|
659
|
+
WSL does not use systemd by default, so start SSH manually:
|
|
660
|
+
|
|
661
|
+
```bash
|
|
662
|
+
sudo service ssh start
|
|
663
|
+
```
|
|
664
|
+
|
|
665
|
+
To start SSH automatically when WSL launches, add to your `~/.bashrc`:
|
|
666
|
+
|
|
667
|
+
```bash
|
|
668
|
+
echo 'if [ -z "$(pgrep -x sshd)" ]; then sudo service ssh start > /dev/null 2>&1; fi' >> ~/.bashrc
|
|
669
|
+
```
|
|
670
|
+
|
|
671
|
+
Configure passwordless sudo for the ssh service (optional):
|
|
672
|
+
|
|
673
|
+
```bash
|
|
674
|
+
echo "$USER ALL=(ALL) NOPASSWD: /usr/sbin/service ssh *" | sudo tee /etc/sudoers.d/ssh-service
|
|
675
|
+
```
|
|
676
|
+
|
|
677
|
+
**Step 4: Configure Windows firewall for external access (optional)**
|
|
678
|
+
|
|
679
|
+
From an Administrator PowerShell on Windows:
|
|
680
|
+
|
|
681
|
+
```powershell
|
|
682
|
+
New-NetFirewallRule -Name sshd-wsl -DisplayName 'OpenSSH Server (sshd) for WSL' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 2222
|
|
683
|
+
```
|
|
684
|
+
|
|
685
|
+
#### Verification
|
|
686
|
+
|
|
687
|
+
Confirm the installation succeeded:
|
|
688
|
+
|
|
689
|
+
```bash
|
|
690
|
+
ssh -V
|
|
691
|
+
```
|
|
692
|
+
|
|
693
|
+
Expected output (version numbers may vary):
|
|
694
|
+
|
|
695
|
+
```
|
|
696
|
+
OpenSSH_9.6p1 Ubuntu-3ubuntu13, OpenSSL 3.0.13 30 Jan 2024
|
|
697
|
+
```
|
|
698
|
+
|
|
699
|
+
Verify the SSH service is running (if server installed):
|
|
700
|
+
|
|
701
|
+
```bash
|
|
702
|
+
sudo service ssh status
|
|
703
|
+
```
|
|
704
|
+
|
|
705
|
+
Test local connection:
|
|
706
|
+
|
|
707
|
+
```bash
|
|
708
|
+
ssh -p 2222 localhost
|
|
709
|
+
```
|
|
710
|
+
|
|
711
|
+
#### Troubleshooting
|
|
712
|
+
|
|
713
|
+
**Problem**: SSH service fails to start with dependency error
|
|
714
|
+
|
|
715
|
+
**Solution**: Disable the ssh.socket if it conflicts:
|
|
716
|
+
|
|
717
|
+
```bash
|
|
718
|
+
sudo systemctl disable ssh.socket
|
|
719
|
+
sudo service ssh restart
|
|
720
|
+
```
|
|
721
|
+
|
|
722
|
+
**Problem**: Cannot connect to WSL from external machine
|
|
723
|
+
|
|
724
|
+
**Solution**: WSL 2 uses a virtual network. Port forwarding is required:
|
|
725
|
+
|
|
726
|
+
```powershell
|
|
727
|
+
# Run in Administrator PowerShell on Windows
|
|
728
|
+
netsh interface portproxy add v4tov4 listenport=2222 listenaddress=0.0.0.0 connectport=2222 connectaddress=$(wsl hostname -I | ForEach-Object { $_.Trim() })
|
|
729
|
+
```
|
|
730
|
+
|
|
731
|
+
**Problem**: WSL IP address changes on restart
|
|
732
|
+
|
|
733
|
+
**Solution**: WSL 2 assigns a new IP on each restart. Update port forwarding rules accordingly or use a script to automate this.
|
|
734
|
+
|
|
735
|
+
**Problem**: `service ssh start` requires password every time
|
|
736
|
+
|
|
737
|
+
**Solution**: Add the sudoers rule documented above to enable passwordless sudo for the ssh service.
|
|
738
|
+
|
|
739
|
+
---
|
|
740
|
+
|
|
741
|
+
### Git Bash (Bundled OpenSSH)
|
|
742
|
+
|
|
743
|
+
#### Prerequisites
|
|
744
|
+
|
|
745
|
+
- Windows 10 or Windows 11 (64-bit or ARM64)
|
|
746
|
+
- Git for Windows installed
|
|
747
|
+
- No additional installation required
|
|
748
|
+
|
|
749
|
+
Git Bash includes a bundled version of OpenSSH. When you install Git for Windows, OpenSSH client tools (ssh, ssh-keygen, ssh-agent, scp, sftp) are automatically included.
|
|
750
|
+
|
|
751
|
+
**Note**: Git Bash provides only the SSH client, not the SSH server. For SSH server functionality on Windows, use the Windows OpenSSH Server (see Windows section).
|
|
752
|
+
|
|
753
|
+
#### Installation Steps
|
|
754
|
+
|
|
755
|
+
Git Bash automatically includes OpenSSH when Git for Windows is installed:
|
|
756
|
+
|
|
757
|
+
```powershell
|
|
758
|
+
choco install git -y
|
|
759
|
+
```
|
|
760
|
+
|
|
761
|
+
After installation, close and reopen your terminal. Open Git Bash from the Start Menu.
|
|
762
|
+
|
|
763
|
+
**Using Windows OpenSSH instead of bundled version (optional)**:
|
|
764
|
+
|
|
765
|
+
During Git for Windows installation, you can choose to use an external OpenSSH client. If you prefer the Windows-native OpenSSH:
|
|
766
|
+
|
|
767
|
+
1. Install OpenSSH on Windows (see Windows section above)
|
|
768
|
+
2. Configure Git to use the Windows SSH:
|
|
769
|
+
|
|
770
|
+
```bash
|
|
771
|
+
git config --global core.sshCommand "C:/Windows/System32/OpenSSH/ssh.exe"
|
|
772
|
+
```
|
|
773
|
+
|
|
774
|
+
#### Verification
|
|
775
|
+
|
|
776
|
+
Open Git Bash and run:
|
|
777
|
+
|
|
778
|
+
```bash
|
|
779
|
+
ssh -V
|
|
780
|
+
```
|
|
781
|
+
|
|
782
|
+
Expected output (version numbers may vary):
|
|
783
|
+
|
|
784
|
+
```
|
|
785
|
+
OpenSSH_9.6p1, OpenSSL 3.2.1 30 Jan 2024
|
|
786
|
+
```
|
|
787
|
+
|
|
788
|
+
Verify ssh-agent is available:
|
|
789
|
+
|
|
790
|
+
```bash
|
|
791
|
+
eval $(ssh-agent -s)
|
|
792
|
+
```
|
|
793
|
+
|
|
794
|
+
Expected output:
|
|
795
|
+
|
|
796
|
+
```
|
|
797
|
+
Agent pid 12345
|
|
798
|
+
```
|
|
799
|
+
|
|
800
|
+
Test SSH key generation:
|
|
801
|
+
|
|
802
|
+
```bash
|
|
803
|
+
ssh-keygen -t ed25519 -C "test@example.com" -f /tmp/test_key -N ""
|
|
804
|
+
ls -la /tmp/test_key*
|
|
805
|
+
rm /tmp/test_key*
|
|
806
|
+
```
|
|
807
|
+
|
|
808
|
+
#### Troubleshooting
|
|
809
|
+
|
|
810
|
+
**Problem**: SSH commands are slow or hang
|
|
811
|
+
|
|
812
|
+
**Solution**: Git Bash's SSH may conflict with Windows OpenSSH. Use one consistently:
|
|
813
|
+
|
|
814
|
+
```bash
|
|
815
|
+
# Check which ssh is being used
|
|
816
|
+
which ssh
|
|
817
|
+
```
|
|
818
|
+
|
|
819
|
+
If `/usr/bin/ssh` (Git Bash bundled), ensure ssh-agent is running properly.
|
|
820
|
+
|
|
821
|
+
**Problem**: Permission denied (publickey) errors
|
|
822
|
+
|
|
823
|
+
**Solution**: Ensure your SSH key is added to the agent:
|
|
824
|
+
|
|
825
|
+
```bash
|
|
826
|
+
eval $(ssh-agent -s)
|
|
827
|
+
ssh-add ~/.ssh/id_ed25519
|
|
828
|
+
```
|
|
829
|
+
|
|
830
|
+
**Problem**: SSH agent not persisting between sessions
|
|
831
|
+
|
|
832
|
+
**Solution**: Add to your `~/.bashrc`:
|
|
833
|
+
|
|
834
|
+
```bash
|
|
835
|
+
env=~/.ssh/agent.env
|
|
836
|
+
|
|
837
|
+
agent_load_env () { test -f "$env" && . "$env" >| /dev/null ; }
|
|
838
|
+
|
|
839
|
+
agent_start () {
|
|
840
|
+
(umask 077; ssh-agent >| "$env")
|
|
841
|
+
. "$env" >| /dev/null ; }
|
|
842
|
+
|
|
843
|
+
agent_load_env
|
|
844
|
+
|
|
845
|
+
agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?)
|
|
846
|
+
|
|
847
|
+
if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then
|
|
848
|
+
agent_start
|
|
849
|
+
ssh-add
|
|
850
|
+
elif [ "$SSH_AUTH_SOCK" ] && [ $agent_run_state = 1 ]; then
|
|
851
|
+
ssh-add
|
|
852
|
+
fi
|
|
853
|
+
|
|
854
|
+
unset env
|
|
855
|
+
```
|
|
856
|
+
|
|
857
|
+
**Problem**: `the input device is not a TTY` error with interactive SSH
|
|
858
|
+
|
|
859
|
+
**Solution**: Use `winpty` prefix for interactive commands:
|
|
860
|
+
|
|
861
|
+
```bash
|
|
862
|
+
winpty ssh user@host
|
|
863
|
+
```
|
|
864
|
+
|
|
865
|
+
Or add an alias to `~/.bashrc`:
|
|
866
|
+
|
|
867
|
+
```bash
|
|
868
|
+
alias ssh="winpty ssh"
|
|
869
|
+
```
|
|
870
|
+
|
|
871
|
+
---
|
|
872
|
+
|
|
873
|
+
## Post-Installation Configuration
|
|
874
|
+
|
|
875
|
+
After installing OpenSSH on any platform, consider these common configurations.
|
|
876
|
+
|
|
877
|
+
### Generate SSH Key Pair
|
|
878
|
+
|
|
879
|
+
Create an Ed25519 key (recommended for modern systems):
|
|
880
|
+
|
|
881
|
+
```bash
|
|
882
|
+
ssh-keygen -t ed25519 -C "your.email@example.com"
|
|
883
|
+
```
|
|
884
|
+
|
|
885
|
+
For legacy systems requiring RSA:
|
|
886
|
+
|
|
887
|
+
```bash
|
|
888
|
+
ssh-keygen -t rsa -b 4096 -C "your.email@example.com"
|
|
889
|
+
```
|
|
890
|
+
|
|
891
|
+
### Add Key to SSH Agent
|
|
892
|
+
|
|
893
|
+
Start the SSH agent and add your key:
|
|
894
|
+
|
|
895
|
+
```bash
|
|
896
|
+
eval "$(ssh-agent -s)"
|
|
897
|
+
ssh-add ~/.ssh/id_ed25519
|
|
898
|
+
```
|
|
899
|
+
|
|
900
|
+
### Copy Public Key to Remote Server
|
|
901
|
+
|
|
902
|
+
```bash
|
|
903
|
+
ssh-copy-id user@remote-host
|
|
904
|
+
```
|
|
905
|
+
|
|
906
|
+
On Windows (where ssh-copy-id is not available):
|
|
907
|
+
|
|
908
|
+
```powershell
|
|
909
|
+
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh user@remote-host "cat >> .ssh/authorized_keys"
|
|
910
|
+
```
|
|
911
|
+
|
|
912
|
+
### Configure SSH Client
|
|
913
|
+
|
|
914
|
+
Create or edit `~/.ssh/config` to define connection shortcuts:
|
|
915
|
+
|
|
916
|
+
```
|
|
917
|
+
Host myserver
|
|
918
|
+
HostName server.example.com
|
|
919
|
+
User username
|
|
920
|
+
IdentityFile ~/.ssh/id_ed25519
|
|
921
|
+
Port 22
|
|
922
|
+
|
|
923
|
+
Host github.com
|
|
924
|
+
HostName github.com
|
|
925
|
+
User git
|
|
926
|
+
IdentityFile ~/.ssh/id_ed25519_github
|
|
927
|
+
```
|
|
928
|
+
|
|
929
|
+
Usage:
|
|
930
|
+
|
|
931
|
+
```bash
|
|
932
|
+
ssh myserver # Connects to server.example.com as username
|
|
933
|
+
```
|
|
934
|
+
|
|
935
|
+
### Secure SSH Server Configuration
|
|
936
|
+
|
|
937
|
+
On systems running an SSH server, edit `/etc/ssh/sshd_config`:
|
|
938
|
+
|
|
939
|
+
```bash
|
|
940
|
+
# Disable root login
|
|
941
|
+
PermitRootLogin no
|
|
942
|
+
|
|
943
|
+
# Disable password authentication (key-only)
|
|
944
|
+
PasswordAuthentication no
|
|
945
|
+
|
|
946
|
+
# Use only SSH protocol 2
|
|
947
|
+
Protocol 2
|
|
948
|
+
```
|
|
949
|
+
|
|
950
|
+
Restart SSH after changes:
|
|
951
|
+
|
|
952
|
+
```bash
|
|
953
|
+
# Linux
|
|
954
|
+
sudo systemctl restart sshd
|
|
955
|
+
|
|
956
|
+
# Windows (PowerShell)
|
|
957
|
+
Restart-Service sshd
|
|
958
|
+
```
|
|
959
|
+
|
|
960
|
+
---
|
|
961
|
+
|
|
962
|
+
## Common Issues
|
|
963
|
+
|
|
964
|
+
### Issue: Connection Timed Out
|
|
965
|
+
|
|
966
|
+
**Symptoms**: `ssh: connect to host example.com port 22: Connection timed out`
|
|
967
|
+
|
|
968
|
+
**Solutions**:
|
|
969
|
+
|
|
970
|
+
- Verify the remote host is reachable: `ping example.com`
|
|
971
|
+
- Check if SSH server is running on the remote host
|
|
972
|
+
- Verify firewall allows port 22 (or custom SSH port)
|
|
973
|
+
- Check security groups (cloud environments)
|
|
974
|
+
|
|
975
|
+
### Issue: Permission Denied (publickey)
|
|
976
|
+
|
|
977
|
+
**Symptoms**: `Permission denied (publickey)`
|
|
978
|
+
|
|
979
|
+
**Solutions**:
|
|
980
|
+
|
|
981
|
+
- Ensure your public key is on the server: `cat ~/.ssh/authorized_keys`
|
|
982
|
+
- Verify correct permissions:
|
|
983
|
+
|
|
984
|
+
```bash
|
|
985
|
+
chmod 700 ~/.ssh
|
|
986
|
+
chmod 600 ~/.ssh/authorized_keys
|
|
987
|
+
chmod 600 ~/.ssh/id_ed25519
|
|
988
|
+
chmod 644 ~/.ssh/id_ed25519.pub
|
|
989
|
+
```
|
|
990
|
+
|
|
991
|
+
- Ensure ssh-agent has your key: `ssh-add -l`
|
|
992
|
+
|
|
993
|
+
### Issue: Host Key Verification Failed
|
|
994
|
+
|
|
995
|
+
**Symptoms**: `WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!`
|
|
996
|
+
|
|
997
|
+
**Solutions**:
|
|
998
|
+
|
|
999
|
+
If the host was legitimately reinstalled or changed:
|
|
1000
|
+
|
|
1001
|
+
```bash
|
|
1002
|
+
ssh-keygen -R hostname
|
|
1003
|
+
```
|
|
1004
|
+
|
|
1005
|
+
If unexpected, this could indicate a man-in-the-middle attack. Verify with the system administrator.
|
|
1006
|
+
|
|
1007
|
+
### Issue: Too Many Authentication Failures
|
|
1008
|
+
|
|
1009
|
+
**Symptoms**: `Received disconnect from host: Too many authentication failures`
|
|
1010
|
+
|
|
1011
|
+
**Solutions**:
|
|
1012
|
+
|
|
1013
|
+
Limit which keys SSH tries:
|
|
1014
|
+
|
|
1015
|
+
```bash
|
|
1016
|
+
ssh -o IdentitiesOnly=yes -i ~/.ssh/specific_key user@host
|
|
1017
|
+
```
|
|
1018
|
+
|
|
1019
|
+
Or configure in `~/.ssh/config`:
|
|
1020
|
+
|
|
1021
|
+
```
|
|
1022
|
+
Host example.com
|
|
1023
|
+
IdentitiesOnly yes
|
|
1024
|
+
IdentityFile ~/.ssh/specific_key
|
|
1025
|
+
```
|
|
1026
|
+
|
|
1027
|
+
### Issue: SSH Slow to Connect
|
|
1028
|
+
|
|
1029
|
+
**Symptoms**: SSH connection takes 10+ seconds to establish
|
|
1030
|
+
|
|
1031
|
+
**Solutions**:
|
|
1032
|
+
|
|
1033
|
+
- Disable DNS lookup on server (edit `/etc/ssh/sshd_config`):
|
|
1034
|
+
```
|
|
1035
|
+
UseDNS no
|
|
1036
|
+
```
|
|
1037
|
+
|
|
1038
|
+
- Disable GSSAPI authentication:
|
|
1039
|
+
```bash
|
|
1040
|
+
ssh -o GSSAPIAuthentication=no user@host
|
|
1041
|
+
```
|
|
1042
|
+
|
|
1043
|
+
---
|
|
1044
|
+
|
|
1045
|
+
## References
|
|
1046
|
+
|
|
1047
|
+
- [OpenSSH Official Website](https://www.openssh.com/)
|
|
1048
|
+
- [OpenSSH Manual Pages](https://man.openbsd.org/ssh)
|
|
1049
|
+
- [Homebrew OpenSSH Formula](https://formulae.brew.sh/formula/openssh)
|
|
1050
|
+
- [Ubuntu OpenSSH Server Documentation](https://documentation.ubuntu.com/server/how-to/security/openssh-server/)
|
|
1051
|
+
- [Microsoft Learn: OpenSSH for Windows](https://learn.microsoft.com/en-us/windows-server/administration/openssh/openssh_install_firstuse)
|
|
1052
|
+
- [Git for Windows SSH](https://gitforwindows.org/using-an-external-openssh-client.html)
|
|
1053
|
+
- [Raspberry Pi SSH Documentation](https://www.raspberrypi.org/documentation/remote-access/ssh/)
|
|
1054
|
+
- [Amazon Linux 2023 User Guide](https://docs.aws.amazon.com/linux/al2023/ug/)
|
|
1055
|
+
- [Chocolatey OpenSSH Package](https://community.chocolatey.org/packages/openssh)
|
|
1056
|
+
- [WSL OpenSSH Guide](https://learn.microsoft.com/en-us/windows/wsl/tutorials/ssh)
|