[{"data":1,"prerenderedAt":819},["ShallowReactive",2],{"navigation":3,"\u002Fblog\u002Foh-my-zsh-on-your-server":204,"\u002Fblog\u002Foh-my-zsh-on-your-server-surround":814},[4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140,144,148,152,156,160,164,168,172,176,180,184,188,192,196,200],{"title":5,"path":6,"stem":7},"You do not have time to not have tests","\u002Fblog\u002Fyou-do-not-have-time-to-not-have-tests","2.blog\u002F20211217.you-do-not-have-time-to-not-have-tests",{"title":9,"path":10,"stem":11},"Migrate Vue 2 with Vuetify and Jest to Vite and Vitest","\u002Fblog\u002Fmigrate-vue-2-with-vuetify-and-jest-to-vite-and-vitest","2.blog\u002F20220109.migrate-vue-2-with-vuetify-and-jest-to-vite-and-vitest",{"title":13,"path":14,"stem":15},"I am a Dark Matter Developer","\u002Fblog\u002Fi-am-a-dark-matter-developer","2.blog\u002F20220626.i-am-a-dark-matter-developer",{"title":17,"path":18,"stem":19},"Why using Conventional commits is useful","\u002Fblog\u002Fusing-conventional-commits","2.blog\u002F20240623.using-conventional-commits",{"title":21,"path":22,"stem":23},"Why you should make a toolbox repository","\u002Fblog\u002Fwhy-you-should-make-a-toolbox-repository","2.blog\u002F20240630.Why-you-should-make-a-toolbox-repository",{"title":25,"path":26,"stem":27},"Apache Airflow Part 1 - Why and Goals for a near Serverless ELT","\u002Fblog\u002Fapache-airflow-part-1-why-and-goals","2.blog\u002F20240710.apache-airflow-part-1-why-and-goals",{"title":29,"path":30,"stem":31},"Oh My Zsh on your server","\u002Fblog\u002Foh-my-zsh-on-your-server","2.blog\u002F20240711.oh-my-zsh-on-your-server",{"title":33,"path":34,"stem":35},"Fire tablet and YouTube Kids","\u002Fblog\u002Ffire-tablet-and-youtube-kids","2.blog\u002F20240714.fire-tablet-and-youtube-kids",{"title":37,"path":38,"stem":39},"Using Ollama and Continue as a GitHub Copilot Alternative","\u002Fblog\u002Fusing-ollama-and-continue-as-github-copilot-alternative","2.blog\u002F20240723.using-ollama-and-continue-as-github-copilot-alternative",{"title":41,"path":42,"stem":43},"Debugging Local Packages Made Easy with pnpm","\u002Fblog\u002Fdebugging-local-packages-with-pnpm-link","2.blog\u002F20250422.debugging local-packages-with-pnpm-link",{"title":45,"path":46,"stem":47},"Two Weeks with Cloudflare AI and Tools","\u002Fblog\u002Ftwo-weeks-with-cloudflare-ai-and-tools","2.blog\u002F20250509.two-weeks-with-cloudflare-aI-and-tools",{"title":49,"path":50,"stem":51},"Adding Prompts to VS Code - How I Learned to Stop Worrying and Love AI Context","\u002Fblog\u002Fadding-prompts-to-vscode","2.blog\u002F20250528.adding-prompts-to-vscode",{"title":53,"path":54,"stem":55},"My Best Practices","\u002Fblog\u002Fmy-best-practicies","2.blog\u002F20250607.my-best-practicies",{"title":57,"path":58,"stem":59},"Creating my own CLI Tool - Towles Tool","\u002Fblog\u002Ftowles-tool","2.blog\u002F20250607.towles-tool",{"title":61,"path":62,"stem":63},"Software Development Best Practices & ITIL","\u002Fblog\u002Fsoftware-engineering-and-itil-best-practices","2.blog\u002F20250612.software-engineering-and-itil-best-practices",{"title":65,"path":66,"stem":67},"Voice to Text","\u002Fblog\u002Fvoice-to-text","2.blog\u002F20250622.voice-to-text",{"title":69,"path":70,"stem":71},"Setting Up ComfyUI - A Better Alternative to Fooocus","\u002Fblog\u002Fcomfy-ui-setup","2.blog\u002F20250628.comfy-ui-setup",{"title":73,"path":74,"stem":75},"Voice to System","\u002Fblog\u002Fvoice-to-system","2.blog\u002F20250705.voice-to-system",{"title":77,"path":78,"stem":79},"Tips for Claude Code","\u002Fblog\u002Ftips-for-claude-code","2.blog\u002F20250713.tips-for-claude-code",{"title":81,"path":82,"stem":83},"Review That AI Code: Why I Read Every Line Generated Code","\u002Fblog\u002Freview-that-ai-code","2.blog\u002F20250720.review-that-ai-code",{"title":85,"path":86,"stem":87},"My Context Engineering Journey: From Dev Scripts to AI Collaboration","\u002Fblog\u002F20250803-1.my-context-engineering-journey","2.blog\u002F20250803-1.my-context-engineering-journey",{"title":89,"path":90,"stem":91},"Context Engineering at Scale: Enterprise Lessons and the Future of Development","\u002Fblog\u002F20250803-2.context-engineering-at-scale","2.blog\u002F20250803-2.context-engineering-at-scale",{"title":93,"path":94,"stem":95},"Check That Your Tools and Linters Do Not Burn Tokens","\u002Fblog\u002Fcheck-that-your-tools-and-linters-do-not-burn-tokens","2.blog\u002F20250806.check-that-your-tools-and-linters-do-not-burn-tokens",{"title":97,"path":98,"stem":99},"Markdown + AI: The Communication Protocol That Changes Everything","\u002Fblog\u002Fmarkdown-plus-ai-the-communication-protocol-that-changes-everything","2.blog\u002F20250814.markdown-plus-ai-the-communication-protocol-that-changes-everything",{"title":101,"path":102,"stem":103},"Finally: Type-Safe AI in Production (And Why I'm Here For It)","\u002Fblog\u002Ffinally-type-safe-ai-in-production-and-why-im-here-for-it","2.blog\u002F20250819.finally-type-safe-ai-in-production-and-why-im-here-for-it",{"title":105,"path":106,"stem":107},"Dotfiles: Masterpiece or Late Stage Picasso?","\u002Fblog\u002Fdotfiles-masterpiece-or-late-stage-picasso","2.blog\u002F20250822.dotfiles-masterpiece-or-late-stage-picasso",{"title":109,"path":110,"stem":111},"Beyond API Wrappers: Building State-Driven MCP Servers for Long-Horizon Agent Orchestration","\u002Fblog\u002Fbeyond-api-wrappers-mcp-servers","2.blog\u002F20250907.beyond-api-wrappers-mcp-servers",{"title":113,"path":114,"stem":115},"Why Vertical Integration Wins: A Software Engineer's Case for Owning Your Stack","\u002Fblog\u002Fwhy-i-bought-tesla-model-3-vertical-integration","2.blog\u002F20250928.why-i-bought-tesla-model-3-vertical-integration",{"title":117,"path":118,"stem":119},"The Min-Maxer's Trifecta: Building Tools for the Game You Actually Play","\u002Fblog\u002Fmin-maxer-trifecta","2.blog\u002F20251004.min-maxer-trifecta",{"title":121,"path":122,"stem":123},"Read The Source: Learning by Cutting Out The Middleman and RTFM","\u002Fblog\u002Fread-the-source","2.blog\u002F20251010.read-the-source",{"title":125,"path":126,"stem":127},"The Exponential Shift: Why AI Progress Feels Different Now","\u002Fblog\u002Fthe-exponential-shift","2.blog\u002F20251015.the-exponential-shift",{"title":129,"path":130,"stem":131},"Plan Mode for Your Problems, Edit Mode for Claude's","\u002Fblog\u002Fplan-mode-problems-edit-mode-solutions","2.blog\u002F20251019.plan-mode-problems-edit-mode-solutions",{"title":133,"path":134,"stem":135},"AWS Aurora DSQL Looked Perfect Until I Needed the Connection String","\u002Fblog\u002Faws-aurora-dsql-postgres-serverless-authentication","2.blog\u002F20251028.aws-aurora-dsql-postgres-serverless-authentication",{"title":137,"path":138,"stem":139},"Switchback: Browser History for Your Thoughts","\u002Fblog\u002Fswitchback-second-order-reasoning","2.blog\u002F20251205.switchback-second-order-reasoning",{"title":141,"path":142,"stem":143},"AI Pairing: Notes to Self","\u002Fblog\u002Fai-pairing-notes-to-self","2.blog\u002F20251216.ai-pairing-notes-to-self",{"title":145,"path":146,"stem":147},"I've Been Sleeping on Zellij","\u002Fblog\u002Fsleeping-on-zellij","2.blog\u002F20251229.sleeping-on-zellij",{"title":149,"path":150,"stem":151},"Implementing a Ralph Wiggum Loop: The Secret is Session Markers","\u002Fblog\u002Fimplementing-ralph-wiggum-loop-for-autonomous-ai-coding","2.blog\u002F20260114.implementing-ralph-wiggum-loop-for-autonomous-ai-coding",{"title":153,"path":154,"stem":155},"Goodhart's Law Ate My Context Window","\u002Fblog\u002Fgoodharts-law-ate-my-context-window","2.blog\u002F20260119.goodharts-law-ate-my-context-window",{"title":157,"path":158,"stem":159},"Claude Code's Hidden Multi-Agent System Is Real","\u002Fblog\u002Fclaude-code-hidden-multi-agent-system","2.blog\u002F20260124.claude-code-hidden-multi-agent-system",{"title":161,"path":162,"stem":163},"Free Printable Math Sheets for Kids — Number Chart, Skip Counting, Multiplication, and More","\u002Fblog\u002Ffree-printable-number-chart-and-coin-sheets","2.blog\u002F20260214.free-printable-number-chart-and-coin-sheets",{"title":165,"path":166,"stem":167},"We Are Near the End of the Exponential","\u002Fblog\u002Fnear-the-end-of-the-exponential","2.blog\u002F20260214.near-the-end-of-the-exponential",{"title":169,"path":170,"stem":171},"Free Printable Language Arts Sheets for Kids — Sight Words, Parts of Speech, Homophones, and More","\u002Fblog\u002Ffree-printable-sight-words-and-grammar-sheets","2.blog\u002F20260215.free-printable-sight-words-and-grammar-sheets",{"title":173,"path":174,"stem":175},"Interactive Code Execution with Artifacts","\u002Fblog\u002Finteractive-code-execution-with-artifacts","2.blog\u002F20260215.interactive-code-execution-with-artifacts",{"title":177,"path":178,"stem":179},"Free Printable Telling Time Worksheet for Kids — Clock Reference & Practice Sheet","\u002Fblog\u002Ffree-printable-telling-time-worksheet","2.blog\u002F20260216.free-printable-telling-time-worksheet",{"title":181,"path":182,"stem":183},"Claude Code Skills: Teaching AI Your Playbook","\u002Fblog\u002Fclaude-code-skills-guide","2.blog\u002F20260221.claude-code-skills-guide",{"title":185,"path":186,"stem":187},"Building a Multi-Agent Loan Approval System with Human-in-the-Loop","\u002Fblog\u002Fmulti-agent-loan-approval-human-in-the-loop","2.blog\u002F20260225.multi-agent-loan-approval-human-in-the-loop",{"title":189,"path":190,"stem":191},"The Inception of AI Infrastructure: Bottlenecks All the Way Down","\u002Fblog\u002Fbiggest-bottleneck-scaling-ai-compute","2.blog\u002F20260313.biggest-bottleneck-scaling-ai-compute",{"title":193,"path":194,"stem":195},"What I Tell Teams About Claude Code","\u002Fblog\u002Fwhat-i-tell-teams-about-claude-code","2.blog\u002F20260314.what-i-tell-teams-about-claude-code",{"title":197,"path":198,"stem":199},"The Hardest Part of AI Isn't the AI","\u002Fblog\u002Fthe-hardest-part-of-ai-isnt-the-ai","2.blog\u002F20260327.the-hardest-part-of-ai-isnt-the-ai",{"title":201,"path":202,"stem":203},"Claude Code Hooks: The Capability I Left on the Table","\u002Fblog\u002Fclaude-code-hooks-capability-left-on-the-table","2.blog\u002F20260401.claude-code-hooks-capability-left-on-the-table",{"id":205,"title":29,"authors":206,"badge":212,"body":214,"date":804,"description":805,"extension":806,"image":807,"meta":810,"navigation":327,"path":30,"seo":811,"status":812,"stem":31,"__hash__":813},"posts\u002F2.blog\u002F20240711.oh-my-zsh-on-your-server.md",[207],{"name":208,"to":209,"avatar":210},"Chris Towles","https:\u002F\u002Ftwitter.com\u002FChris_Towles",{"src":211},"\u002Fimages\u002Fctowles-profile-512x512.png",{"label":213},"productivity",{"type":215,"value":216,"toc":799},"minimark",[217,221,248,251,262,265,271,276,284,566,573,596,600,606,691,694,700,706,778,781,788,792,795],[218,219,220],"p",{},"So recently I've been helping other teams that have a lot of EC2 instances and find myself ssh'ing into them and running common and similar commands a lot!",[218,222,223,224,231,232,237,238,242,243,247],{},"On my personal machine I have my terminal using ",[225,226,230],"a",{"href":227,"rel":228},"https:\u002F\u002Fgithub.com\u002Fohmyzsh\u002Fohmyzsh",[229],"nofollow","oh-my-zsh"," and ",[225,233,236],{"href":234,"rel":235},"https:\u002F\u002Fgithub.com\u002Fspaceship-prompt\u002Fspaceship-prompt",[229],"Spaceship-prompt",". My ",[239,240,241],"code",{},".zshrc"," is public here: ",[225,244,245],{"href":245,"rel":246},"https:\u002F\u002Fgithub.com\u002FChrisTowles\u002Fdotfiles",[229],".",[218,249,250],{},"I take for granted all the useful behavior and commands that I use on my personal machine. Autocomplete previous commands, better syntax highlighting, and more.",[218,252,253,254,257,258,261],{},"When I ssh into a server I find myself grepping the history and looking for commands that I use all the time. On top of that, the default prompt doesn't have the server name. So it's SOOOO easy to be on the wrong server. Are you in ",[239,255,256],{},"production"," or ",[239,259,260],{},"nonprod","?",[218,263,264],{},"I'm wasting time and it's only a matter of time before I make a change to the wrong server and impact users by mistake.",[218,266,267,268,270],{},"After many weeks of helping out with this I decided to try and make it easier for myself. I've started setting up ",[239,269,230],{}," on the servers for my profiles I'm in constantly.",[272,273,275],"h2",{"id":274},"the-setup","The Setup",[218,277,278,279],{},"In my case these machines are Amazon Linux 2 and I found a great starting place at ",[225,280,283],{"href":281,"rel":282},"https:\u002F\u002Fblog.devops.dev\u002Finstalling-zsh-oh-my-zsh-on-amazon-ec2-amazon-linux-2-ami-88b5fc83109",[229],"here",[285,286,291],"pre",{"className":287,"code":288,"language":289,"meta":290,"style":290},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Installing ZSH\nsudo yum -y install zsh\n\n# Check ZSH has been installed\nzsh --version\n\n# Install \"util-linux-user\" because \"chsh\" is not available by default - https:\u002F\u002Fsuperuser.com\u002Fa\u002F1389273\u002F599050\nsudo yum -y install util-linux-user\n\n# Change default shell for current user\nchsh -s \"$(which zsh)\" $(whoami)\n\n# Install oh-my-zsh from https:\u002F\u002Fgithub.com\u002Fohmyzsh\u002Fohmyzsh#basic-installation\n# using unattended means not trying to change the default shell, and it also won't run zsh when the installation has finished.\nsh -c \"$(curl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fohmyzsh\u002Fohmyzsh\u002Fmaster\u002Ftools\u002Finstall.sh)\" \"\" --unattended\n\n# some of the most useful oh my zsh plugins\ngit clone https:\u002F\u002Fgithub.com\u002Fzsh-users\u002Fzsh-syntax-highlighting.git ${ZSH_CUSTOM:-~\u002F.oh-my-zsh\u002Fcustom}\u002Fplugins\u002Fzsh-syntax-highlighting\ngit clone https:\u002F\u002Fgithub.com\u002Fzsh-users\u002Fzsh-autosuggestions ${ZSH_CUSTOM:-~\u002F.oh-my-zsh\u002Fcustom}\u002Fplugins\u002Fzsh-autosuggestions\n\n# open new shell\nsudo su - $(whoami)\n\n","bash","",[239,292,293,302,322,329,335,344,349,355,369,374,380,412,417,423,429,454,459,465,507,538,543,549],{"__ignoreMap":290},[294,295,298],"span",{"class":296,"line":297},"line",1,[294,299,301],{"class":300},"sHwdD","# Installing ZSH\n",[294,303,305,309,313,316,319],{"class":296,"line":304},2,[294,306,308],{"class":307},"sBMFI","sudo",[294,310,312],{"class":311},"sfazB"," yum",[294,314,315],{"class":311}," -y",[294,317,318],{"class":311}," install",[294,320,321],{"class":311}," zsh\n",[294,323,325],{"class":296,"line":324},3,[294,326,328],{"emptyLinePlaceholder":327},true,"\n",[294,330,332],{"class":296,"line":331},4,[294,333,334],{"class":300},"# Check ZSH has been installed\n",[294,336,338,341],{"class":296,"line":337},5,[294,339,340],{"class":307},"zsh",[294,342,343],{"class":311}," --version\n",[294,345,347],{"class":296,"line":346},6,[294,348,328],{"emptyLinePlaceholder":327},[294,350,352],{"class":296,"line":351},7,[294,353,354],{"class":300},"# Install \"util-linux-user\" because \"chsh\" is not available by default - https:\u002F\u002Fsuperuser.com\u002Fa\u002F1389273\u002F599050\n",[294,356,358,360,362,364,366],{"class":296,"line":357},8,[294,359,308],{"class":307},[294,361,312],{"class":311},[294,363,315],{"class":311},[294,365,318],{"class":311},[294,367,368],{"class":311}," util-linux-user\n",[294,370,372],{"class":296,"line":371},9,[294,373,328],{"emptyLinePlaceholder":327},[294,375,377],{"class":296,"line":376},10,[294,378,379],{"class":300},"# Change default shell for current user\n",[294,381,383,386,389,393,397,400,403,406,409],{"class":296,"line":382},11,[294,384,385],{"class":307},"chsh",[294,387,388],{"class":311}," -s",[294,390,392],{"class":391},"sMK4o"," \"$(",[294,394,396],{"class":395},"s2Zo4","which",[294,398,399],{"class":311}," zsh",[294,401,402],{"class":391},")\"",[294,404,405],{"class":391}," $(",[294,407,408],{"class":307},"whoami",[294,410,411],{"class":391},")\n",[294,413,415],{"class":296,"line":414},12,[294,416,328],{"emptyLinePlaceholder":327},[294,418,420],{"class":296,"line":419},13,[294,421,422],{"class":300},"# Install oh-my-zsh from https:\u002F\u002Fgithub.com\u002Fohmyzsh\u002Fohmyzsh#basic-installation\n",[294,424,426],{"class":296,"line":425},14,[294,427,428],{"class":300},"# using unattended means not trying to change the default shell, and it also won't run zsh when the installation has finished.\n",[294,430,432,435,438,440,443,446,448,451],{"class":296,"line":431},15,[294,433,434],{"class":307},"sh",[294,436,437],{"class":311}," -c",[294,439,392],{"class":391},[294,441,442],{"class":307},"curl",[294,444,445],{"class":311}," -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fohmyzsh\u002Fohmyzsh\u002Fmaster\u002Ftools\u002Finstall.sh",[294,447,402],{"class":391},[294,449,450],{"class":391}," \"\"",[294,452,453],{"class":311}," --unattended\n",[294,455,457],{"class":296,"line":456},16,[294,458,328],{"emptyLinePlaceholder":327},[294,460,462],{"class":296,"line":461},17,[294,463,464],{"class":300},"# some of the most useful oh my zsh plugins\n",[294,466,468,471,474,477,480,484,487,490,493,496,498,501,504],{"class":296,"line":467},18,[294,469,470],{"class":307},"git",[294,472,473],{"class":311}," clone",[294,475,476],{"class":311}," https:\u002F\u002Fgithub.com\u002Fzsh-users\u002Fzsh-syntax-highlighting.git",[294,478,479],{"class":391}," ${",[294,481,483],{"class":482},"sTEyZ","ZSH_CUSTOM",[294,485,486],{"class":391},":-",[294,488,489],{"class":482},"~",[294,491,492],{"class":391},"\u002F",[294,494,495],{"class":482},".oh-my-zsh",[294,497,492],{"class":391},[294,499,500],{"class":482},"custom",[294,502,503],{"class":391},"}",[294,505,506],{"class":311},"\u002Fplugins\u002Fzsh-syntax-highlighting\n",[294,508,510,512,514,517,519,521,523,525,527,529,531,533,535],{"class":296,"line":509},19,[294,511,470],{"class":307},[294,513,473],{"class":311},[294,515,516],{"class":311}," https:\u002F\u002Fgithub.com\u002Fzsh-users\u002Fzsh-autosuggestions",[294,518,479],{"class":391},[294,520,483],{"class":482},[294,522,486],{"class":391},[294,524,489],{"class":482},[294,526,492],{"class":391},[294,528,495],{"class":482},[294,530,492],{"class":391},[294,532,500],{"class":482},[294,534,503],{"class":391},[294,536,537],{"class":311},"\u002Fplugins\u002Fzsh-autosuggestions\n",[294,539,541],{"class":296,"line":540},20,[294,542,328],{"emptyLinePlaceholder":327},[294,544,546],{"class":296,"line":545},21,[294,547,548],{"class":300},"# open new shell\n",[294,550,552,554,557,560,562,564],{"class":296,"line":551},22,[294,553,308],{"class":307},[294,555,556],{"class":311}," su",[294,558,559],{"class":311}," -",[294,561,405],{"class":391},[294,563,408],{"class":307},[294,565,411],{"class":391},[218,567,568,569,572],{},"Now modify the ",[239,570,571],{},"~\u002F.zshrc"," to update the plugins",[285,574,576],{"className":287,"code":575,"language":289,"meta":290,"style":290},"plugins=(git zsh-autosuggestions zsh-syntax-highlighting)\n",[239,577,578],{"__ignoreMap":290},[294,579,580,583,586,588,591,594],{"class":296,"line":297},[294,581,582],{"class":482},"plugins",[294,584,585],{"class":391},"=(",[294,587,470],{"class":311},[294,589,590],{"class":311}," zsh-autosuggestions",[294,592,593],{"class":311}," zsh-syntax-highlighting",[294,595,411],{"class":391},[272,597,599],{"id":598},"update-the-prompt-to-include-server-name","Update the prompt to include server name",[218,601,602,603,605],{},"So I want to quickly know what server I'm on you can modify the prompt in ",[239,604,571],{}," by adding this line:",[285,607,609],{"className":287,"code":608,"language":289,"meta":290,"style":290},"\nSERVER_FRIENDLY_NAME=REPLACE_WITH_FRIENDLY_SERVER_NAME\n# add user and host to ohmyzsh terminal prompt - https:\u002F\u002Fstackoverflow.com\u002Fquestions\u002F30199068\u002Fzsh-prompt-and-hostnameE\nautoload -U colors && colors\nPS1=\"%{$fg[green]%}%n%{$reset_color%}@%{$fg[cyan]%}%m %{$fg[yellow]%}%~ %{$reset_color%}%% \"\n\n",[239,610,611,615,626,631,648],{"__ignoreMap":290},[294,612,613],{"class":296,"line":297},[294,614,328],{"emptyLinePlaceholder":327},[294,616,617,620,623],{"class":296,"line":304},[294,618,619],{"class":482},"SERVER_FRIENDLY_NAME",[294,621,622],{"class":391},"=",[294,624,625],{"class":311},"REPLACE_WITH_FRIENDLY_SERVER_NAME\n",[294,627,628],{"class":296,"line":324},[294,629,630],{"class":300},"# add user and host to ohmyzsh terminal prompt - https:\u002F\u002Fstackoverflow.com\u002Fquestions\u002F30199068\u002Fzsh-prompt-and-hostnameE\n",[294,632,633,636,639,642,645],{"class":296,"line":331},[294,634,635],{"class":395},"autoload",[294,637,638],{"class":311}," -U",[294,640,641],{"class":311}," colors",[294,643,644],{"class":391}," &&",[294,646,647],{"class":307}," colors\n",[294,649,650,653,655,658,661,664,667,670,673,675,678,680,683,685,688],{"class":296,"line":337},[294,651,652],{"class":482},"PS1",[294,654,622],{"class":391},[294,656,657],{"class":391},"\"",[294,659,660],{"class":311},"%{",[294,662,663],{"class":482},"$fg",[294,665,666],{"class":311},"[green]%}%n%{",[294,668,669],{"class":482},"$reset_color",[294,671,672],{"class":311},"%}@%{",[294,674,663],{"class":482},[294,676,677],{"class":311},"[cyan]%}%m %{",[294,679,663],{"class":482},[294,681,682],{"class":311},"[yellow]%}%~ %{",[294,684,669],{"class":482},[294,686,687],{"class":311},"%}%% ",[294,689,690],{"class":391},"\"\n",[218,692,693],{},"But what if the default hostname is the EC2 IP? Here is AWS advice on changing the prompt without changing the DNS or hostname.",[218,695,696],{},[225,697,698],{"href":698,"rel":699},"https:\u002F\u002Fdocs.aws.amazon.com\u002Flinux\u002Fal2\u002Fug\u002Fset-hostname.html#set-hostname-shell",[229],[218,701,702,703,705],{},"Here we'll append this to the ",[239,704,571],{}," file.",[285,707,709],{"className":287,"code":708,"language":289,"meta":290,"style":290},"\nSERVER_FRIENDLY_NAME=REPLACE_WITH_FRIENDLY_SERVER_NAME\n# add user and host to ohmyzsh terminal prompt - https:\u002F\u002Fstackoverflow.com\u002Fquestions\u002F30199068\u002Fzsh-prompt-and-hostnameE\nautoload -U colors && colors\nPS1=\"%{$fg[green]%}%n%{$reset_color%}@%{$fg[cyan]%}$SERVER_FRIENDLY_NAME %{$fg[yellow]%}%~ %{$reset_color%}%% \"\n\n",[239,710,711,715,723,727,739],{"__ignoreMap":290},[294,712,713],{"class":296,"line":297},[294,714,328],{"emptyLinePlaceholder":327},[294,716,717,719,721],{"class":296,"line":304},[294,718,619],{"class":482},[294,720,622],{"class":391},[294,722,625],{"class":311},[294,724,725],{"class":296,"line":324},[294,726,630],{"class":300},[294,728,729,731,733,735,737],{"class":296,"line":331},[294,730,635],{"class":395},[294,732,638],{"class":311},[294,734,641],{"class":311},[294,736,644],{"class":391},[294,738,647],{"class":307},[294,740,741,743,745,747,749,751,753,755,757,759,762,765,768,770,772,774,776],{"class":296,"line":337},[294,742,652],{"class":482},[294,744,622],{"class":391},[294,746,657],{"class":391},[294,748,660],{"class":311},[294,750,663],{"class":482},[294,752,666],{"class":311},[294,754,669],{"class":482},[294,756,672],{"class":311},[294,758,663],{"class":482},[294,760,761],{"class":311},"[cyan]%}",[294,763,764],{"class":482},"$SERVER_FRIENDLY_NAME",[294,766,767],{"class":311}," %{",[294,769,663],{"class":482},[294,771,682],{"class":311},[294,773,669],{"class":482},[294,775,687],{"class":311},[294,777,690],{"class":391},[218,779,780],{},"Here is a screenshot of what this looks like.",[218,782,783],{},[784,785],"img",{"alt":786,"src":787},"h-my-zsh-server-friendly-name-in-prompt","\u002Fimages\u002Fblog\u002Foh-my-zsh-server-friendly-name-in-prompt.png",[272,789,791],{"id":790},"security","Security",[218,793,794],{},"So the reasons for not doing this are mainly security. Any additional piece of code on the machine is another attack vector. So this is a judgment call. What is the impact if oh-my-zsh is compromised versus the benefits? Based on the popularity of oh-my-zsh, I'm leaning towards this being safe enough to do in some environments.",[796,797,798],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":290,"searchDepth":304,"depth":304,"links":800},[801,802,803],{"id":274,"depth":304,"text":275},{"id":598,"depth":304,"text":599},{"id":790,"depth":304,"text":791},"2024-07-11","Why I'm installing it on servers I ssh into a lot.","md",{"src":808,"alt":809},"\u002Fimages\u002Fblog\u002Fimprove-server-terminal.png","desk with 3 monitors and lots of code open",{},{"title":29,"description":805},"published","v189JR8AnIceAGD3jbGjw1bZ3nzh0z7DYdOymZ7V2y4",[815,817],{"title":25,"path":26,"stem":27,"description":816,"status":812,"children":-1},"Reasons I want to use Airflow for a Proof of Concept near Serverless ELT",{"title":33,"path":34,"stem":35,"description":818,"status":812,"children":-1},"Getting YouTube and YouTube Kids to work on Amazon Fire for kids",1776221196452]