<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: JiMeJi Jin</title>
    <description>The latest articles on DEV Community by JiMeJi Jin (@jimeji).</description>
    <link>https://dev.to/jimeji</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4115946%2F7b0d4cb5-9da8-46c0-b26e-e0d79e9353f2.jpg</url>
      <title>DEV Community: JiMeJi Jin</title>
      <link>https://dev.to/jimeji</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jimeji"/>
    <language>en</language>
    <item>
      <title>JTerm: iPhone, iPad, and Mac sync, clipboard tools, hosts mappings, and device IPs</title>
      <dc:creator>JiMeJi Jin</dc:creator>
      <pubDate>Tue, 08 Sep 2026 15:02:55 +0000</pubDate>
      <link>https://dev.to/jimeji/jterm-iphone-ipad-and-mac-sync-clipboard-tools-hosts-mappings-and-device-ips-31p1</link>
      <guid>https://dev.to/jimeji/jterm-iphone-ipad-and-mac-sync-clipboard-tools-hosts-mappings-and-device-ips-31p1</guid>
      <description>&lt;p&gt;Hi everyone, I’m the developer of JTerm.&lt;/p&gt;

&lt;p&gt;If you manage servers on a Mac, use your iPhone to handle an issue while you’re out, or work from an iPad with a keyboard, these problems probably sound familiar: configuring the same server on three devices, keeping useful commands scattered across notes, repeatedly editing hosts entries for test environments, and checking your Mac’s current IP address before connecting to it.&lt;/p&gt;

&lt;p&gt;JTerm brings these tasks into one workflow: syncing across iPhone, iPad, and Mac, an enhanced clipboard, hosts mapping management, and device IP information in &lt;strong&gt;My Machines&lt;/strong&gt;. Here’s how those four features work together.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This is the English version of &lt;a href="https://blog.csdn.net/j0341326/article/details/163315331" rel="noopener noreferrer"&gt;my original CSDN article&lt;/a&gt;, translated with AI assistance. The screenshots and illustrations are from that article; some contain Chinese text. The original CSDN offer code is included at the end.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj6oa326bjuak8mlw86xn.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj6oa326bjuak8mlw86xn.jpeg" alt="JTerm’s native Mac SSH terminal workspace" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Remote SSH sessions, host groups, and a workspace for multiple sessions on Mac.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  1. Sync across iPhone, iPad, and Mac: configure once, reuse across devices
&lt;/h2&gt;

&lt;p&gt;The most useful part of syncing is avoiding the same setup work on every device. With the same iCloud account, you can add servers, organize groups, and associate SSH keys on your Mac. Once the configuration syncs, select the same host on your iPhone or iPad to connect.&lt;/p&gt;
&lt;h3&gt;
  
  
  iPhone: handle a quick task wherever you are
&lt;/h3&gt;

&lt;p&gt;iPhone is useful for short, focused tasks: checking a service’s status, reading a few lines of logs, or confirming that a job has finished. The terminal provides frequently used keys such as Esc, Ctrl, Alt, Tab, arrows, and the pipe character, reducing the need to hunt through the phone keyboard for symbols. Synced host and key settings save you from re-entering server details during an urgent check.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Futuresizxxpu5p0sk8rz.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Futuresizxxpu5p0sk8rz.jpeg" alt="JTerm’s synced host list on iPhone" width="800" height="1738"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Use synced hosts, groups, and authentication settings directly on iPhone.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  iPad: work for longer with a keyboard
&lt;/h3&gt;

&lt;p&gt;iPad gives you more space for reading and typing. Its sidebar, portrait and landscape layouts, and hardware keyboard support suit longer logs, switching hosts, and browsing remote files. When traveling with an iPad, you can reuse the host groups and saved text organized on your Mac instead of maintaining another configuration.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj78qmksqbmovlwunnw2q.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj78qmksqbmovlwunnw2q.jpeg" alt="JTerm’s iPad host sidebar and terminal workspace" width="800" height="600"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;An iPad workspace combining the host sidebar and terminal with synced connection details.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Mac: organize configurations and everyday work
&lt;/h3&gt;

&lt;p&gt;Mac is suited to ongoing work: managing several SSH sessions, organizing hosts and keys, finding and favoriting commands, and editing and applying hosts mappings. Information organized here can sync to your phone and tablet, while configuration changes made on those devices can sync back.&lt;/p&gt;
&lt;h3&gt;
  
  
  What syncs?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SSH host settings:&lt;/strong&gt; addresses, ports, usernames, groups, ordering, and jump-host relationships.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Key configuration:&lt;/strong&gt; the key list and host-to-key associations. Passwords, private keys, and key passphrases are protected by Apple Keychain; credential sync across devices depends on iCloud Keychain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reusable content:&lt;/strong&gt; saved commands and clipboard text favorites, aliases, and categories.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hosts mappings:&lt;/strong&gt; mapping configurations, reusable variables, and selected variable values.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;My Machines:&lt;/strong&gt; device names, platforms, and reported IP addresses for active network interfaces.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Display settings are saved separately for iPhone, iPad, and Mac, and sync between devices of the same type. Your phone can keep a font size suited to its smaller screen while your Mac keeps its own display preferences.&lt;/p&gt;

&lt;p&gt;Sign in to the same iCloud account on your devices and keep iCloud available. Enable iCloud Keychain if you want credentials to sync. Sync timing depends on the network, iCloud, and whether the devices and apps are running. &lt;strong&gt;Configuration and saved information sync; an active SSH connection or terminal screen does not automatically move to another device.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  2. Enhanced clipboard: turn copied content into reusable material
&lt;/h2&gt;

&lt;p&gt;When writing commands, reading logs, or copying paths, it’s easy to lose something you just copied when the next copy replaces it. JTerm provides local clipboard history on Mac, with favorites for text you want to keep using.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;History and search:&lt;/strong&gt; record text and images, search by content or alias, and move repeated copies back toward the top.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pinned history:&lt;/strong&gt; keep frequently needed items at the top during your current task.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Favorites, aliases, and categories:&lt;/strong&gt; give a complex command a memorable name and organize it under categories such as “Log troubleshooting,” “Docker,” or “Common paths.”&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frequently used items first:&lt;/strong&gt; sort text favorites by recent usage frequency to make common items easier to find.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keyboard navigation:&lt;/strong&gt; search, use the arrow keys, and press Return to select. Text favorites can also be sent as commands to the current terminal session.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, save this command as “Container status” in a “Docker” category:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker ps &lt;span class="nt"&gt;--format&lt;/span&gt; &lt;span class="s1"&gt;'{{.Names}}: {{.Status}}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can then search for “Container status” without remembering all the arguments. Once text favorites sync through iCloud, they are available on iPhone and iPad too.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flpwk8vcgw5oglbmyy751.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flpwk8vcgw5oglbmyy751.jpeg" alt="JTerm’s enhanced clipboard manager on Mac" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Search history, organize favorites, and reuse commands and frequently needed text.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Open the clipboard from other Mac apps
&lt;/h3&gt;

&lt;p&gt;With the optional &lt;strong&gt;JTerm Shortcut&lt;/strong&gt; companion installed and running, press &lt;strong&gt;Command–Shift–V (⌘⇧V)&lt;/strong&gt; to open a floating clipboard panel from another application. You can look up and select saved content while writing documents, editing code, or working in other text fields.&lt;/p&gt;

&lt;p&gt;Ordinary clipboard history stays on the local Mac, as do image favorites. Text favorites you explicitly save, along with their categories, sync through your personal iCloud account. System clipboard history collection is a Mac feature; on iPhone and iPad, the focus is reusing synced text favorites.&lt;/p&gt;
&lt;h2&gt;
  
  
  3. Hosts mappings: organize environments and switch IPs with variables
&lt;/h2&gt;

&lt;p&gt;A project with development and test environments may need the same domain name to point to different IP addresses. JTerm organizes these rules into named mapping configurations. You can enable, disable, edit, or duplicate a whole configuration while preserving comments and formatting in the original hosts text.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Group by purpose:&lt;/strong&gt; keep separate mapping configurations for local integration work, test environments, and other scenarios.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reuse variables:&lt;/strong&gt; define an IP variable and reference it in several mappings with &lt;code&gt;${KEY}&lt;/code&gt;. Updating one value updates the rules that use it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Switch between values:&lt;/strong&gt; store multiple candidate values for a variable and select the one to use on the mappings page.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Preview before applying:&lt;/strong&gt; inspect the final content and check for duplicate hostnames across enabled configurations. When mappings conflict, earlier entries take precedence.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, define &lt;code&gt;DEV_IP&lt;/code&gt; with candidate values &lt;code&gt;192.0.2.10&lt;/code&gt; and &lt;code&gt;192.0.2.20&lt;/code&gt;, then write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;${DEV_IP} api.example.test
${DEV_IP} admin.example.test
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These are documentation examples. Replace them with addresses for your own environment. Selecting another &lt;code&gt;DEV_IP&lt;/code&gt; value updates both domain mappings together, without editing each line.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnd5ftp7adkdvo9fk3j6c.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnd5ftp7adkdvo9fk3j6c.jpeg" alt="JTerm’s synced hosts mapping configurations" width="800" height="1738"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Mapping configurations and variables sync across devices; applying them to the system hosts file happens on Mac.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You can edit configurations on a phone or tablet, then apply them on a Mac. iCloud syncs the configuration, and &lt;strong&gt;JTerm Shortcut&lt;/strong&gt; performs the write to the Mac’s &lt;code&gt;/etc/hosts&lt;/code&gt;. The first application requires administrator authorization. JTerm manages only its own marked block and preserves other existing content in the file.&lt;/p&gt;

&lt;p&gt;After the configuration syncs, review the preview and apply it on the Mac where it should take effect. Syncing a configuration does not modify the system hosts file on iPhone or iPad, and it does not mean another Mac has automatically applied it.&lt;/p&gt;
&lt;h2&gt;
  
  
  4. My Machines: view IP addresses across your devices
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Folixxal8kdkjwi0ft261.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Folixxal8kdkjwi0ft261.png" alt="Concept illustration of JTerm’s My Machines IP management feature" width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;AI-generated concept illustration, not an actual app screenshot. All addresses shown are examples.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;“What’s that Mac’s IP address now?” is a small but frequent question when working across devices. Switching Wi-Fi, connecting Ethernet, or enabling a VPN can leave a machine with several addresses. A single IP written down earlier can quickly become outdated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My Machines&lt;/strong&gt; brings together network information reported by JTerm devices using the same iCloud account:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Device name and platform:&lt;/strong&gt; distinguish iPhone, iPad, and Mac, with the current device marked.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Addresses by interface:&lt;/strong&gt; see interface names and separate IPv4 and IPv6 addresses. Expand a device to inspect multiple interfaces.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Copy an IP:&lt;/strong&gt; select the address you need for a connection, debugging, or a note.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sync changes:&lt;/strong&gt; while the app is running, it checks active local network interfaces every minute and syncs changes to names or addresses through personal iCloud. Manual refresh is also available.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Update time and sync status:&lt;/strong&gt; check how recent a record is and whether sync is working.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, after your Mac joins a new Wi-Fi network, JTerm detects and syncs the changed address. You can then open My Machines on your iPad, inspect the interface addresses reported by that Mac, and copy the appropriate IP for a connection without returning to the Mac’s network settings.&lt;/p&gt;

&lt;p&gt;These are interface addresses reported by your own devices running JTerm. The feature is not a LAN scanner, does not make a device publicly reachable, and does not enable SSH services. A connection still requires network reachability and a running service on the destination. If a device is asleep or the app is not running, you may see its last synced information. &lt;strong&gt;The update time reflects a change to the information, not a live online heartbeat.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  5. Put the four features together
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Organize on Mac:&lt;/strong&gt; add SSH hosts, associate keys, arrange groups, and categorize frequently used commands as favorites.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Continue on iPad:&lt;/strong&gt; once iCloud sync finishes, use the same host details and text favorites with your keyboard.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Handle quick tasks on iPhone:&lt;/strong&gt; check a service, copy saved text, or look up a device address in My Machines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Switch environments when needed:&lt;/strong&gt; change a mapping variable or enabled configuration, wait for it to sync to the target Mac, then preview and apply it there.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The host list answers “Which server should I connect to?” Text favorites answer “Where’s that command?” Hosts mappings answer “Which environment should this domain point to?” My Machines answers “Which IP addresses do my devices currently report?” Sharing that information across devices reduces the setup needed whenever you switch.&lt;/p&gt;
&lt;h2&gt;
  
  
  SSH and remote management
&lt;/h2&gt;

&lt;p&gt;Alongside these four features, JTerm supports xterm terminal rendering, password and SSH private-key authentication, multiple sessions, automatic reconnection, SFTP remote file browsing and transfers, multiple jump hosts, and an AI assistant for understanding terminal output and generating commands.&lt;/p&gt;
&lt;h2&gt;
  
  
  Download and the original CSDN offer
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apps.apple.com/app/id6780185815" rel="noopener noreferrer"&gt;Download JTerm for iPhone, iPad, and Mac on the App Store&lt;/a&gt;. You can also find more information and the optional Mac companion on the &lt;a href="https://jterm.jimeji.com/" rel="noopener noreferrer"&gt;JTerm website&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The original CSDN article includes this offer code for &lt;strong&gt;one year of Pro free&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CSDN0USERS01YEARFREE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To redeem, &lt;a href="https://apps.apple.com/redeem?ctx=offercodes&amp;amp;id=6780185815&amp;amp;code=CSDN0USERS01YEARFREE" rel="noopener noreferrer"&gt;open the App Store offer redemption page&lt;/a&gt;, or use “Redeem Offer Code” in the App Store and enter the code. Eligibility, availability, and the redemption result are determined by the App Store.&lt;/p&gt;

&lt;p&gt;I’d love to hear how you move between a phone, tablet, and Mac in your daily work. Feel free to share what you need in the comments. I’ll keep improving JTerm’s terminal interaction, configuration sync, reusable content, and device management.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>productivity</category>
      <category>ios</category>
      <category>devops</category>
    </item>
    <item>
      <title>SSH through multiple jump hosts: a practical guide for Mac, iPhone, and iPad</title>
      <dc:creator>JiMeJi Jin</dc:creator>
      <pubDate>Tue, 08 Sep 2026 14:40:31 +0000</pubDate>
      <link>https://dev.to/jimeji/ssh-through-multiple-jump-hosts-a-practical-guide-for-mac-iphone-and-ipad-320c</link>
      <guid>https://dev.to/jimeji/ssh-through-multiple-jump-hosts-a-practical-guide-for-mac-iphone-and-ipad-320c</guid>
      <description>&lt;p&gt;A private server may be reachable only through a bastion host. Add a second network boundary, and the route becomes easy to mix up: which username belongs to which machine, where does each key live, and which hop is failing?&lt;/p&gt;

&lt;p&gt;This guide starts with an OpenSSH example on a Mac, then describes how the same connection layout maps to a mobile SSH client. All addresses, usernames, and key paths below are illustrative; replace them with your own authorized hosts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; I develop JTerm, an SSH client for iPhone, iPad, and Mac. The OpenSSH examples work independently of JTerm.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Write down the route
&lt;/h2&gt;

&lt;p&gt;Suppose the connection path is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your device -&amp;gt; public bastion -&amp;gt; internal bastion -&amp;gt; app server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your device must reach the first bastion. Each bastion must be able to reach the next machine on its SSH port. Authentication is separate at every hop.&lt;/p&gt;

&lt;p&gt;For a quick connection with your existing authentication setup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh &lt;span class="nt"&gt;-J&lt;/span&gt; alice@bastion.example.com,bob@10.0.1.10 deploy@10.0.2.20
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The comma-separated jump hosts are visited in order. The final argument is the destination; it is not another entry in the jump list. OpenSSH documents this behavior under &lt;a href="https://man.openbsd.org/ssh#J" rel="noopener noreferrer"&gt;ssh -J&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Give each machine its own configuration
&lt;/h2&gt;

&lt;p&gt;For repeated use, add host entries to your local &lt;code&gt;~/.ssh/config&lt;/code&gt;. This example assumes you already have the matching private keys locally and the corresponding public keys authorized on the appropriate servers.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Host edge-bastion
    HostName bastion.example.com
    User alice
    IdentityFile ~/.ssh/id_ed25519_edge
    IdentitiesOnly yes

Host inner-bastion
    HostName 10.0.1.10
    User bob
    IdentityFile ~/.ssh/id_ed25519_inner
    IdentitiesOnly yes

Host private-app
    HostName 10.0.2.20
    User deploy
    IdentityFile ~/.ssh/id_ed25519_app
    IdentitiesOnly yes
    ProxyJump edge-bastion,inner-bastion
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now connect with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh private-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set a &lt;code&gt;Port&lt;/code&gt; in the relevant host entry if that machine uses a nonstandard SSH port. A destination's settings do not generally apply to its jump hosts, which is why each machine has its own entry. See the &lt;a href="https://man.openbsd.org/ssh_config#ProxyJump" rel="noopener noreferrer"&gt;ProxyJump configuration reference&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You do not need to copy private keys onto the bastions or enable agent forwarding for this arrangement. Verify unfamiliar host-key fingerprints through a trusted channel before accepting them.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Reuse the route for file transfers
&lt;/h2&gt;

&lt;p&gt;OpenSSH SFTP can use the same destination alias:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sftp private-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside the SFTP prompt, this example downloads a readable file from the remote account's home directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pwd
ls
get notes.txt ./notes-copy.txt
bye
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;pwd&lt;/code&gt; and &lt;code&gt;ls&lt;/code&gt; inspect the remote location. &lt;code&gt;get&lt;/code&gt; downloads to your local machine; choose a local filename that will not overwrite something you need. The destination must provide an SFTP subsystem, and your remote account needs permission to read the file. See the &lt;a href="https://man.openbsd.org/sftp" rel="noopener noreferrer"&gt;SFTP manual&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Find the failing hop
&lt;/h2&gt;

&lt;p&gt;Start with the shortest connection, then extend it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh &lt;span class="nt"&gt;-v&lt;/span&gt; edge-bastion
ssh &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="nt"&gt;-J&lt;/span&gt; edge-bastion inner-bastion
ssh &lt;span class="nt"&gt;-v&lt;/span&gt; private-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A timeout suggests checking reachability, routing, and firewall rules for the next hop. An authentication failure means checking the username and credential for the machine named in the diagnostic output. The &lt;a href="https://man.openbsd.org/ssh#v" rel="noopener noreferrer"&gt;-v option&lt;/a&gt; helps distinguish those stages.&lt;/p&gt;

&lt;p&gt;If authentication succeeds but forwarding is rejected, ask the administrator to check the bastion's forwarding policy, including &lt;code&gt;AllowTcpForwarding&lt;/code&gt;, &lt;code&gt;PermitOpen&lt;/code&gt;, and any account or key restrictions. An interactive shell working on a bastion does not prove that forwarding is permitted. The relevant server options are documented in &lt;a href="https://man.openbsd.org/sshd_config#AllowTcpForwarding" rel="noopener noreferrer"&gt;sshd_config&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Use the same layout on iPhone and iPad
&lt;/h2&gt;

&lt;p&gt;On a touch device, keeping the route and credentials organized matters more than remembering a long command. A useful connection record contains the destination, the ordered jump hosts, and the authentication details for each machine.&lt;/p&gt;

&lt;p&gt;JTerm supports ordered multi-hop SSH connections using saved credentials for each hop. It also includes SFTP browsing, uploads, downloads, and inline text editing, alongside saved commands and iCloud sync across Apple devices.&lt;/p&gt;

&lt;p&gt;If that fits your workflow, you can find the app and download link on the &lt;a href="https://jterm.jimeji.com/" rel="noopener noreferrer"&gt;JTerm website&lt;/a&gt;. I would welcome feedback on what is hardest about managing servers from a phone or tablet: setting up the route, working with files, or using the terminal itself?&lt;/p&gt;

</description>
      <category>ssh</category>
      <category>devops</category>
      <category>tutorial</category>
      <category>ios</category>
    </item>
  </channel>
</rss>
