@fredlackey/devutils 0.0.18 → 0.1.0

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 (447) hide show
  1. package/README.md +214 -141
  2. package/package.json +8 -83
  3. package/src/api/loader.js +229 -0
  4. package/src/api/registry.json +62 -0
  5. package/src/cli.js +293 -60
  6. package/src/commands/ai/index.js +16 -0
  7. package/src/commands/ai/launch.js +112 -0
  8. package/src/commands/ai/list.js +54 -0
  9. package/src/commands/ai/resume.js +70 -0
  10. package/src/commands/ai/sessions.js +121 -0
  11. package/src/commands/ai/set.js +131 -0
  12. package/src/commands/ai/show.js +74 -0
  13. package/src/commands/ai/tools.js +46 -0
  14. package/src/commands/alias/add.js +93 -0
  15. package/src/commands/alias/helpers.js +107 -0
  16. package/src/commands/alias/index.js +14 -0
  17. package/src/commands/alias/list.js +55 -0
  18. package/src/commands/alias/remove.js +62 -0
  19. package/src/commands/alias/sync.js +109 -0
  20. package/src/commands/api/disable.js +73 -0
  21. package/src/commands/api/enable.js +148 -0
  22. package/src/commands/api/index.js +15 -0
  23. package/src/commands/api/list.js +66 -0
  24. package/src/commands/api/update.js +87 -0
  25. package/src/commands/auth/index.js +15 -0
  26. package/src/commands/auth/list.js +49 -0
  27. package/src/commands/auth/login.js +384 -0
  28. package/src/commands/auth/logout.js +111 -0
  29. package/src/commands/auth/refresh.js +184 -0
  30. package/src/commands/auth/services.js +169 -0
  31. package/src/commands/auth/status.js +104 -0
  32. package/src/commands/config/export.js +224 -0
  33. package/src/commands/config/get.js +52 -0
  34. package/src/commands/config/import.js +308 -0
  35. package/src/commands/config/index.js +17 -0
  36. package/src/commands/config/init.js +143 -0
  37. package/src/commands/config/reset.js +57 -0
  38. package/src/commands/config/set.js +93 -0
  39. package/src/commands/config/show.js +35 -0
  40. package/src/commands/help.js +338 -0
  41. package/src/commands/identity/add.js +133 -0
  42. package/src/commands/identity/index.js +17 -0
  43. package/src/commands/identity/link.js +76 -0
  44. package/src/commands/identity/list.js +48 -0
  45. package/src/commands/identity/remove.js +72 -0
  46. package/src/commands/identity/show.js +65 -0
  47. package/src/commands/identity/sync.js +172 -0
  48. package/src/commands/identity/unlink.js +57 -0
  49. package/src/commands/ignore/add.js +165 -0
  50. package/src/commands/ignore/index.js +14 -0
  51. package/src/commands/ignore/list.js +89 -0
  52. package/src/commands/ignore/markers.js +43 -0
  53. package/src/commands/ignore/remove.js +164 -0
  54. package/src/commands/ignore/show.js +169 -0
  55. package/src/commands/machine/detect.js +122 -0
  56. package/src/commands/machine/index.js +14 -0
  57. package/src/commands/machine/list.js +74 -0
  58. package/src/commands/machine/set.js +106 -0
  59. package/src/commands/machine/show.js +35 -0
  60. package/src/commands/schema.js +152 -0
  61. package/src/commands/search/collections.js +134 -0
  62. package/src/commands/search/get.js +71 -0
  63. package/src/commands/search/index-cmd.js +54 -0
  64. package/src/commands/search/index.js +21 -0
  65. package/src/commands/search/keyword.js +60 -0
  66. package/src/commands/search/qmd.js +70 -0
  67. package/src/commands/search/query.js +64 -0
  68. package/src/commands/search/semantic.js +62 -0
  69. package/src/commands/search/status.js +46 -0
  70. package/src/commands/status.js +224 -171
  71. package/src/commands/tools/check.js +79 -0
  72. package/src/commands/tools/index.js +14 -0
  73. package/src/commands/tools/install.js +110 -0
  74. package/src/commands/tools/list.js +91 -0
  75. package/src/commands/tools/search.js +60 -0
  76. package/src/commands/update.js +83 -112
  77. package/src/commands/util/add.js +151 -0
  78. package/src/commands/util/index.js +15 -0
  79. package/src/commands/util/list.js +97 -0
  80. package/src/commands/util/remove.js +76 -0
  81. package/src/commands/util/run.js +79 -0
  82. package/src/commands/util/show.js +67 -0
  83. package/src/commands/version.js +21 -88
  84. package/src/installers/_template.js +104 -0
  85. package/src/installers/git.js +150 -0
  86. package/src/installers/homebrew.js +190 -0
  87. package/src/installers/node.js +223 -0
  88. package/src/installers/registry.json +29 -0
  89. package/src/lib/config.js +125 -0
  90. package/src/lib/detect.js +74 -0
  91. package/src/lib/errors.js +114 -0
  92. package/src/lib/github.js +315 -0
  93. package/src/lib/installer.js +225 -0
  94. package/src/lib/output.js +239 -0
  95. package/src/lib/platform.js +112 -0
  96. package/src/lib/platforms/amazon-linux.js +41 -0
  97. package/src/lib/platforms/gitbash.js +46 -0
  98. package/src/lib/platforms/macos.js +45 -0
  99. package/src/lib/platforms/raspbian.js +41 -0
  100. package/src/lib/platforms/ubuntu.js +39 -0
  101. package/src/lib/platforms/windows.js +45 -0
  102. package/src/lib/prompt.js +161 -0
  103. package/src/lib/schema.js +211 -0
  104. package/src/lib/shell.js +75 -0
  105. package/src/patterns/gitignore/claude-code.txt +25 -0
  106. package/src/patterns/gitignore/docker.txt +15 -0
  107. package/src/patterns/gitignore/go.txt +24 -0
  108. package/src/patterns/gitignore/java.txt +38 -0
  109. package/src/patterns/gitignore/jetbrains.txt +26 -0
  110. package/src/patterns/gitignore/linux.txt +18 -0
  111. package/src/patterns/gitignore/macos.txt +27 -0
  112. package/src/patterns/gitignore/node.txt +51 -0
  113. package/src/patterns/gitignore/python.txt +55 -0
  114. package/src/patterns/gitignore/rust.txt +14 -0
  115. package/src/patterns/gitignore/terraform.txt +30 -0
  116. package/src/patterns/gitignore/vscode.txt +15 -0
  117. package/src/patterns/gitignore/windows.txt +25 -0
  118. package/src/utils/clone/index.js +165 -0
  119. package/src/utils/git-push/index.js +230 -0
  120. package/src/utils/git-status/index.js +116 -0
  121. package/src/utils/git-status/unix.sh +75 -0
  122. package/src/utils/registry.json +41 -0
  123. package/bin/dev.js +0 -16
  124. package/files/README.md +0 -0
  125. package/files/claude/.claude/commands/setup-context.md +0 -3
  126. package/files/monorepos/_archive/README.md +0 -36
  127. package/files/monorepos/_legacy/README.md +0 -36
  128. package/files/monorepos/ai-docs/README.md +0 -33
  129. package/files/monorepos/apps/README.md +0 -24
  130. package/files/monorepos/docs/README.md +0 -40
  131. package/files/monorepos/packages/README.md +0 -25
  132. package/files/monorepos/research/README.md +0 -29
  133. package/files/monorepos/scripts/README.md +0 -24
  134. package/src/commands/README.md +0 -41
  135. package/src/commands/configure.js +0 -199
  136. package/src/commands/identity.js +0 -1630
  137. package/src/commands/ignore.js +0 -247
  138. package/src/commands/install.js +0 -526
  139. package/src/commands/setup.js +0 -246
  140. package/src/completion.js +0 -284
  141. package/src/constants.js +0 -45
  142. package/src/ignore/claude-code.txt +0 -10
  143. package/src/ignore/docker.txt +0 -18
  144. package/src/ignore/linux.txt +0 -23
  145. package/src/ignore/macos.txt +0 -36
  146. package/src/ignore/node.txt +0 -55
  147. package/src/ignore/terraform.txt +0 -37
  148. package/src/ignore/vscode.txt +0 -18
  149. package/src/ignore/windows.txt +0 -35
  150. package/src/index.js +0 -0
  151. package/src/installs/README.md +0 -399
  152. package/src/installs/adobe-creative-cloud.js +0 -546
  153. package/src/installs/adobe-creative-cloud.md +0 -605
  154. package/src/installs/appcleaner.js +0 -321
  155. package/src/installs/appcleaner.md +0 -699
  156. package/src/installs/apt-transport-https.js +0 -390
  157. package/src/installs/apt-transport-https.md +0 -678
  158. package/src/installs/atomicparsley.js +0 -642
  159. package/src/installs/atomicparsley.md +0 -795
  160. package/src/installs/aws-cli.js +0 -797
  161. package/src/installs/aws-cli.md +0 -727
  162. package/src/installs/balena-etcher.js +0 -710
  163. package/src/installs/balena-etcher.md +0 -761
  164. package/src/installs/bambu-studio.js +0 -1143
  165. package/src/installs/bambu-studio.md +0 -780
  166. package/src/installs/bash-completion.js +0 -575
  167. package/src/installs/bash-completion.md +0 -833
  168. package/src/installs/bash.js +0 -417
  169. package/src/installs/bash.md +0 -993
  170. package/src/installs/beyond-compare.js +0 -603
  171. package/src/installs/beyond-compare.md +0 -813
  172. package/src/installs/brave-browser.js +0 -968
  173. package/src/installs/brave-browser.md +0 -650
  174. package/src/installs/build-essential.js +0 -529
  175. package/src/installs/build-essential.md +0 -977
  176. package/src/installs/ca-certificates.js +0 -618
  177. package/src/installs/ca-certificates.md +0 -937
  178. package/src/installs/caffeine.js +0 -508
  179. package/src/installs/caffeine.md +0 -839
  180. package/src/installs/camtasia.js +0 -596
  181. package/src/installs/camtasia.md +0 -762
  182. package/src/installs/chatgpt.js +0 -476
  183. package/src/installs/chatgpt.md +0 -814
  184. package/src/installs/chocolatey.js +0 -456
  185. package/src/installs/chocolatey.md +0 -661
  186. package/src/installs/chrome-canary.js +0 -419
  187. package/src/installs/chrome-canary.md +0 -641
  188. package/src/installs/chromium.js +0 -667
  189. package/src/installs/chromium.md +0 -838
  190. package/src/installs/claude-code.js +0 -576
  191. package/src/installs/claude-code.md +0 -1173
  192. package/src/installs/cloudflare-warp.js +0 -900
  193. package/src/installs/cloudflare-warp.md +0 -1047
  194. package/src/installs/comet-browser.js +0 -588
  195. package/src/installs/comet-browser.md +0 -731
  196. package/src/installs/curl.js +0 -379
  197. package/src/installs/curl.md +0 -714
  198. package/src/installs/cursor.js +0 -579
  199. package/src/installs/cursor.md +0 -970
  200. package/src/installs/dbeaver.js +0 -924
  201. package/src/installs/dbeaver.md +0 -939
  202. package/src/installs/dbschema.js +0 -692
  203. package/src/installs/dbschema.md +0 -925
  204. package/src/installs/dependencies.md +0 -453
  205. package/src/installs/development-tools.js +0 -600
  206. package/src/installs/development-tools.md +0 -977
  207. package/src/installs/docker.js +0 -1029
  208. package/src/installs/docker.md +0 -1109
  209. package/src/installs/drawio.js +0 -1019
  210. package/src/installs/drawio.md +0 -795
  211. package/src/installs/elmedia-player.js +0 -347
  212. package/src/installs/elmedia-player.md +0 -556
  213. package/src/installs/ffmpeg.js +0 -889
  214. package/src/installs/ffmpeg.md +0 -852
  215. package/src/installs/file.js +0 -464
  216. package/src/installs/file.md +0 -987
  217. package/src/installs/gemini-cli.js +0 -811
  218. package/src/installs/gemini-cli.md +0 -1153
  219. package/src/installs/git.js +0 -400
  220. package/src/installs/git.md +0 -907
  221. package/src/installs/gitego.js +0 -949
  222. package/src/installs/gitego.md +0 -1172
  223. package/src/installs/go.js +0 -931
  224. package/src/installs/go.md +0 -958
  225. package/src/installs/google-antigravity.js +0 -913
  226. package/src/installs/google-antigravity.md +0 -1075
  227. package/src/installs/google-chrome.js +0 -833
  228. package/src/installs/google-chrome.md +0 -862
  229. package/src/installs/gpg.js +0 -480
  230. package/src/installs/gpg.md +0 -1056
  231. package/src/installs/homebrew.js +0 -1028
  232. package/src/installs/homebrew.md +0 -988
  233. package/src/installs/imageoptim.js +0 -968
  234. package/src/installs/imageoptim.md +0 -1119
  235. package/src/installs/installers.json +0 -4032
  236. package/src/installs/installers.json.tmp +0 -3953
  237. package/src/installs/jq.js +0 -400
  238. package/src/installs/jq.md +0 -809
  239. package/src/installs/keyboard-maestro.js +0 -719
  240. package/src/installs/keyboard-maestro.md +0 -825
  241. package/src/installs/kiro.js +0 -864
  242. package/src/installs/kiro.md +0 -1015
  243. package/src/installs/latex.js +0 -789
  244. package/src/installs/latex.md +0 -1095
  245. package/src/installs/lftp.js +0 -356
  246. package/src/installs/lftp.md +0 -907
  247. package/src/installs/lsb-release.js +0 -346
  248. package/src/installs/lsb-release.md +0 -814
  249. package/src/installs/messenger.js +0 -847
  250. package/src/installs/messenger.md +0 -900
  251. package/src/installs/microsoft-office.js +0 -568
  252. package/src/installs/microsoft-office.md +0 -760
  253. package/src/installs/microsoft-teams.js +0 -801
  254. package/src/installs/microsoft-teams.md +0 -886
  255. package/src/installs/moom.js +0 -326
  256. package/src/installs/moom.md +0 -570
  257. package/src/installs/node.js +0 -904
  258. package/src/installs/node.md +0 -1153
  259. package/src/installs/nordpass.js +0 -716
  260. package/src/installs/nordpass.md +0 -921
  261. package/src/installs/nordvpn.js +0 -892
  262. package/src/installs/nordvpn.md +0 -1052
  263. package/src/installs/nvm.js +0 -995
  264. package/src/installs/nvm.md +0 -1057
  265. package/src/installs/ohmyzsh.js +0 -529
  266. package/src/installs/ohmyzsh.md +0 -1094
  267. package/src/installs/openssh.js +0 -804
  268. package/src/installs/openssh.md +0 -1056
  269. package/src/installs/pandoc.js +0 -662
  270. package/src/installs/pandoc.md +0 -1036
  271. package/src/installs/parallels-desktop.js +0 -431
  272. package/src/installs/parallels-desktop.md +0 -446
  273. package/src/installs/pinentry.js +0 -510
  274. package/src/installs/pinentry.md +0 -1142
  275. package/src/installs/pngyu.js +0 -869
  276. package/src/installs/pngyu.md +0 -896
  277. package/src/installs/postman.js +0 -799
  278. package/src/installs/postman.md +0 -940
  279. package/src/installs/procps.js +0 -425
  280. package/src/installs/procps.md +0 -851
  281. package/src/installs/safari-tech-preview.js +0 -374
  282. package/src/installs/safari-tech-preview.md +0 -533
  283. package/src/installs/sfnt2woff.js +0 -658
  284. package/src/installs/sfnt2woff.md +0 -795
  285. package/src/installs/shellcheck.js +0 -481
  286. package/src/installs/shellcheck.md +0 -1005
  287. package/src/installs/slack.js +0 -741
  288. package/src/installs/slack.md +0 -865
  289. package/src/installs/snagit.js +0 -585
  290. package/src/installs/snagit.md +0 -844
  291. package/src/installs/software-properties-common.js +0 -372
  292. package/src/installs/software-properties-common.md +0 -805
  293. package/src/installs/spotify.js +0 -877
  294. package/src/installs/spotify.md +0 -901
  295. package/src/installs/studio-3t.js +0 -823
  296. package/src/installs/studio-3t.md +0 -918
  297. package/src/installs/sublime-text.js +0 -804
  298. package/src/installs/sublime-text.md +0 -914
  299. package/src/installs/superwhisper.js +0 -706
  300. package/src/installs/superwhisper.md +0 -630
  301. package/src/installs/tailscale.js +0 -745
  302. package/src/installs/tailscale.md +0 -1100
  303. package/src/installs/tar.js +0 -389
  304. package/src/installs/tar.md +0 -946
  305. package/src/installs/termius.js +0 -798
  306. package/src/installs/termius.md +0 -844
  307. package/src/installs/terraform.js +0 -779
  308. package/src/installs/terraform.md +0 -899
  309. package/src/installs/tfenv.js +0 -778
  310. package/src/installs/tfenv.md +0 -1091
  311. package/src/installs/tidal.js +0 -771
  312. package/src/installs/tidal.md +0 -864
  313. package/src/installs/tmux.js +0 -346
  314. package/src/installs/tmux.md +0 -1030
  315. package/src/installs/tree.js +0 -411
  316. package/src/installs/tree.md +0 -833
  317. package/src/installs/unzip.js +0 -460
  318. package/src/installs/unzip.md +0 -879
  319. package/src/installs/vim.js +0 -421
  320. package/src/installs/vim.md +0 -1040
  321. package/src/installs/vlc.js +0 -821
  322. package/src/installs/vlc.md +0 -927
  323. package/src/installs/vscode.js +0 -843
  324. package/src/installs/vscode.md +0 -1002
  325. package/src/installs/wget.js +0 -420
  326. package/src/installs/wget.md +0 -791
  327. package/src/installs/whatsapp.js +0 -729
  328. package/src/installs/whatsapp.md +0 -854
  329. package/src/installs/winpty.js +0 -352
  330. package/src/installs/winpty.md +0 -620
  331. package/src/installs/woff2.js +0 -553
  332. package/src/installs/woff2.md +0 -977
  333. package/src/installs/wsl.js +0 -572
  334. package/src/installs/wsl.md +0 -699
  335. package/src/installs/xcode-clt.js +0 -520
  336. package/src/installs/xcode-clt.md +0 -351
  337. package/src/installs/xcode.js +0 -560
  338. package/src/installs/xcode.md +0 -573
  339. package/src/installs/yarn.js +0 -824
  340. package/src/installs/yarn.md +0 -1074
  341. package/src/installs/yq.js +0 -654
  342. package/src/installs/yq.md +0 -944
  343. package/src/installs/yt-dlp.js +0 -701
  344. package/src/installs/yt-dlp.md +0 -946
  345. package/src/installs/yum-utils.js +0 -297
  346. package/src/installs/yum-utils.md +0 -648
  347. package/src/installs/zoom.js +0 -759
  348. package/src/installs/zoom.md +0 -884
  349. package/src/installs/zsh.js +0 -455
  350. package/src/installs/zsh.md +0 -1008
  351. package/src/scripts/README.md +0 -617
  352. package/src/scripts/STATUS.md +0 -208
  353. package/src/scripts/afk.js +0 -411
  354. package/src/scripts/backup-all.js +0 -746
  355. package/src/scripts/backup-source.js +0 -727
  356. package/src/scripts/brewd.js +0 -389
  357. package/src/scripts/brewi.js +0 -520
  358. package/src/scripts/brewr.js +0 -527
  359. package/src/scripts/brews.js +0 -477
  360. package/src/scripts/brewu.js +0 -504
  361. package/src/scripts/c.js +0 -201
  362. package/src/scripts/ccurl.js +0 -341
  363. package/src/scripts/certbot-crontab-init.js +0 -504
  364. package/src/scripts/certbot-init.js +0 -657
  365. package/src/scripts/ch.js +0 -355
  366. package/src/scripts/claude-danger.js +0 -268
  367. package/src/scripts/clean-dev.js +0 -435
  368. package/src/scripts/clear-dns-cache.js +0 -541
  369. package/src/scripts/clone.js +0 -435
  370. package/src/scripts/code-all.js +0 -437
  371. package/src/scripts/count-files.js +0 -211
  372. package/src/scripts/count-folders.js +0 -211
  373. package/src/scripts/count.js +0 -264
  374. package/src/scripts/d.js +0 -219
  375. package/src/scripts/datauri.js +0 -389
  376. package/src/scripts/delete-files.js +0 -380
  377. package/src/scripts/docker-clean.js +0 -426
  378. package/src/scripts/dp.js +0 -442
  379. package/src/scripts/e.js +0 -390
  380. package/src/scripts/empty-trash.js +0 -513
  381. package/src/scripts/evm.js +0 -444
  382. package/src/scripts/fetch-github-repos.js +0 -456
  383. package/src/scripts/get-channel.js +0 -345
  384. package/src/scripts/get-course.js +0 -399
  385. package/src/scripts/get-dependencies.js +0 -306
  386. package/src/scripts/get-folder.js +0 -799
  387. package/src/scripts/get-tunes.js +0 -426
  388. package/src/scripts/get-video.js +0 -367
  389. package/src/scripts/git-backup.js +0 -577
  390. package/src/scripts/git-clone.js +0 -493
  391. package/src/scripts/git-pup.js +0 -319
  392. package/src/scripts/git-push.js +0 -396
  393. package/src/scripts/h.js +0 -622
  394. package/src/scripts/hide-desktop-icons.js +0 -499
  395. package/src/scripts/hide-hidden-files.js +0 -538
  396. package/src/scripts/install-dependencies-from.js +0 -456
  397. package/src/scripts/ips.js +0 -663
  398. package/src/scripts/iso.js +0 -370
  399. package/src/scripts/killni.js +0 -577
  400. package/src/scripts/ll.js +0 -467
  401. package/src/scripts/local-ip.js +0 -325
  402. package/src/scripts/m.js +0 -524
  403. package/src/scripts/map.js +0 -309
  404. package/src/scripts/mkd.js +0 -351
  405. package/src/scripts/ncu-update-all.js +0 -457
  406. package/src/scripts/nginx-init.js +0 -718
  407. package/src/scripts/npmi.js +0 -382
  408. package/src/scripts/o.js +0 -511
  409. package/src/scripts/org-by-date.js +0 -338
  410. package/src/scripts/p.js +0 -224
  411. package/src/scripts/packages.js +0 -330
  412. package/src/scripts/path.js +0 -225
  413. package/src/scripts/ports.js +0 -597
  414. package/src/scripts/q.js +0 -305
  415. package/src/scripts/refresh-files.js +0 -394
  416. package/src/scripts/remove-smaller-files.js +0 -516
  417. package/src/scripts/rename-files-with-date.js +0 -533
  418. package/src/scripts/resize-image.js +0 -539
  419. package/src/scripts/rm-safe.js +0 -669
  420. package/src/scripts/s.js +0 -540
  421. package/src/scripts/set-git-public.js +0 -365
  422. package/src/scripts/show-desktop-icons.js +0 -475
  423. package/src/scripts/show-hidden-files.js +0 -472
  424. package/src/scripts/tpa.js +0 -280
  425. package/src/scripts/tpo.js +0 -280
  426. package/src/scripts/u.js +0 -505
  427. package/src/scripts/vpush.js +0 -437
  428. package/src/scripts/y.js +0 -283
  429. package/src/utils/README.md +0 -95
  430. package/src/utils/common/apps.js +0 -143
  431. package/src/utils/common/display.js +0 -157
  432. package/src/utils/common/network.js +0 -185
  433. package/src/utils/common/os.js +0 -294
  434. package/src/utils/common/package-manager.js +0 -301
  435. package/src/utils/common/privileges.js +0 -138
  436. package/src/utils/common/shell.js +0 -261
  437. package/src/utils/macos/apps.js +0 -228
  438. package/src/utils/macos/brew.js +0 -315
  439. package/src/utils/ubuntu/apt.js +0 -307
  440. package/src/utils/ubuntu/desktop.js +0 -292
  441. package/src/utils/ubuntu/snap.js +0 -344
  442. package/src/utils/ubuntu/systemd.js +0 -286
  443. package/src/utils/windows/choco.js +0 -465
  444. package/src/utils/windows/env.js +0 -246
  445. package/src/utils/windows/registry.js +0 -269
  446. package/src/utils/windows/shell.js +0 -240
  447. package/src/utils/windows/winget.js +0 -489
@@ -1,1056 +0,0 @@
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)