@fredlackey/devutils 0.0.1 → 0.0.2

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.
Files changed (257) hide show
  1. package/README.md +5 -5
  2. package/package.json +1 -1
  3. package/src/commands/install.js +374 -36
  4. package/src/installs/adobe-creative-cloud.js +527 -25
  5. package/src/installs/adobe-creative-cloud.md +605 -0
  6. package/src/installs/appcleaner.js +303 -26
  7. package/src/installs/appcleaner.md +699 -0
  8. package/src/installs/apt-transport-https.js +390 -0
  9. package/src/installs/apt-transport-https.md +678 -0
  10. package/src/installs/atomicparsley.js +624 -26
  11. package/src/installs/atomicparsley.md +795 -0
  12. package/src/installs/aws-cli.js +779 -26
  13. package/src/installs/aws-cli.md +727 -0
  14. package/src/installs/balena-etcher.js +688 -26
  15. package/src/installs/balena-etcher.md +761 -0
  16. package/src/installs/bambu-studio.js +912 -26
  17. package/src/installs/bambu-studio.md +780 -0
  18. package/src/installs/bash-completion.js +554 -23
  19. package/src/installs/bash-completion.md +833 -0
  20. package/src/installs/bash.js +399 -26
  21. package/src/installs/bash.md +993 -0
  22. package/src/installs/beyond-compare.js +585 -26
  23. package/src/installs/beyond-compare.md +813 -0
  24. package/src/installs/build-essential.js +511 -26
  25. package/src/installs/build-essential.md +977 -0
  26. package/src/installs/ca-certificates.js +618 -0
  27. package/src/installs/ca-certificates.md +937 -0
  28. package/src/installs/caffeine.js +490 -26
  29. package/src/installs/caffeine.md +839 -0
  30. package/src/installs/camtasia.js +577 -25
  31. package/src/installs/camtasia.md +762 -0
  32. package/src/installs/chatgpt.js +458 -26
  33. package/src/installs/chatgpt.md +814 -0
  34. package/src/installs/chocolatey.js +447 -0
  35. package/src/installs/chocolatey.md +661 -0
  36. package/src/installs/chrome-canary.js +472 -26
  37. package/src/installs/chrome-canary.md +641 -0
  38. package/src/installs/chromium.js +645 -26
  39. package/src/installs/chromium.md +838 -0
  40. package/src/installs/claude-code.js +558 -26
  41. package/src/installs/claude-code.md +1173 -0
  42. package/src/installs/curl.js +361 -26
  43. package/src/installs/curl.md +714 -0
  44. package/src/installs/cursor.js +561 -26
  45. package/src/installs/cursor.md +970 -0
  46. package/src/installs/dbschema.js +674 -26
  47. package/src/installs/dbschema.md +925 -0
  48. package/src/installs/dependencies.md +435 -0
  49. package/src/installs/development-tools.js +600 -0
  50. package/src/installs/development-tools.md +977 -0
  51. package/src/installs/docker.js +1010 -25
  52. package/src/installs/docker.md +1109 -0
  53. package/src/installs/drawio.js +1001 -26
  54. package/src/installs/drawio.md +795 -0
  55. package/src/installs/elmedia-player.js +328 -25
  56. package/src/installs/elmedia-player.md +556 -0
  57. package/src/installs/ffmpeg.js +870 -25
  58. package/src/installs/ffmpeg.md +852 -0
  59. package/src/installs/file.js +464 -0
  60. package/src/installs/file.md +987 -0
  61. package/src/installs/gemini-cli.js +793 -26
  62. package/src/installs/gemini-cli.md +1153 -0
  63. package/src/installs/git.js +382 -26
  64. package/src/installs/git.md +907 -0
  65. package/src/installs/gitego.js +931 -26
  66. package/src/installs/gitego.md +1172 -0
  67. package/src/installs/go.js +913 -26
  68. package/src/installs/go.md +958 -0
  69. package/src/installs/google-chrome.js +801 -25
  70. package/src/installs/google-chrome.md +862 -0
  71. package/src/installs/gpg.js +412 -73
  72. package/src/installs/gpg.md +1056 -0
  73. package/src/installs/homebrew.js +1015 -26
  74. package/src/installs/homebrew.md +988 -0
  75. package/src/installs/imageoptim.js +950 -26
  76. package/src/installs/imageoptim.md +1119 -0
  77. package/src/installs/installers.json +2297 -0
  78. package/src/installs/jq.js +382 -26
  79. package/src/installs/jq.md +809 -0
  80. package/src/installs/keyboard-maestro.js +701 -26
  81. package/src/installs/keyboard-maestro.md +825 -0
  82. package/src/installs/latex.js +771 -26
  83. package/src/installs/latex.md +1095 -0
  84. package/src/installs/lftp.js +338 -26
  85. package/src/installs/lftp.md +907 -0
  86. package/src/installs/lsb-release.js +346 -0
  87. package/src/installs/lsb-release.md +814 -0
  88. package/src/installs/messenger.js +829 -26
  89. package/src/installs/messenger.md +900 -0
  90. package/src/installs/microsoft-office.js +550 -26
  91. package/src/installs/microsoft-office.md +760 -0
  92. package/src/installs/microsoft-teams.js +782 -25
  93. package/src/installs/microsoft-teams.md +886 -0
  94. package/src/installs/node.js +886 -26
  95. package/src/installs/node.md +1153 -0
  96. package/src/installs/nordpass.js +698 -26
  97. package/src/installs/nordpass.md +921 -0
  98. package/src/installs/nvm.js +977 -26
  99. package/src/installs/nvm.md +1057 -0
  100. package/src/installs/openssh.js +734 -64
  101. package/src/installs/openssh.md +1056 -0
  102. package/src/installs/pandoc.js +644 -26
  103. package/src/installs/pandoc.md +1036 -0
  104. package/src/installs/pinentry.js +492 -26
  105. package/src/installs/pinentry.md +1142 -0
  106. package/src/installs/pngyu.js +851 -26
  107. package/src/installs/pngyu.md +896 -0
  108. package/src/installs/postman.js +781 -26
  109. package/src/installs/postman.md +940 -0
  110. package/src/installs/procps.js +425 -0
  111. package/src/installs/procps.md +851 -0
  112. package/src/installs/safari-tech-preview.js +355 -25
  113. package/src/installs/safari-tech-preview.md +533 -0
  114. package/src/installs/sfnt2woff.js +640 -26
  115. package/src/installs/sfnt2woff.md +795 -0
  116. package/src/installs/shellcheck.js +463 -26
  117. package/src/installs/shellcheck.md +1005 -0
  118. package/src/installs/slack.js +722 -25
  119. package/src/installs/slack.md +865 -0
  120. package/src/installs/snagit.js +566 -25
  121. package/src/installs/snagit.md +844 -0
  122. package/src/installs/software-properties-common.js +372 -0
  123. package/src/installs/software-properties-common.md +805 -0
  124. package/src/installs/spotify.js +858 -25
  125. package/src/installs/spotify.md +901 -0
  126. package/src/installs/studio-3t.js +803 -26
  127. package/src/installs/studio-3t.md +918 -0
  128. package/src/installs/sublime-text.js +780 -25
  129. package/src/installs/sublime-text.md +914 -0
  130. package/src/installs/superwhisper.js +687 -25
  131. package/src/installs/superwhisper.md +630 -0
  132. package/src/installs/tailscale.js +727 -26
  133. package/src/installs/tailscale.md +1100 -0
  134. package/src/installs/tar.js +389 -0
  135. package/src/installs/tar.md +946 -0
  136. package/src/installs/termius.js +780 -26
  137. package/src/installs/termius.md +844 -0
  138. package/src/installs/terraform.js +761 -26
  139. package/src/installs/terraform.md +899 -0
  140. package/src/installs/tidal.js +752 -25
  141. package/src/installs/tidal.md +864 -0
  142. package/src/installs/tmux.js +328 -26
  143. package/src/installs/tmux.md +1030 -0
  144. package/src/installs/tree.js +393 -26
  145. package/src/installs/tree.md +833 -0
  146. package/src/installs/unzip.js +460 -0
  147. package/src/installs/unzip.md +879 -0
  148. package/src/installs/vim.js +403 -26
  149. package/src/installs/vim.md +1040 -0
  150. package/src/installs/vlc.js +803 -26
  151. package/src/installs/vlc.md +927 -0
  152. package/src/installs/vscode.js +825 -26
  153. package/src/installs/vscode.md +1002 -0
  154. package/src/installs/wget.js +415 -0
  155. package/src/installs/wget.md +791 -0
  156. package/src/installs/whatsapp.js +710 -25
  157. package/src/installs/whatsapp.md +854 -0
  158. package/src/installs/winpty.js +352 -0
  159. package/src/installs/winpty.md +620 -0
  160. package/src/installs/woff2.js +535 -26
  161. package/src/installs/woff2.md +977 -0
  162. package/src/installs/wsl.js +572 -0
  163. package/src/installs/wsl.md +699 -0
  164. package/src/installs/xcode-clt.js +520 -0
  165. package/src/installs/xcode-clt.md +351 -0
  166. package/src/installs/xcode.js +542 -26
  167. package/src/installs/xcode.md +573 -0
  168. package/src/installs/yarn.js +806 -26
  169. package/src/installs/yarn.md +1074 -0
  170. package/src/installs/yq.js +636 -26
  171. package/src/installs/yq.md +944 -0
  172. package/src/installs/yt-dlp.js +683 -26
  173. package/src/installs/yt-dlp.md +946 -0
  174. package/src/installs/yum-utils.js +297 -0
  175. package/src/installs/yum-utils.md +648 -0
  176. package/src/installs/zoom.js +740 -25
  177. package/src/installs/zoom.md +884 -0
  178. package/src/scripts/README.md +567 -45
  179. package/src/scripts/STATUS.md +208 -0
  180. package/src/scripts/afk.js +395 -7
  181. package/src/scripts/backup-all.js +731 -9
  182. package/src/scripts/backup-source.js +711 -8
  183. package/src/scripts/brewd.js +373 -7
  184. package/src/scripts/brewi.js +505 -9
  185. package/src/scripts/brewr.js +512 -9
  186. package/src/scripts/brews.js +462 -9
  187. package/src/scripts/brewu.js +488 -7
  188. package/src/scripts/c.js +185 -7
  189. package/src/scripts/ccurl.js +325 -8
  190. package/src/scripts/certbot-crontab-init.js +488 -8
  191. package/src/scripts/certbot-init.js +641 -9
  192. package/src/scripts/ch.js +339 -7
  193. package/src/scripts/claude-danger.js +253 -8
  194. package/src/scripts/clean-dev.js +419 -8
  195. package/src/scripts/clear-dns-cache.js +525 -7
  196. package/src/scripts/clone.js +417 -7
  197. package/src/scripts/code-all.js +420 -7
  198. package/src/scripts/count-files.js +195 -8
  199. package/src/scripts/count-folders.js +195 -8
  200. package/src/scripts/count.js +248 -8
  201. package/src/scripts/d.js +203 -7
  202. package/src/scripts/datauri.js +373 -8
  203. package/src/scripts/delete-files.js +363 -7
  204. package/src/scripts/docker-clean.js +410 -8
  205. package/src/scripts/dp.js +426 -7
  206. package/src/scripts/e.js +375 -9
  207. package/src/scripts/empty-trash.js +497 -7
  208. package/src/scripts/evm.js +428 -9
  209. package/src/scripts/fetch-github-repos.js +441 -10
  210. package/src/scripts/get-channel.js +329 -8
  211. package/src/scripts/get-course.js +384 -11
  212. package/src/scripts/get-dependencies.js +290 -9
  213. package/src/scripts/get-folder.js +783 -10
  214. package/src/scripts/get-tunes.js +411 -10
  215. package/src/scripts/get-video.js +352 -9
  216. package/src/scripts/git-backup.js +561 -9
  217. package/src/scripts/git-clone.js +477 -9
  218. package/src/scripts/git-pup.js +303 -7
  219. package/src/scripts/git-push.js +380 -8
  220. package/src/scripts/h.js +607 -9
  221. package/src/scripts/hide-desktop-icons.js +483 -7
  222. package/src/scripts/hide-hidden-files.js +522 -7
  223. package/src/scripts/install-dependencies-from.js +440 -9
  224. package/src/scripts/ips.js +647 -10
  225. package/src/scripts/iso.js +354 -8
  226. package/src/scripts/killni.js +561 -7
  227. package/src/scripts/ll.js +451 -8
  228. package/src/scripts/local-ip.js +310 -8
  229. package/src/scripts/m.js +508 -8
  230. package/src/scripts/map.js +293 -8
  231. package/src/scripts/mkd.js +287 -7
  232. package/src/scripts/ncu-update-all.js +441 -8
  233. package/src/scripts/nginx-init.js +702 -12
  234. package/src/scripts/npmi.js +366 -7
  235. package/src/scripts/o.js +495 -8
  236. package/src/scripts/org-by-date.js +321 -7
  237. package/src/scripts/p.js +208 -7
  238. package/src/scripts/packages.js +313 -8
  239. package/src/scripts/path.js +209 -7
  240. package/src/scripts/ports.js +582 -8
  241. package/src/scripts/q.js +290 -8
  242. package/src/scripts/refresh-files.js +378 -10
  243. package/src/scripts/remove-smaller-files.js +500 -8
  244. package/src/scripts/rename-files-with-date.js +517 -9
  245. package/src/scripts/resize-image.js +523 -9
  246. package/src/scripts/rm-safe.js +653 -8
  247. package/src/scripts/s.js +525 -9
  248. package/src/scripts/set-git-public.js +349 -7
  249. package/src/scripts/show-desktop-icons.js +459 -7
  250. package/src/scripts/show-hidden-files.js +456 -7
  251. package/src/scripts/tpa.js +265 -8
  252. package/src/scripts/tpo.js +264 -7
  253. package/src/scripts/u.js +489 -7
  254. package/src/scripts/vpush.js +422 -8
  255. package/src/scripts/y.js +267 -7
  256. package/src/utils/common/os.js +94 -2
  257. package/src/utils/ubuntu/apt.js +13 -7
@@ -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)