{"id":77773,"date":"2026-07-14T06:22:51","date_gmt":"2026-07-14T06:22:51","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=77773"},"modified":"2026-07-14T06:22:54","modified_gmt":"2026-07-14T06:22:54","slug":"macos-how-to-build-a-3-pane-ssh-workspace-on-macos-using-tmux","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/macos-how-to-build-a-3-pane-ssh-workspace-on-macos-using-tmux\/","title":{"rendered":"macOS: How to Build a 3-Pane SSH Workspace on macOS Using tmux"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Managing multiple remote servers from separate Terminal windows quickly becomes messy. A cleaner approach is to use <strong>tmux<\/strong>, which lets you divide one Terminal window into multiple interactive panes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In this tutorial, we will build a reusable three-pane workspace with:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>One local Mac terminal<\/li>\n\n\n\n<li>One SSH session to <code>dm-tokyo-m4-1<\/code><\/li>\n\n\n\n<li>One SSH session to <code>dm-tokyo-m4-2<\/code><\/li>\n\n\n\n<li>Visible pane labels<\/li>\n\n\n\n<li>Mouse-based pane switching<\/li>\n\n\n\n<li>A short <code>m4<\/code> command to launch the workspace<\/li>\n\n\n\n<li>Safe handling when the command is run from inside an existing tmux session<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The final layout will look like this:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">+------------------------+------------------------+\n|                        | dm-tokyo-m4-1          |\n| MacBook Local          | ci@172.16.11.91        |\n|                        |                        |\n|                        +------------------------+\n|                        | dm-tokyo-m4-2          |\n|                        | ci@172.16.11.222       |\n+------------------------+------------------------+\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">1. What Is tmux?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">tmux stands for <strong>terminal multiplexer<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It allows you to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Run multiple terminal sessions inside one window<\/li>\n\n\n\n<li>Divide a Terminal window into panes<\/li>\n\n\n\n<li>Keep commands running after disconnecting<\/li>\n\n\n\n<li>Reconnect to existing sessions<\/li>\n\n\n\n<li>Switch between local and remote terminals quickly<\/li>\n\n\n\n<li>Manage several servers from one screen<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">tmux is especially useful for DevOps engineers, system administrators, developers, and anyone managing multiple remote machines.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">2. Use Cases<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This setup is useful when you need to:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Monitor multiple servers<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">You can keep logs, system metrics, and application processes visible across several servers.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Compare server configurations<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Run the same command on two machines and compare their outputs side by side.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Manage CI runners<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Keep one pane for your local Mac and one pane for each GitHub Actions runner or build machine.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Troubleshoot distributed systems<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">View logs from multiple services without switching Terminal windows.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Perform deployments<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Use one pane for deployment commands and other panes for application logs or health checks.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Keep a persistent workspace<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Detach from tmux without stopping your SSH connections, then reconnect later.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">3. Prerequisites<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">You need:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>macOS<\/li>\n\n\n\n<li>Homebrew<\/li>\n\n\n\n<li>Access to the remote servers<\/li>\n\n\n\n<li>SSH access using the <code>ci<\/code> user<\/li>\n\n\n\n<li>Passwordless SSH configured, preferably using SSH keys<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The servers used in this example are:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\">172<span class=\"hljs-selector-class\">.16<\/span><span class=\"hljs-selector-class\">.11<\/span><span class=\"hljs-selector-class\">.91<\/span>    <span class=\"hljs-selector-tag\">dm-tokyo-m4-1<\/span>\n172<span class=\"hljs-selector-class\">.16<\/span><span class=\"hljs-selector-class\">.11<\/span><span class=\"hljs-selector-class\">.222<\/span>   <span class=\"hljs-selector-tag\">dm-tokyo-m4-2<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">4. Install tmux on macOS<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Install tmux using Homebrew:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">brew install tmux\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Verify the installation:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">tmux -V\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Example output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">tmux<\/span> 3<span class=\"hljs-selector-class\">.5a<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">5. Test SSH Access<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Before creating the tmux workspace, confirm that you can connect to both servers:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">ssh<\/span> <span class=\"hljs-selector-tag\">ci<\/span><span class=\"hljs-keyword\">@172<\/span>.16.11.91\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">And:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">ssh<\/span> <span class=\"hljs-selector-tag\">ci<\/span><span class=\"hljs-keyword\">@172<\/span>.16.11.222\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The SSH syntax must include the <code>@<\/code> symbol.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Correct:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">ssh<\/span> <span class=\"hljs-selector-tag\">ci<\/span><span class=\"hljs-keyword\">@172<\/span>.16.11.91\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Incorrect:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">ssh<\/span> <span class=\"hljs-selector-tag\">ci172<\/span><span class=\"hljs-selector-class\">.16<\/span><span class=\"hljs-selector-class\">.11<\/span><span class=\"hljs-selector-class\">.91<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The second command tries to resolve <code>ci172.16.11.91<\/code> as a hostname and will fail.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">6. Optional: Configure Passwordless SSH<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Check whether you already have an SSH key:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">ls -l ~<span class=\"hljs-regexp\">\/.ssh\/i<\/span>d_ed25519 ~<span class=\"hljs-regexp\">\/.ssh\/i<\/span>d_ed25519.pub\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">If the key does not exist, create one:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">ssh-keygen -t ed25519 -C <span class=\"hljs-string\">\"rajesh@DM-GYK3HC26H7\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Press Enter to accept the default location:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">\/Users\/rajesh\/.ssh\/id_ed25519\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For completely passwordless login, leave the passphrase empty by pressing Enter twice.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Copy the key to the first server:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">cat ~<span class=\"hljs-regexp\">\/.ssh\/i<\/span>d_ed25519.pub | ssh ci@<span class=\"hljs-number\">172.16<\/span><span class=\"hljs-number\">.11<\/span><span class=\"hljs-number\">.91<\/span> \\\n<span class=\"hljs-string\">'mkdir -p ~\/.ssh &amp;&amp; chmod 700 ~\/.ssh &amp;&amp; cat &gt;&gt; ~\/.ssh\/authorized_keys &amp;&amp; chmod 600 ~\/.ssh\/authorized_keys'<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Copy it to the second server:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">cat ~<span class=\"hljs-regexp\">\/.ssh\/i<\/span>d_ed25519.pub | ssh ci@<span class=\"hljs-number\">172.16<\/span><span class=\"hljs-number\">.11<\/span><span class=\"hljs-number\">.222<\/span> \\\n<span class=\"hljs-string\">'mkdir -p ~\/.ssh &amp;&amp; chmod 700 ~\/.ssh &amp;&amp; cat &gt;&gt; ~\/.ssh\/authorized_keys &amp;&amp; chmod 600 ~\/.ssh\/authorized_keys'<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Test both connections again:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">ssh<\/span> <span class=\"hljs-selector-tag\">ci<\/span><span class=\"hljs-keyword\">@172<\/span>.16.11.91\nssh ci@<span class=\"hljs-number\">172.16<\/span>.<span class=\"hljs-number\">11.222<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">They should connect without requesting the remote account password.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">7. Optional: Create Friendly SSH Hostnames<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Create or edit your SSH configuration:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">vi ~<span class=\"hljs-regexp\">\/.ssh\/<\/span>config\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Add:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Host dm-tokyo-m4<span class=\"hljs-number\">-1<\/span>\n    HostName <span class=\"hljs-number\">172.16<\/span><span class=\"hljs-number\">.11<\/span><span class=\"hljs-number\">.91<\/span>\n    User ci\n    IdentityFile ~<span class=\"hljs-regexp\">\/.ssh\/i<\/span>d_ed25519\n    IdentitiesOnly yes\n\nHost dm-tokyo-m4<span class=\"hljs-number\">-2<\/span>\n    HostName <span class=\"hljs-number\">172.16<\/span><span class=\"hljs-number\">.11<\/span><span class=\"hljs-number\">.222<\/span>\n    User ci\n    IdentityFile ~<span class=\"hljs-regexp\">\/.ssh\/i<\/span>d_ed25519\n    IdentitiesOnly yes\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Secure the file:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">chmod <span class=\"hljs-number\">600<\/span> ~<span class=\"hljs-regexp\">\/.ssh\/<\/span>config\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">You can now connect using:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">ssh dm-tokyo-m4-1\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">And:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">ssh dm-tokyo-m4-2\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This makes the tmux script easier to read and maintain.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">8. Create the tmux Configuration<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Create the tmux configuration file:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">vi ~\/.tmux.conf\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Add the following configuration:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># Enable mouse support<\/span>\nset -g mouse on\n\n<span class=\"hljs-comment\"># Show pane titles at the top<\/span>\nset -g pane-border-status top\n\n<span class=\"hljs-comment\"># Display the custom pane title<\/span>\nset -g pane-border-format <span class=\"hljs-string\">\" #{pane_title} \"<\/span>\n\n<span class=\"hljs-comment\"># Increase scrollback history<\/span>\nset -g history-limit <span class=\"hljs-number\">50000<\/span>\n\n<span class=\"hljs-comment\"># Start pane and window numbering at 1<\/span>\nset -g base-index <span class=\"hljs-number\">1<\/span>\nsetw -g pane-base-index <span class=\"hljs-number\">1<\/span>\n\n<span class=\"hljs-comment\"># Reduce escape-key delay<\/span>\nset -sg escape-time <span class=\"hljs-number\">10<\/span>\n\n<span class=\"hljs-comment\"># Keep windows numbered sequentially<\/span>\nset -g renumber-windows on\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Reload the configuration:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">tmux source-file ~\/.tmux.conf\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">If you are not currently inside tmux, the configuration will be loaded automatically the next time tmux starts.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">9. What the tmux Configuration Does<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Mouse support<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">set<\/span> -g mouse on\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Allows you to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Click a pane to select it<\/li>\n\n\n\n<li>Resize panes by dragging borders<\/li>\n\n\n\n<li>Scroll inside panes using the mouse wheel<\/li>\n\n\n\n<li>Select windows using the status bar<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Pane titles<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">set -g pane-border-status top\nset -g pane-border-format <span class=\"hljs-string\">\" #{pane_title} \"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Displays names such as:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">MacBook Local\ndm-tokyo-m4-1\ndm-tokyo-m4-2\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Scrollback history<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-18\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">set<\/span> -g history-limit 50000\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-18\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Keeps more terminal output available for scrolling and troubleshooting.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Pane numbering<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-19\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">set<\/span> -g base-index 1\nsetw -g pane-base-index 1\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-19\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Starts window and pane numbers from <code>1<\/code> instead of <code>0<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Faster keyboard response<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-20\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">set<\/span> -sg escape-time 10\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-20\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Reduces keyboard delay, which is especially useful when using Vim inside tmux.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">10. Create the Three-Pane Workspace Script<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Create the script:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">vi ~\/tmux-mac-ssh.sh\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Paste:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-21\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">#!\/bin\/bash<\/span>\n\nset -u\n\nSESSION=<span class=\"hljs-string\">\"mac-ssh\"<\/span>\n\nopen_session() {\n    <span class=\"hljs-keyword\">if<\/span> &#91; -n <span class=\"hljs-string\">\"${TMUX:-}\"<\/span> ]; then\n        tmux <span class=\"hljs-keyword\">switch<\/span>-client -t <span class=\"hljs-string\">\"$SESSION\"<\/span>\n    <span class=\"hljs-keyword\">else<\/span>\n        tmux attach-session -t <span class=\"hljs-string\">\"$SESSION\"<\/span>\n    fi\n}\n\n<span class=\"hljs-comment\"># Reuse the existing session if it already exists<\/span>\n<span class=\"hljs-keyword\">if<\/span> tmux has-session -t <span class=\"hljs-string\">\"$SESSION\"<\/span> <span class=\"hljs-number\">2<\/span>&gt;\/dev\/<span class=\"hljs-keyword\">null<\/span>; then\n    open_session\n    <span class=\"hljs-keyword\">exit<\/span> <span class=\"hljs-number\">0<\/span>\nfi\n\n<span class=\"hljs-comment\"># Create the session with one local Mac pane<\/span>\ntmux <span class=\"hljs-keyword\">new<\/span>-session -d -s <span class=\"hljs-string\">\"$SESSION\"<\/span> -c <span class=\"hljs-string\">\"$HOME\"<\/span>\ntmux select-pane -t <span class=\"hljs-string\">\"$SESSION\"<\/span>:<span class=\"hljs-number\">1.1<\/span> -T <span class=\"hljs-string\">\"MacBook Local\"<\/span>\n\n<span class=\"hljs-comment\"># Create the top-right SSH pane<\/span>\ntmux split-window -h -p <span class=\"hljs-number\">50<\/span> -t <span class=\"hljs-string\">\"$SESSION\"<\/span>:<span class=\"hljs-number\">1.1<\/span> \\\n    <span class=\"hljs-string\">\"ssh dm-tokyo-m4-1\"<\/span>\ntmux select-pane -t <span class=\"hljs-string\">\"$SESSION\"<\/span>:<span class=\"hljs-number\">1.2<\/span> -T <span class=\"hljs-string\">\"dm-tokyo-m4-1\"<\/span>\n\n<span class=\"hljs-comment\"># Split the right side into top and bottom panes<\/span>\ntmux split-window -v -p <span class=\"hljs-number\">50<\/span> -t <span class=\"hljs-string\">\"$SESSION\"<\/span>:<span class=\"hljs-number\">1.2<\/span> \\\n    <span class=\"hljs-string\">\"ssh dm-tokyo-m4-2\"<\/span>\ntmux select-pane -t <span class=\"hljs-string\">\"$SESSION\"<\/span>:<span class=\"hljs-number\">1.3<\/span> -T <span class=\"hljs-string\">\"dm-tokyo-m4-2\"<\/span>\n\n<span class=\"hljs-comment\"># Return focus to the local Mac pane<\/span>\ntmux select-pane -t <span class=\"hljs-string\">\"$SESSION\"<\/span>:<span class=\"hljs-number\">1.1<\/span>\n\nopen_session\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-21\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Make the script executable:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">chmod +x ~\/tmux-mac-ssh.sh\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">11. Script Version Without SSH Aliases<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">If you do not want to configure <code>~\/.ssh\/config<\/code>, use the server IP addresses directly:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-22\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-meta\">#!\/bin\/bash<\/span>\n\n<span class=\"hljs-keyword\">set<\/span> -u\n\nSESSION=\"mac-ssh\"\n\nopen_session() {\n    <span class=\"hljs-keyword\">if<\/span> &#91; -n <span class=\"hljs-string\">\"${TMUX:-}\"<\/span> ]; then\n        tmux <span class=\"hljs-keyword\">switch<\/span>-client -t <span class=\"hljs-string\">\"$SESSION\"<\/span>\n    <span class=\"hljs-keyword\">else<\/span>\n        tmux attach-session -t <span class=\"hljs-string\">\"$SESSION\"<\/span>\n    fi\n}\n\n<span class=\"hljs-keyword\">if<\/span> tmux has-session -t <span class=\"hljs-string\">\"$SESSION\"<\/span> <span class=\"hljs-number\">2<\/span>&gt;<span class=\"hljs-regexp\">\/dev\/<\/span><span class=\"hljs-literal\">null<\/span>; then\n    open_session\n    exit <span class=\"hljs-number\">0<\/span>\nfi\n\ntmux <span class=\"hljs-keyword\">new<\/span>-session -d -s <span class=\"hljs-string\">\"$SESSION\"<\/span> -c <span class=\"hljs-string\">\"$HOME\"<\/span>\ntmux select-pane -t <span class=\"hljs-string\">\"$SESSION\"<\/span>:<span class=\"hljs-number\">1.1<\/span> -T <span class=\"hljs-string\">\"MacBook Local\"<\/span>\n\ntmux split-<span class=\"hljs-built_in\">window<\/span> -h -p <span class=\"hljs-number\">50<\/span> -t <span class=\"hljs-string\">\"$SESSION\"<\/span>:<span class=\"hljs-number\">1.1<\/span> \\\n    <span class=\"hljs-string\">\"ssh ci@172.16.11.91\"<\/span>\ntmux select-pane -t <span class=\"hljs-string\">\"$SESSION\"<\/span>:<span class=\"hljs-number\">1.2<\/span> -T <span class=\"hljs-string\">\"dm-tokyo-m4-1\"<\/span>\n\ntmux split-<span class=\"hljs-built_in\">window<\/span> -v -p <span class=\"hljs-number\">50<\/span> -t <span class=\"hljs-string\">\"$SESSION\"<\/span>:<span class=\"hljs-number\">1.2<\/span> \\\n    <span class=\"hljs-string\">\"ssh ci@172.16.11.222\"<\/span>\ntmux select-pane -t <span class=\"hljs-string\">\"$SESSION\"<\/span>:<span class=\"hljs-number\">1.3<\/span> -T <span class=\"hljs-string\">\"dm-tokyo-m4-2\"<\/span>\n\ntmux select-pane -t <span class=\"hljs-string\">\"$SESSION\"<\/span>:<span class=\"hljs-number\">1.1<\/span>\n\nopen_session\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-22\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">12. Why the Script Checks the TMUX Variable<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">When you run a tmux command from inside an existing tmux session, attempting to attach another session directly can produce this warning:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-23\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">sessions should be nested with care, <span class=\"hljs-keyword\">unset<\/span> $TMUX to force\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-23\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The script avoids nested tmux sessions by checking:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-24\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">if<\/span> <span class=\"hljs-selector-attr\">&#91; -n <span class=\"hljs-string\">\"${TMUX:-}\"<\/span> ]<\/span>; <span class=\"hljs-selector-tag\">then<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-24\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">When already inside tmux, it uses:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-25\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">tmux <span class=\"hljs-keyword\">switch<\/span>-client -t <span class=\"hljs-string\">\"$SESSION\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-25\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">When running from a normal Terminal window, it uses:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-26\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">tmux attach-session -t <span class=\"hljs-string\">\"$SESSION\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-26\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This allows the same command to work both inside and outside tmux.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">13. Create a Short Terminal Command<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of typing the full script path, create an alias named <code>m4<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Add it to your zsh configuration:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-27\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">'alias m4=\"$HOME\/tmux-mac-ssh.sh\"'<\/span> &gt;&gt; ~\/.zshrc\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-27\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Reload the shell configuration:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">source ~\/.zshrc\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Launch the workspace:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">m4\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">14. Alternative: Create a System Command<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of a shell alias, create a symbolic link:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-28\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">sudo mkdir -p \/usr\/local\/bin\nsudo ln -sf <span class=\"hljs-string\">\"$HOME\/tmux-mac-ssh.sh\"<\/span> \/usr\/local\/bin\/m4\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-28\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Confirm that <code>\/usr\/local\/bin<\/code> is in your path:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-29\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"$PATH\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-29\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Then run:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">m4\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The symbolic-link method works from any shell and does not depend on <code>.zshrc<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">15. Switching Between Panes<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Because mouse mode is enabled, click any pane to select it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can also use keyboard shortcuts.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">tmux uses a prefix key. By default, the prefix is:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Ctrl+b\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Press <code>Ctrl+b<\/code>, release both keys, and then press the next key.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Move to the next pane<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Ctrl+b, then o\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Move using arrow keys<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Ctrl+b, then Left Arrow\nCtrl+b, then Right Arrow\nCtrl+b, then Up Arrow\nCtrl+b, then Down Arrow\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Display pane numbers<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Ctrl+b, then q\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">After the numbers appear, press the pane number.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Maximize the current pane<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Ctrl+b, then z\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Press the same shortcut again to restore the full layout.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">16. Scrolling Inside a Pane<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">With mouse support enabled, use the mouse wheel or trackpad to scroll.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can also enter tmux copy mode:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Ctrl+b, then &#91;\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Use arrow keys, Page Up, or Page Down to navigate.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Press:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">q\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">to exit copy mode.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">17. Resize the Panes<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">With mouse support enabled, drag the pane border.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Keyboard alternatives:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Ctrl+b, then hold Option and press an arrow key\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Depending on the Terminal configuration, you can also use tmux commands:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">tmux resize-pane -L 5\ntmux resize-pane -R 5\ntmux resize-pane -U 3\ntmux resize-pane -D 3\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">18. Detach Without Closing SSH Sessions<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">To leave the tmux session running:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Ctrl+b, then d\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This detaches you from tmux but does not terminate:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The local shell<\/li>\n\n\n\n<li>SSH sessions<\/li>\n\n\n\n<li>Commands running on remote servers<\/li>\n\n\n\n<li>Logs or monitoring processes<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Reconnect using:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">m4\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Or:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">tmux attach-session -t mac-ssh\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">19. List tmux Sessions<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">tmux ls\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-30\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">mac-ssh<\/span>: 1 <span class=\"hljs-selector-tag\">windows<\/span> (<span class=\"hljs-selector-tag\">created<\/span> <span class=\"hljs-selector-tag\">Tue<\/span> <span class=\"hljs-selector-tag\">Jul<\/span> 14 15<span class=\"hljs-selector-pseudo\">:20<\/span><span class=\"hljs-selector-pseudo\">:00<\/span> 2026)\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-30\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">20. Close a Pane<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Select the pane and type:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-31\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">exit<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-31\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Or use:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Ctrl+b, then x\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">tmux will ask for confirmation before closing the pane.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">21. Restart the Entire Workspace<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">To destroy the current workspace:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">tmux kill-session -t mac-ssh\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Start a clean workspace:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">m4\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">You can combine both:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-32\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">tmux kill-session -t mac-ssh <span class=\"hljs-number\">2<\/span>&gt;<span class=\"hljs-regexp\">\/dev\/<\/span><span class=\"hljs-literal\">null<\/span>\nm4\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-32\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">22. Troubleshooting<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Error: Could not resolve hostname<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-33\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">ssh<\/span>: <span class=\"hljs-selector-tag\">Could<\/span> <span class=\"hljs-selector-tag\">not<\/span> <span class=\"hljs-selector-tag\">resolve<\/span> <span class=\"hljs-selector-tag\">hostname<\/span> <span class=\"hljs-selector-tag\">ci172<\/span><span class=\"hljs-selector-class\">.16<\/span><span class=\"hljs-selector-class\">.11<\/span><span class=\"hljs-selector-class\">.91<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-33\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Cause:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-34\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">ssh<\/span> <span class=\"hljs-selector-tag\">ci172<\/span><span class=\"hljs-selector-class\">.16<\/span><span class=\"hljs-selector-class\">.11<\/span><span class=\"hljs-selector-class\">.91<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-34\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Correct command:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-35\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">ssh<\/span> <span class=\"hljs-selector-tag\">ci<\/span><span class=\"hljs-keyword\">@172<\/span>.16.11.91\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-35\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Error: Sessions should be nested with care<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-36\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">sessions should be nested with care, <span class=\"hljs-keyword\">unset<\/span> $TMUX to force\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-36\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This happens when trying to attach a tmux session from inside another tmux session.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-37\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">tmux <span class=\"hljs-keyword\">switch<\/span>-client -t mac-ssh\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-37\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The script in this tutorial handles this automatically.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Mouse works temporarily but stops after restart<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Running this command only changes the current tmux server:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-38\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">tmux <span class=\"hljs-keyword\">set<\/span>-option -g mouse on\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-38\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">To make it permanent, add this to <code>~\/.tmux.conf<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-39\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">set<\/span> -g mouse on\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-39\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Then reload:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">tmux source-file ~\/.tmux.conf\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Pane labels are not visible<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Confirm that <code>~\/.tmux.conf<\/code> contains:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-40\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">set -g pane-border-status top\nset -g pane-border-format <span class=\"hljs-string\">\" #{pane_title} \"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-40\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Reload it:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">tmux source-file ~\/.tmux.conf\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Restart the workspace:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">tmux kill-session -t mac-ssh\nm4\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">SSH still asks for a password<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Run verbose SSH diagnostics:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-41\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">ssh<\/span> <span class=\"hljs-selector-tag\">-v<\/span> <span class=\"hljs-selector-tag\">ci<\/span><span class=\"hljs-keyword\">@172<\/span>.16.11.91\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-41\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check the local key:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-42\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">ls -la ~<span class=\"hljs-regexp\">\/.ssh\/i<\/span>d_ed25519*\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-42\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check remote permissions:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-43\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">ssh<\/span> <span class=\"hljs-selector-tag\">ci<\/span><span class=\"hljs-keyword\">@172<\/span>.16.11.91\nchmod <span class=\"hljs-number\">700<\/span> ~\/.ssh\nchmod <span class=\"hljs-number\">600<\/span> ~\/.ssh\/authorized_keys\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-43\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Also verify that the public key exists in:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-44\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">~<span class=\"hljs-regexp\">\/.ssh\/<\/span>authorized_keys\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-44\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">SSH connection closes and the pane disappears<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">By default, when the SSH command exits, the tmux pane also closes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To keep the pane open after SSH exits, replace:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-45\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\"><span class=\"hljs-string\">\"ssh dm-tokyo-m4-1\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-45\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">with:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-46\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\"><span class=\"hljs-string\">\"ssh dm-tokyo-m4-1; exec zsh\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-46\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">And replace:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-47\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\"><span class=\"hljs-string\">\"ssh dm-tokyo-m4-2\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-47\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">with:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-48\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\"><span class=\"hljs-string\">\"ssh dm-tokyo-m4-2; exec zsh\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-48\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This opens a local shell in the pane after the SSH connection ends.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">23. Recommended Final Files<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><code>~\/.ssh\/config<\/code><\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-49\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Host dm-tokyo-m4<span class=\"hljs-number\">-1<\/span>\n    HostName <span class=\"hljs-number\">172.16<\/span><span class=\"hljs-number\">.11<\/span><span class=\"hljs-number\">.91<\/span>\n    User ci\n    IdentityFile ~<span class=\"hljs-regexp\">\/.ssh\/i<\/span>d_ed25519\n    IdentitiesOnly yes\n\nHost dm-tokyo-m4<span class=\"hljs-number\">-2<\/span>\n    HostName <span class=\"hljs-number\">172.16<\/span><span class=\"hljs-number\">.11<\/span><span class=\"hljs-number\">.222<\/span>\n    User ci\n    IdentityFile ~<span class=\"hljs-regexp\">\/.ssh\/i<\/span>d_ed25519\n    IdentitiesOnly yes\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-49\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\"><code>~\/.tmux.conf<\/code><\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-50\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">set -g mouse on\nset -g pane-border-status top\nset -g pane-border-format <span class=\"hljs-string\">\" #{pane_title} \"<\/span>\nset -g history-limit <span class=\"hljs-number\">50000<\/span>\nset -g base-index <span class=\"hljs-number\">1<\/span>\nsetw -g pane-base-index <span class=\"hljs-number\">1<\/span>\nset -sg escape-time <span class=\"hljs-number\">10<\/span>\nset -g renumber-windows on\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-50\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\"><code>~\/tmux-mac-ssh.sh<\/code><\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-51\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-meta\">#!\/bin\/bash<\/span>\n\n<span class=\"hljs-keyword\">set<\/span> -u\n\nSESSION=\"mac-ssh\"\n\nopen_session() {\n    <span class=\"hljs-keyword\">if<\/span> &#91; -n <span class=\"hljs-string\">\"${TMUX:-}\"<\/span> ]; then\n        tmux <span class=\"hljs-keyword\">switch<\/span>-client -t <span class=\"hljs-string\">\"$SESSION\"<\/span>\n    <span class=\"hljs-keyword\">else<\/span>\n        tmux attach-session -t <span class=\"hljs-string\">\"$SESSION\"<\/span>\n    fi\n}\n\n<span class=\"hljs-keyword\">if<\/span> tmux has-session -t <span class=\"hljs-string\">\"$SESSION\"<\/span> <span class=\"hljs-number\">2<\/span>&gt;<span class=\"hljs-regexp\">\/dev\/<\/span><span class=\"hljs-literal\">null<\/span>; then\n    open_session\n    exit <span class=\"hljs-number\">0<\/span>\nfi\n\ntmux <span class=\"hljs-keyword\">new<\/span>-session -d -s <span class=\"hljs-string\">\"$SESSION\"<\/span> -c <span class=\"hljs-string\">\"$HOME\"<\/span>\ntmux select-pane -t <span class=\"hljs-string\">\"$SESSION\"<\/span>:<span class=\"hljs-number\">1.1<\/span> -T <span class=\"hljs-string\">\"MacBook Local\"<\/span>\n\ntmux split-<span class=\"hljs-built_in\">window<\/span> -h -p <span class=\"hljs-number\">50<\/span> -t <span class=\"hljs-string\">\"$SESSION\"<\/span>:<span class=\"hljs-number\">1.1<\/span> \\\n    <span class=\"hljs-string\">\"ssh dm-tokyo-m4-1\"<\/span>\ntmux select-pane -t <span class=\"hljs-string\">\"$SESSION\"<\/span>:<span class=\"hljs-number\">1.2<\/span> -T <span class=\"hljs-string\">\"dm-tokyo-m4-1\"<\/span>\n\ntmux split-<span class=\"hljs-built_in\">window<\/span> -v -p <span class=\"hljs-number\">50<\/span> -t <span class=\"hljs-string\">\"$SESSION\"<\/span>:<span class=\"hljs-number\">1.2<\/span> \\\n    <span class=\"hljs-string\">\"ssh dm-tokyo-m4-2\"<\/span>\ntmux select-pane -t <span class=\"hljs-string\">\"$SESSION\"<\/span>:<span class=\"hljs-number\">1.3<\/span> -T <span class=\"hljs-string\">\"dm-tokyo-m4-2\"<\/span>\n\ntmux select-pane -t <span class=\"hljs-string\">\"$SESSION\"<\/span>:<span class=\"hljs-number\">1.1<\/span>\n\nopen_session\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-51\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\"><code>~\/.zshrc<\/code><\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-52\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">alias m4=<span class=\"hljs-string\">\"$HOME\/tmux-mac-ssh.sh\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-52\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">24. Complete Setup Verification<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">chmod 700 ~\/.ssh\nchmod 600 ~\/.ssh\/config\nchmod 600 ~\/.ssh\/id_ed25519\nchmod 644 ~\/.ssh\/id_ed25519.pub\nchmod +x ~\/tmux-mac-ssh.sh\nsource ~\/.zshrc\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Test the SSH aliases:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">ssh dm-tokyo-m4-1\nssh dm-tokyo-m4-2\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Launch the tmux workspace:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">m4\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">You should now have:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A local Mac terminal on the left<\/li>\n\n\n\n<li><code>dm-tokyo-m4-1<\/code> on the top right<\/li>\n\n\n\n<li><code>dm-tokyo-m4-2<\/code> on the bottom right<\/li>\n\n\n\n<li>Visible pane labels<\/li>\n\n\n\n<li>Mouse-based navigation<\/li>\n\n\n\n<li>Persistent SSH sessions<\/li>\n\n\n\n<li>A reusable one-command launch process<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A small tmux setup can significantly improve daily server-management work.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of opening several separate Terminal windows, you now have one organized workspace containing:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Your local Mac shell<\/li>\n\n\n\n<li>Two remote SSH connections<\/li>\n\n\n\n<li>Friendly server labels<\/li>\n\n\n\n<li>Mouse and keyboard navigation<\/li>\n\n\n\n<li>Persistent sessions<\/li>\n\n\n\n<li>A simple <code>m4<\/code> launcher command<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">This approach is easy to extend. Additional servers, monitoring panes, log viewers, Kubernetes commands, deployment consoles, or CI-runner sessions can be added later without changing the core workflow.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Managing multiple remote servers from separate Terminal windows quickly becomes messy. A cleaner approach is to use tmux, which lets you divide one Terminal window into multiple&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[11138],"tags":[],"class_list":["post-77773","post","type-post","status-publish","format-standard","hentry","category-best-tools"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/77773","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=77773"}],"version-history":[{"count":1,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/77773\/revisions"}],"predecessor-version":[{"id":77774,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/77773\/revisions\/77774"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=77773"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=77773"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=77773"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}