<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://doc.expecco.de/index.php?action=history&amp;feed=atom&amp;title=Remote_Access%2Fen</id>
	<title>Remote Access/en - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://doc.expecco.de/index.php?action=history&amp;feed=atom&amp;title=Remote_Access%2Fen"/>
	<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Remote_Access/en&amp;action=history"/>
	<updated>2026-05-28T08:43:38Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in expecco Wiki (Version 25.x)</subtitle>
	<generator>MediaWiki 1.44.2</generator>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Remote_Access/en&amp;diff=31321&amp;oldid=prev</id>
		<title>Sv: Fold the Automatic-Refresh bullets onto single physical lines</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Remote_Access/en&amp;diff=31321&amp;oldid=prev"/>
		<updated>2026-05-26T18:52:47Z</updated>

		<summary type="html">&lt;p&gt;Fold the Automatic-Refresh bullets onto single physical lines&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;de&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Nächstältere Version&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version vom 26. Mai 2026, 18:52 Uhr&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 56:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 56:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;detect external changes.  The default depends on the current root:&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;detect external changes.  The default depends on the current root:&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Local filesystem &amp;amp;rarr; &#039;&#039;&#039;on&#039;&#039;&#039; (10-second cycle, matches the&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Local filesystem &amp;amp;rarr; &#039;&#039;&#039;on&#039;&#039;&#039; (10-second cycle, matches the&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt; long-standing behaviour).&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* SFTP &amp;amp;rarr; &#039;&#039;&#039;off&#039;&#039;&#039;.  Each cycle costs one STAT round-trip per child, which is fine for a handful of local directories but painful over the network.  Click Refresh manually when you need to pick up remote changes.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  long-standing behaviour).&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* SFTP &amp;amp;rarr; &#039;&#039;&#039;off&#039;&#039;&#039;.  Each cycle costs one STAT round-trip&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  per child, which is fine for a handful of local directories but&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  painful over the network.  Click Refresh manually when you need&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  to pick up remote changes.&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;When you navigate between local and SFTP roots the toggle flips&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;When you navigate between local and SFTP roots the toggle flips&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Sv</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Remote_Access/en&amp;diff=31319&amp;oldid=prev</id>
		<title>Sv: Document the Automatic Refresh dropdown toggle and its root-type default</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Remote_Access/en&amp;diff=31319&amp;oldid=prev"/>
		<updated>2026-05-26T18:50:31Z</updated>

		<summary type="html">&lt;p&gt;Document the Automatic Refresh dropdown toggle and its root-type default&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;de&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Nächstältere Version&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version vom 26. Mai 2026, 18:50 Uhr&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 43:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 43:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;.&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;a class=&quot;mw-diff-movedpara-right&quot; title=&quot;Der Absatz wurde verschoben. Klicken, um zur alten Stelle zu springen.&quot; href=&quot;#movedpara_8_0_lhs&quot;&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;a name=&quot;movedpara_1_0_rhs&quot;&gt;&lt;/a&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;The &lt;/ins&gt;&#039;&#039;&#039;Refresh&#039;&#039;&#039; button in the toolbar (the round-arrow icon&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The directory tree does &#039;&#039;&#039;not&#039;&#039;&#039; auto-update: previously a background&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;a class=&quot;mw-diff-movedpara-right&quot; title=&quot;Der Absatz wurde verschoben. Klicken, um zur alten Stelle zu springen.&quot; href=&quot;#movedpara_10_0_lhs&quot;&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;a name=&quot;movedpara_3_0_rhs&quot;&gt;&lt;/a&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;between &lt;/ins&gt;&#039;&#039;Forward&#039;&#039; and &#039;&#039;DirectoryUp&#039;&#039;) re-&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;reads&lt;/ins&gt; &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;both&lt;/ins&gt; the&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;task walked every expanded item every 10 seconds, which over SFTP&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;a class=&quot;mw-diff-movedpara-right&quot; title=&quot;Der Absatz wurde verschoben. Klicken, um zur alten Stelle zu springen.&quot; href=&quot;#movedpara_12_0_lhs&quot;&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;a name=&quot;movedpara_5_0_rhs&quot;&gt;&lt;/a&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;directory tree and the &lt;/ins&gt;contents pane on demand.  &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Works&lt;/ins&gt; uniformly&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;meant one STAT round-trip per child on every cycle.  Click the&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;a class=&quot;mw-diff-movedpara-right&quot; title=&quot;Der Absatz wurde verschoben. Klicken, um zur alten Stelle zu springen.&quot; href=&quot;#movedpara_14_0_lhs&quot;&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;a name=&quot;movedpara_7_0_rhs&quot;&gt;&lt;/a&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;for local and &lt;/ins&gt;SFTP paths; for SFTP it also flushes the per-file&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;a class=&quot;mw-diff-movedpara-left&quot; title=&quot;Der Absatz wurde verschoben. Klicken, um zur neuen Stelle zu springen.&quot; href=&quot;#movedpara_1_0_rhs&quot;&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;a name=&quot;movedpara_8_0_lhs&quot;&gt;&lt;/a&gt;&#039;&#039;&#039;Refresh&#039;&#039;&#039; button in the toolbar (the round-arrow icon&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt; between&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;a class=&quot;mw-diff-movedpara-right&quot; title=&quot;Der Absatz wurde verschoben. Klicken, um zur alten Stelle zu springen.&quot; href=&quot;#movedpara_16_0_lhs&quot;&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;a name=&quot;movedpara_9_0_rhs&quot;&gt;&lt;/a&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;STAT cache, so &lt;/ins&gt;changes made directly on the remote side become&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;a class=&quot;mw-diff-movedpara-left&quot; title=&quot;Der Absatz wurde verschoben. Klicken, um zur neuen Stelle zu springen.&quot; href=&quot;#movedpara_3_0_rhs&quot;&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;a name=&quot;movedpara_10_0_lhs&quot;&gt;&lt;/a&gt;&#039;&#039;Forward&#039;&#039; and &#039;&#039;DirectoryUp&#039;&#039;)&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt; to&lt;/del&gt; re-&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;read&lt;/del&gt; &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;the tree and&lt;/del&gt; the&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;a class=&quot;mw-diff-movedpara-right&quot; title=&quot;Der Absatz wurde verschoben. Klicken, um zur alten Stelle zu springen.&quot; href=&quot;#movedpara_18_0_lhs&quot;&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;a name=&quot;movedpara_11_0_rhs&quot;&gt;&lt;/a&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;visible &lt;/ins&gt;immediately rather than waiting for the 5-second cache TTL&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;a class=&quot;mw-diff-movedpara-left&quot; title=&quot;Der Absatz wurde verschoben. Klicken, um zur neuen Stelle zu springen.&quot; href=&quot;#movedpara_5_0_rhs&quot;&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;a name=&quot;movedpara_12_0_lhs&quot;&gt;&lt;/a&gt;contents pane on demand.  &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Refresh works&lt;/del&gt; uniformly&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt; for local and&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;a class=&quot;mw-diff-movedpara-right&quot; title=&quot;Der Absatz wurde verschoben. Klicken, um zur alten Stelle zu springen.&quot; href=&quot;#movedpara_20_0_lhs&quot;&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;a name=&quot;movedpara_13_0_rhs&quot;&gt;&lt;/a&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;to &lt;/ins&gt;expire.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;a class=&quot;mw-diff-movedpara-left&quot; title=&quot;Der Absatz wurde verschoben. Klicken, um zur neuen Stelle zu springen.&quot; href=&quot;#movedpara_7_0_rhs&quot;&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;a name=&quot;movedpara_14_0_lhs&quot;&gt;&lt;/a&gt;SFTP paths; for SFTP it also flushes the per-file&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt; STAT cache, so&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;a class=&quot;mw-diff-movedpara-left&quot; title=&quot;Der Absatz wurde verschoben. Klicken, um zur neuen Stelle zu springen.&quot; href=&quot;#movedpara_9_0_rhs&quot;&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;a name=&quot;movedpara_16_0_lhs&quot;&gt;&lt;/a&gt;changes made directly on the remote side become&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt; visible&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The small arrow next to the Refresh icon opens a dropdown with a&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;a class=&quot;mw-diff-movedpara-left&quot; title=&quot;Der Absatz wurde verschoben. Klicken, um zur neuen Stelle zu springen.&quot; href=&quot;#movedpara_11_0_rhs&quot;&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;a name=&quot;movedpara_18_0_lhs&quot;&gt;&lt;/a&gt;immediately rather than waiting for the 5-second cache TTL&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt; to&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;single checkbox, &#039;&#039;&#039;Automatic Refresh&#039;&#039;&#039;, controlling the&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;a class=&quot;mw-diff-movedpara-left&quot; title=&quot;Der Absatz wurde verschoben. Klicken, um zur neuen Stelle zu springen.&quot; href=&quot;#movedpara_13_0_rhs&quot;&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;a name=&quot;movedpara_20_0_lhs&quot;&gt;&lt;/a&gt;expire.&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;background polling task that walks every expanded tree item to&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;detect external changes.  The default depends on the current root:&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Local filesystem &amp;amp;rarr; &#039;&#039;&#039;on&#039;&#039;&#039; (10-second cycle, matches the&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  long-standing behaviour).&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* SFTP &amp;amp;rarr; &#039;&#039;&#039;off&#039;&#039;&#039;.  Each cycle costs one STAT round-trip&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  per child, which is fine for a handful of local directories but&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  painful over the network.  Click Refresh manually when you need&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  to pick up remote changes.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;When you navigate between local and SFTP roots the toggle flips&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;automatically &amp;amp;mdash; but only if you haven&#039;t overridden it for&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;the previous root.  An explicit user choice is preserved across&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;navigations.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The Tools menu offers four browser actions, three of them gated on&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The Tools menu offers four browser actions, three of them gated on&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Sv</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Remote_Access/en&amp;diff=31305&amp;oldid=prev</id>
		<title>Sv: Document the Refresh toolbar button (and the disabled tree auto-poll)</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Remote_Access/en&amp;diff=31305&amp;oldid=prev"/>
		<updated>2026-05-26T13:46:08Z</updated>

		<summary type="html">&lt;p&gt;Document the Refresh toolbar button (and the disabled tree auto-poll)&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;de&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Nächstältere Version&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version vom 26. Mai 2026, 13:46 Uhr&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 42:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 42:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;User defaults to the local login name, port to 22, path to&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;User defaults to the local login name, port to 22, path to&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;.&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The directory tree does &#039;&#039;&#039;not&#039;&#039;&#039; auto-update: previously a background&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;task walked every expanded item every 10 seconds, which over SFTP&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;meant one STAT round-trip per child on every cycle.  Click the&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&#039;&#039;&#039;Refresh&#039;&#039;&#039; button in the toolbar (the round-arrow icon between&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&#039;&#039;Forward&#039;&#039; and &#039;&#039;DirectoryUp&#039;&#039;) to re-read the tree and the&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;contents pane on demand.  Refresh works uniformly for local and&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;SFTP paths; for SFTP it also flushes the per-file STAT cache, so&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;changes made directly on the remote side become visible&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;immediately rather than waiting for the 5-second cache TTL to&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;expire.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The Tools menu offers four browser actions, three of them gated on&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The Tools menu offers four browser actions, three of them gated on&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Sv</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Remote_Access/en&amp;diff=31302&amp;oldid=prev</id>
		<title>Sv: Fold bullet continuation lines onto a single physical line so MediaWiki keeps them inside &lt;li&gt;</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Remote_Access/en&amp;diff=31302&amp;oldid=prev"/>
		<updated>2026-05-26T10:33:01Z</updated>

		<summary type="html">&lt;p&gt;Fold bullet continuation lines onto a single physical line so MediaWiki keeps them inside &amp;lt;li&amp;gt;&lt;/p&gt;
&lt;a href=&quot;https://doc.expecco.de/index.php?title=Remote_Access/en&amp;amp;diff=31302&amp;amp;oldid=31300&quot;&gt;Änderungen zeigen&lt;/a&gt;</summary>
		<author><name>Sv</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Remote_Access/en&amp;diff=31300&amp;oldid=prev</id>
		<title>Sv: Remove 2-space continuation-line indent (was triggering MediaWiki &lt;pre&gt;)</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Remote_Access/en&amp;diff=31300&amp;oldid=prev"/>
		<updated>2026-05-26T10:29:04Z</updated>

		<summary type="html">&lt;p&gt;Remove 2-space continuation-line indent (was triggering MediaWiki &amp;lt;pre&amp;gt;)&lt;/p&gt;
&lt;a href=&quot;https://doc.expecco.de/index.php?title=Remote_Access/en&amp;amp;diff=31300&amp;amp;oldid=31297&quot;&gt;Änderungen zeigen&lt;/a&gt;</summary>
		<author><name>Sv</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Remote_Access/en&amp;diff=31297&amp;oldid=prev</id>
		<title>Sv: Use label= for the bold language link (after Template:Languages patch)</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Remote_Access/en&amp;diff=31297&amp;oldid=prev"/>
		<updated>2026-05-26T10:20:13Z</updated>

		<summary type="html">&lt;p&gt;Use label= for the bold language link (after Template:Languages patch)&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;de&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Nächstältere Version&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version vom 26. Mai 2026, 10:20 Uhr&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 1:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 1:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{Languages&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|Remote Access&lt;/del&gt;|Remote Access/en}}&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{Languages|Remote Access/en&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|label=English&lt;/ins&gt;}}&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&#039;&#039;&#039;Remote access&#039;&#039;&#039; is the ability to drive a remote computer or&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&#039;&#039;&#039;Remote access&#039;&#039;&#039; is the ability to drive a remote computer or&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Sv</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Remote_Access/en&amp;diff=31294&amp;oldid=prev</id>
		<title>Sv: Add Filesystem Info feature; document OpenSSH SFTP extensions (posix-rename, hardlink, statvfs, fsync); correct stale limitations/future-work entries.</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Remote_Access/en&amp;diff=31294&amp;oldid=prev"/>
		<updated>2026-05-26T09:53:07Z</updated>

		<summary type="html">&lt;p&gt;Add Filesystem Info feature; document OpenSSH SFTP extensions (posix-rename, hardlink, statvfs, fsync); correct stale limitations/future-work entries.&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;de&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Nächstältere Version&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version vom 26. Mai 2026, 09:53 Uhr&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 1:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 1:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{Languages|Remote Access|Remote Access/en}}&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&#039;&#039;&#039;Remote access&#039;&#039;&#039; is the ability to drive a remote computer or&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&#039;&#039;&#039;Remote access&#039;&#039;&#039; is the ability to drive a remote computer or&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 52:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 53:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;.&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The Tools menu offers &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;three&lt;/del&gt; &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;SSH-related&lt;/del&gt; actions, &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;all&lt;/del&gt; gated on&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt; the&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The Tools menu offers &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;four&lt;/ins&gt; &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;browser&lt;/ins&gt; actions, &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;three of them&lt;/ins&gt; gated on&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;SSH library being loaded:&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;the &lt;/ins&gt;SSH library being loaded:&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* &#039;&#039;&#039;Generate SSH Key Pair...&#039;&#039;&#039; — opens the same key-generation&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* &#039;&#039;&#039;Generate SSH Key Pair...&#039;&#039;&#039; — opens the same key-generation&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 61:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 62:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* &#039;&#039;&#039;SFTP Connect...&#039;&#039;&#039; — points this browser tab at a remote&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* &#039;&#039;&#039;SFTP Connect...&#039;&#039;&#039; — points this browser tab at a remote&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  filesystem via SFTP.&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  filesystem via SFTP.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* &#039;&#039;&#039;Filesystem Info...&#039;&#039;&#039; — shows size, free space and usage of&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  the filesystem holding the currently displayed directory.  Works&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  uniformly for local paths and SFTP paths; for SFTP it requires&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  the server to advertise the &amp;lt;code&amp;gt;statvfs@openssh.com&amp;lt;/code&amp;gt;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  extension (every modern OpenSSH does).  Sizes are reported in&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  IEC binary units (MiB, GiB, TiB) — the largest unit yielding a&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  value ≥ 1 is chosen, so a TB-scale volume reads as &#039;&#039;X TiB&#039;&#039;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  rather than &#039;&#039;10240 GiB&#039;&#039;.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== From expecco actions ==&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== From expecco actions ==&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 372:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 381:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  no SSH_FXP_READLINK exposed (&amp;lt;code&amp;gt;#isSymbolicLink&amp;lt;/code&amp;gt; always&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  no SSH_FXP_READLINK exposed (&amp;lt;code&amp;gt;#isSymbolicLink&amp;lt;/code&amp;gt; always&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;#linkInfo&amp;lt;/code&amp;gt; returns the regular&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;#linkInfo&amp;lt;/code&amp;gt; returns the regular&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  stat info).  SFTPv5+ &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;features&lt;/del&gt; &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;(atomic-overwrite&lt;/del&gt; &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;rename&lt;/del&gt; &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;via&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  stat info). &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt; Several&lt;/ins&gt; SFTPv5+ &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;niceties are&lt;/ins&gt; &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;nevertheless&lt;/ins&gt; &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;picked&lt;/ins&gt; &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;up&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  via OpenSSH SSH_FXP_EXTENDED requests — see&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;lt;code&amp;gt;SSH_FXF_OVERWRITE&amp;lt;/code&amp;gt;) not supported.&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  [[#OpenSSH SFTP extensions]] below.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* &#039;&#039;&#039;Per-host serialisation.&#039;&#039;&#039;  Two concurrent operations on the&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* &#039;&#039;&#039;Per-host serialisation.&#039;&#039;&#039;  Two concurrent operations on the&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  same host queue through the host mutex.  See [[#Future work]].&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  same host queue through the host mutex.  See [[#Future work]].&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* &#039;&#039;&#039;&amp;lt;code&amp;gt;#renameTo:&amp;lt;/code&amp;gt; has a TOCTOU window.&#039;&#039;&#039;  &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;POSIX-style&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* &#039;&#039;&#039;&amp;lt;code&amp;gt;#renameTo:&amp;lt;/code&amp;gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt; fallback&lt;/ins&gt; has a TOCTOU window.&#039;&#039;&#039;  &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;On&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  servers that advertise &amp;lt;code&amp;gt;posix-rename@openssh.com&amp;lt;/code&amp;gt; (every&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;a class=&quot;mw-diff-movedpara-left&quot; title=&quot;Der Absatz wurde verschoben. Klicken, um zur neuen Stelle zu springen.&quot; href=&quot;#movedpara_16_0_rhs&quot;&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;a name=&quot;movedpara_13_0_lhs&quot;&gt;&lt;/a&gt;  &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;overwrite&lt;/del&gt; is emulated as delete-then-rename&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;; another process can&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  modern OpenSSH does), overwrite is atomic; on the rare server&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;a class=&quot;mw-diff-movedpara-left&quot; title=&quot;Der Absatz wurde verschoben. Klicken, um zur neuen Stelle zu springen.&quot; href=&quot;#movedpara_16_1_rhs&quot;&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;a name=&quot;movedpara_15_0_lhs&quot;&gt;&lt;/a&gt;  race in between.&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;a class=&quot;mw-diff-movedpara-right&quot; title=&quot;Der Absatz wurde verschoben. Klicken, um zur alten Stelle zu springen.&quot; href=&quot;#movedpara_13_0_lhs&quot;&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;a name=&quot;movedpara_16_0_rhs&quot;&gt;&lt;/a&gt;  &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;that does not, the receiver&lt;/ins&gt; is emulated as delete-then-rename&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;a class=&quot;mw-diff-movedpara-right&quot; title=&quot;Der Absatz wurde verschoben. Klicken, um zur alten Stelle zu springen.&quot; href=&quot;#movedpara_15_0_lhs&quot;&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;a name=&quot;movedpara_16_1_rhs&quot;&gt;&lt;/a&gt; &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt; and another process can&lt;/ins&gt; race in between.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* &#039;&#039;&#039;&amp;lt;code&amp;gt;#isNonEmptyDirectory&amp;lt;/code&amp;gt; is heuristic.&#039;&#039;&#039;  Always&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* &#039;&#039;&#039;&amp;lt;code&amp;gt;#isNonEmptyDirectory&amp;lt;/code&amp;gt; is heuristic.&#039;&#039;&#039;  Always&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  returns &amp;lt;code&amp;gt;#isDirectory&amp;lt;/code&amp;gt; (the accurate answer would cost&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  returns &amp;lt;code&amp;gt;#isDirectory&amp;lt;/code&amp;gt; (the accurate answer would cost&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 412:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 424:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;heartbeat, SSH_MSG_DISCONNECT.&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;heartbeat, SSH_MSG_DISCONNECT.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|}&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|}&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== OpenSSH SFTP extensions ===&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;SFTP v3 (RFC draft-ietf-secsh-filexfer-02) is intentionally minimal.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;OpenSSH ships an open-ended extension mechanism: the server lists&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;extension names it understands in its &amp;lt;code&amp;gt;SSH_FXP_VERSION&amp;lt;/code&amp;gt;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;reply, and the client invokes them via&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;code&amp;gt;SSH_FXP_EXTENDED(200)&amp;lt;/code&amp;gt; packets carrying the extension&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;name as the first string.  Each extension is feature-detected via&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;code&amp;gt;SSH::SftpClient&amp;amp;gt;&amp;amp;gt;supportsExtension:&amp;lt;/code&amp;gt;; callers fall&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;back when the server doesn&#039;t advertise it.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The stack uses four of the OpenSSH extensions today:&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* &amp;lt;code&amp;gt;posix-rename@openssh.com&amp;lt;/code&amp;gt; — atomic&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  rename-with-overwrite.  Picked up automatically by&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;lt;code&amp;gt;SftpFilename&amp;amp;gt;&amp;amp;gt;renameTo:&amp;lt;/code&amp;gt;; the delete-then-rename&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  fallback only fires on servers that lack it.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* &amp;lt;code&amp;gt;hardlink@openssh.com&amp;lt;/code&amp;gt; — create a POSIX hard link.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  Exposed as &amp;lt;code&amp;gt;SftpFilename&amp;amp;gt;&amp;amp;gt;createHardLinkAs:&amp;lt;/code&amp;gt;.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* &amp;lt;code&amp;gt;statvfs@openssh.com&amp;lt;/code&amp;gt; — POSIX&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;lt;code&amp;gt;statvfs(3)&amp;lt;/code&amp;gt;-shape filesystem stats.  Exposed as&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;lt;code&amp;gt;SftpFilename&amp;amp;gt;&amp;amp;gt;fileSystemInfo&amp;lt;/code&amp;gt;; the result is&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  shape-compatible with &amp;lt;code&amp;gt;OperatingSystem getDiskInfoOf:&amp;lt;/code&amp;gt;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  so callers can treat local and remote uniformly.  Drives the&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &#039;&#039;&#039;Tools &amp;amp;rarr; Filesystem Info...&#039;&#039;&#039; menu entry described at the&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  top of this page.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* &amp;lt;code&amp;gt;fsync@openssh.com&amp;lt;/code&amp;gt; — flush server-side write buffer&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  to disk on an open handle.  Available on the low-level&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  &amp;lt;code&amp;gt;SftpClient&amp;amp;gt;&amp;amp;gt;fsyncHandle:&amp;lt;/code&amp;gt;; not yet plumbed&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  into a Filename-level &quot;durable write&quot; API.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The remaining OpenSSH extensions&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;(&amp;lt;code&amp;gt;lsetstat@openssh.com&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fstatvfs@openssh.com&amp;lt;/code&amp;gt;)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;are recognised in the advertised-extensions list but not wrapped at&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Filename level — there&#039;s no Filename-side caller for them yet.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Connection pooling ===&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Connection pooling ===&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 448:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 496:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  + READ_DIR (first batch only) + CLOSE — three RTTs per probe;&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  + READ_DIR (first batch only) + CLOSE — three RTTs per probe;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  needs SftpClient to pipeline requests before this pays off.&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  needs SftpClient to pipeline requests before this pays off.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* &#039;&#039;&#039;SFTP v5/v6 negotiation&#039;&#039;&#039; for &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;atomic-overwrite&lt;/del&gt; &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;rename,&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* &#039;&#039;&#039;SFTP v5/v6 negotiation&#039;&#039;&#039; for &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;extended&lt;/ins&gt; &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;attrs and FTP-style&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  canonicalisation.  (Atomic-overwrite rename is already handled&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  extended attrs, FTP-style canonicalisation.&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  via the OpenSSH &amp;lt;code&amp;gt;posix-rename@openssh.com&amp;lt;/code&amp;gt; extension;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  see [[#OpenSSH SFTP extensions]].)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Command Shell =&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Command Shell =&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Sv</name></author>
	</entry>
	<entry>
		<id>https://doc.expecco.de/index.php?title=Remote_Access/en&amp;diff=31292&amp;oldid=prev</id>
		<title>Sv: Die Seite wurde neu angelegt: „ &#039;&#039;&#039;Remote access&#039;&#039;&#039; is the ability to drive a remote computer or network from this expecco image — opening shells, running commands, moving files, or driving a test target.  Three protocol families are supported, listed in current-recommended order:  * &#039;&#039;&#039;SSH and SFTP&#039;&#039;&#039; (recommended) — encrypted shell + secure   file transfer over an SSH-2 tunnel.  Pure-Smalltalk implementation   in &lt;code&gt;exept:libcrypt/ssh&lt;/code&gt;; no external dependency on   OpenSS…“</title>
		<link rel="alternate" type="text/html" href="https://doc.expecco.de/index.php?title=Remote_Access/en&amp;diff=31292&amp;oldid=prev"/>
		<updated>2026-05-26T08:49:01Z</updated>

		<summary type="html">&lt;p&gt;Die Seite wurde neu angelegt: „ &amp;#039;&amp;#039;&amp;#039;Remote access&amp;#039;&amp;#039;&amp;#039; is the ability to drive a remote computer or network from this expecco image — opening shells, running commands, moving files, or driving a test target.  Three protocol families are supported, listed in current-recommended order:  * &amp;#039;&amp;#039;&amp;#039;SSH and SFTP&amp;#039;&amp;#039;&amp;#039; (recommended) — encrypted shell + secure   file transfer over an SSH-2 tunnel.  Pure-Smalltalk implementation   in &amp;lt;code&amp;gt;exept:libcrypt/ssh&amp;lt;/code&amp;gt;; no external dependency on   OpenSS…“&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Remote access&amp;#039;&amp;#039;&amp;#039; is the ability to drive a remote computer or&lt;br /&gt;
network from this expecco image — opening shells, running commands,&lt;br /&gt;
moving files, or driving a test target.  Three protocol families are&lt;br /&gt;
supported, listed in current-recommended order:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;SSH and SFTP&amp;#039;&amp;#039;&amp;#039; (recommended) — encrypted shell + secure&lt;br /&gt;
  file transfer over an SSH-2 tunnel.  Pure-Smalltalk implementation&lt;br /&gt;
  in &amp;lt;code&amp;gt;exept:libcrypt/ssh&amp;lt;/code&amp;gt;; no external dependency on&lt;br /&gt;
  OpenSSL or libssh.  Use this for anything that touches credentials&lt;br /&gt;
  or sensitive payloads.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Local Command Shell&amp;#039;&amp;#039;&amp;#039; — fork + exec on the local machine.&lt;br /&gt;
  Used for local-tool integration and for the local end of a remote&lt;br /&gt;
  workflow that bridges via another protocol.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Telnet&amp;#039;&amp;#039;&amp;#039; (legacy) — plain-text terminal session.  No&lt;br /&gt;
  encryption, passwords on the wire in clear.  Use only when the&lt;br /&gt;
  target hardware has no other option.&lt;br /&gt;
&lt;br /&gt;
= SSH and SFTP =&lt;br /&gt;
&lt;br /&gt;
The SSH stack covers the full SSH-2 protocol (RFC 4251–4254,&lt;br /&gt;
RFC 5656, RFC 8709, RFC 8731) plus OpenSSH&amp;#039;s chacha20-poly1305&lt;br /&gt;
transport cipher and the SFTP v3 file-transfer subsystem&lt;br /&gt;
(draft-ietf-secsh-filexfer-02).  Two layers:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;SSH::Client&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; — programmatic SSH access (remote&lt;br /&gt;
  &amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;, TTY shell, agent forwarding, ProxyJump bastion).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;SSH::SftpFilename&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; — a &amp;lt;code&amp;gt;Filename&amp;lt;/code&amp;gt;&lt;br /&gt;
  subclass that lets the rest of ST/X treat a remote SFTP path the&lt;br /&gt;
  same way it treats a local file.&lt;br /&gt;
&lt;br /&gt;
The rest of this section is organised user-task-first: what the user&lt;br /&gt;
sees and does, the expecco-library hooks below that, then the&lt;br /&gt;
implementation detail at the end for the curious.&lt;br /&gt;
&lt;br /&gt;
== From the FileBrowserV2 ==&lt;br /&gt;
&lt;br /&gt;
Open the location dropdown and paste an &amp;lt;code&amp;gt;sftp://&amp;lt;/code&amp;gt; URL.&lt;br /&gt;
The browser tab populates as if it were a local path.  Tree&lt;br /&gt;
expansion, column sort (name / size / mtime), preview, and&lt;br /&gt;
double-click-to-open-in-editor all behave normally.  The first&lt;br /&gt;
click on a host takes ~200–500 ms (TCP + KEX + auth); subsequent&lt;br /&gt;
clicks reuse the pooled connection.&lt;br /&gt;
&lt;br /&gt;
URL syntax:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sftp://[user@]host[:port]/remote/path&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
User defaults to the local login name, port to 22, path to&lt;br /&gt;
&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The Tools menu offers three SSH-related actions, all gated on the&lt;br /&gt;
SSH library being loaded:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Generate SSH Key Pair...&amp;#039;&amp;#039;&amp;#039; — opens the same key-generation&lt;br /&gt;
  dialog described under [[#Generating an SSH key pair]] below.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;SSH Connect...&amp;#039;&amp;#039;&amp;#039; — opens an interactive VT100 terminal to a&lt;br /&gt;
  remote host.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;SFTP Connect...&amp;#039;&amp;#039;&amp;#039; — points this browser tab at a remote&lt;br /&gt;
  filesystem via SFTP.&lt;br /&gt;
&lt;br /&gt;
== From expecco actions ==&lt;br /&gt;
&lt;br /&gt;
The Expecco RemoteAccess plugin&lt;br /&gt;
([[Expecco::RemoteAccessImportPlugin]]) exposes the following test&lt;br /&gt;
actions to the expecco action palette:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;CmdShell - Open SSH Remote Connection&amp;#039;&amp;#039;&amp;#039; — opens an SSH session&lt;br /&gt;
  via the platform&amp;#039;s &amp;lt;code&amp;gt;ssh&amp;lt;/code&amp;gt; binary (PuTTY&amp;#039;s&lt;br /&gt;
  &amp;lt;code&amp;gt;plink&amp;lt;/code&amp;gt; on Windows).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;CmdShell - Open SSH Remote Connection and PublicKey&amp;#039;&amp;#039;&amp;#039; — same&lt;br /&gt;
  but with explicit public-key authentication.&lt;br /&gt;
&lt;br /&gt;
To run these you need a configured keypair (private key on this&lt;br /&gt;
machine, public key in the remote host&amp;#039;s&lt;br /&gt;
&amp;lt;code&amp;gt;~/.ssh/authorized_keys&amp;lt;/code&amp;gt;).  Generate one via the dialog&lt;br /&gt;
below or via &amp;lt;code&amp;gt;ssh-keygen&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The plugin also adds a settings page at &amp;#039;&amp;#039;&amp;#039;Extras → Settings →&lt;br /&gt;
Plugins → Remote Access — SSH Keys&amp;#039;&amp;#039;&amp;#039; carrying a single&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Generate SSH Key Pair...&amp;#039;&amp;#039;&amp;#039; button that opens the same dialog.&lt;br /&gt;
&lt;br /&gt;
== Generating an SSH key pair ==&lt;br /&gt;
&lt;br /&gt;
=== The dialog (FileBrowserV2 / settings page) ===&lt;br /&gt;
&lt;br /&gt;
The dialog asks for all parameters in one form:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Comment&amp;#039;&amp;#039;&amp;#039; — embedded in the generated key (defaults to&lt;br /&gt;
  &amp;lt;code&amp;gt;stx@&amp;amp;lt;hostname&amp;amp;gt;&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Storage&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
** &amp;#039;&amp;#039;Save to disk file only&amp;#039;&amp;#039; — writes &amp;lt;code&amp;gt;~/.ssh/id_ed25519_stx&amp;lt;/code&amp;gt;&lt;br /&gt;
   (or wherever) plus a matching &amp;lt;code&amp;gt;.pub&amp;lt;/code&amp;gt; companion.&lt;br /&gt;
** &amp;#039;&amp;#039;Save to disk AND load into ssh-agent&amp;#039;&amp;#039; — writes the file and&lt;br /&gt;
   also hands the key to the running ssh-agent.&lt;br /&gt;
** &amp;#039;&amp;#039;Load into ssh-agent only&amp;#039;&amp;#039; — key lives in agent memory only;&lt;br /&gt;
   gone on agent restart.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Private key file&amp;#039;&amp;#039;&amp;#039; — full path; disabled in agent-only mode.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Passphrase / Confirm&amp;#039;&amp;#039;&amp;#039; — empty leaves the on-disk file&lt;br /&gt;
  unencrypted (agent-only mode ignores the passphrase, since the&lt;br /&gt;
  OpenSSH agent wire protocol carries only the decrypted key).&lt;br /&gt;
&lt;br /&gt;
On &amp;#039;&amp;#039;&amp;#039;Generate&amp;#039;&amp;#039;&amp;#039;, the public-key line (the same&lt;br /&gt;
&amp;lt;code&amp;gt;ssh-ed25519 AAAA... comment&amp;lt;/code&amp;gt; string ssh-keygen&lt;br /&gt;
emits) is copied to the system clipboard for pasting into the&lt;br /&gt;
remote host&amp;#039;s &amp;lt;code&amp;gt;~/.ssh/authorized_keys&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== From a workspace ===&lt;br /&gt;
&lt;br /&gt;
For headless deployments, sandboxed builds, or scripts,&lt;br /&gt;
&amp;lt;code&amp;gt;SSH::Client&amp;lt;/code&amp;gt; exposes a pure-Smalltalk key generator&lt;br /&gt;
that produces output bit-compatible with&lt;br /&gt;
&amp;lt;code&amp;gt;ssh-keygen -t ed25519&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
| seed comment priv |&lt;br /&gt;
seed    := SSH::Client generateEd25519Seed.&lt;br /&gt;
comment := &amp;#039;stx@&amp;#039;, OperatingSystem getHostName.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;/ Save passphrase-encrypted to disk&amp;quot;&lt;br /&gt;
priv := (Filename homeDirectory / &amp;#039;.ssh&amp;#039; / &amp;#039;id_ed25519_stx&amp;#039;) pathName.&lt;br /&gt;
SSH::Client&lt;br /&gt;
    saveOpenSshEd25519Seed:seed&lt;br /&gt;
    toFile:priv&lt;br /&gt;
    comment:comment&lt;br /&gt;
    passphrase:&amp;#039;choose-something-long&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;/ AND load into the running agent&amp;quot;&lt;br /&gt;
SSH::Client addEd25519SeedToAgent:seed comment:comment.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;/ Print the public-key line to paste into authorized_keys&amp;quot;&lt;br /&gt;
Transcript showCR:&lt;br /&gt;
    (SSH::Client authorizedKeysLineForEd25519Seed:seed comment:comment).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Keys generated this way are interoperable with OpenSSH&amp;#039;s own&lt;br /&gt;
tooling (&amp;lt;code&amp;gt;ssh-keygen -y -f ...&amp;lt;/code&amp;gt; re-derives the public&lt;br /&gt;
key, &amp;lt;code&amp;gt;ssh-keygen -p -f ...&amp;lt;/code&amp;gt; changes the passphrase,&lt;br /&gt;
etc.).&lt;br /&gt;
&lt;br /&gt;
=== Using the shell tools instead ===&lt;br /&gt;
&lt;br /&gt;
The traditional path also works:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh-keygen -t ed25519 -C &amp;quot;stx@your.host&amp;quot;&lt;br /&gt;
ssh-copy-id user@remotehost&lt;br /&gt;
ssh-add ~/.ssh/id_ed25519&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Preparing ssh-agent ==&lt;br /&gt;
&lt;br /&gt;
The agent path is strongly preferred over reading raw keyfiles: it&lt;br /&gt;
keeps encrypted private keys unlocked once per session, and handles&lt;br /&gt;
identities (hardware-token-backed keys, KeePassXC entries) that&lt;br /&gt;
ST/X should never see directly.&lt;br /&gt;
&lt;br /&gt;
ST/X picks the agent path automatically when&lt;br /&gt;
&amp;lt;code&amp;gt;$SSH_AUTH_SOCK&amp;lt;/code&amp;gt; is set in the process environment&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;at the time stx is launched&amp;#039;&amp;#039;&amp;#039;.  Setting it later from a&lt;br /&gt;
workspace does not help.&lt;br /&gt;
&lt;br /&gt;
=== Linux / macOS ===&lt;br /&gt;
&lt;br /&gt;
Most desktop distributions launch an agent automatically as part of&lt;br /&gt;
the session (gnome-keyring on GNOME, ssh-agent.service on systemd,&lt;br /&gt;
KWallet on KDE).  Verify in a terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo $SSH_AUTH_SOCK    # /run/user/1000/keyring/ssh or similar&lt;br /&gt;
ssh-add -l             # lists loaded identities&lt;br /&gt;
ssh-add ~/.ssh/id_ed25519   # load yours if not loaded&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If no agent runs at all, add this snippet to your shell rc:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ~/.bashrc or ~/.zshrc&lt;br /&gt;
if [ -z &amp;quot;$SSH_AUTH_SOCK&amp;quot; ]; then&lt;br /&gt;
    eval &amp;quot;$(ssh-agent -s)&amp;quot; &amp;gt; /dev/null&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ST/X must be launched from a shell that has seen this rc — a&lt;br /&gt;
desktop launcher started from the file manager does NOT inherit&lt;br /&gt;
the variable.  Wrap the stx start command in a small script under&lt;br /&gt;
&amp;lt;code&amp;gt;~/.local/bin/&amp;lt;/code&amp;gt; that sources the rc first.&lt;br /&gt;
&lt;br /&gt;
The Remote Access settings page (&amp;#039;&amp;#039;&amp;#039;Extras → Settings → Plugins&lt;br /&gt;
→ Remote Access — SSH Keys&amp;#039;&amp;#039;&amp;#039;) shows whether the running image&lt;br /&gt;
sees an agent.&lt;br /&gt;
&lt;br /&gt;
==== Permanent setup via systemd ====&lt;br /&gt;
&lt;br /&gt;
For a truly cross-session agent (survives desktop logouts, comes&lt;br /&gt;
up automatically at next login), enable the per-user systemd&lt;br /&gt;
unit shipped with most distros&amp;#039; &amp;lt;code&amp;gt;openssh-clients&amp;lt;/code&amp;gt;&lt;br /&gt;
package:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl --user enable --now ssh-agent.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then point &amp;lt;code&amp;gt;SSH_AUTH_SOCK&amp;lt;/code&amp;gt; at the user-service socket&lt;br /&gt;
in your shell rc (this replaces the &amp;lt;code&amp;gt;eval $(ssh-agent -s)&amp;lt;/code&amp;gt;&lt;br /&gt;
snippet above):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export SSH_AUTH_SOCK=&amp;quot;${XDG_RUNTIME_DIR}/ssh-agent.socket&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Auto-loading keys on first use ====&lt;br /&gt;
&lt;br /&gt;
To skip the manual &amp;lt;code&amp;gt;ssh-add&amp;lt;/code&amp;gt; step, let OpenSSH load&lt;br /&gt;
keys into the agent automatically the first time they are needed.&lt;br /&gt;
Add to &amp;lt;code&amp;gt;~/.ssh/config&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Host *&lt;br /&gt;
    AddKeysToAgent yes&lt;br /&gt;
    IdentityFile ~/.ssh/id_ed25519&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first SSH connection then prompts for the key passphrase&lt;br /&gt;
once and hands the unlocked key to the agent; subsequent&lt;br /&gt;
connections use the cached identity without prompting.&lt;br /&gt;
&lt;br /&gt;
=== Windows ===&lt;br /&gt;
&lt;br /&gt;
Windows 10+ ships native OpenSSH including an agent service.&lt;br /&gt;
One-time setup:&lt;br /&gt;
&lt;br /&gt;
# Open &amp;#039;&amp;#039;&amp;#039;Services&amp;#039;&amp;#039;&amp;#039; (&amp;lt;code&amp;gt;services.msc&amp;lt;/code&amp;gt;) as Administrator.&lt;br /&gt;
# Find &amp;#039;&amp;#039;&amp;#039;OpenSSH Authentication Agent&amp;#039;&amp;#039;&amp;#039;, set Startup Type to&lt;br /&gt;
  &amp;#039;&amp;#039;&amp;#039;Automatic&amp;#039;&amp;#039;&amp;#039;, click &amp;#039;&amp;#039;&amp;#039;Start&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
# In PowerShell: &amp;lt;code&amp;gt;ssh-add $HOME\.ssh\id_ed25519&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Verify: &amp;lt;code&amp;gt;ssh-add -l&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The Windows OpenSSH agent listens on a named pipe&lt;br /&gt;
(&amp;lt;code&amp;gt;\\.\pipe\openssh-ssh-agent&amp;lt;/code&amp;gt;), not a Unix socket.  ST/X&lt;br /&gt;
supports both transports, but Windows ssh-add does &amp;#039;&amp;#039;&amp;#039;not&amp;#039;&amp;#039;&amp;#039; set&lt;br /&gt;
&amp;lt;code&amp;gt;SSH_AUTH_SOCK&amp;lt;/code&amp;gt; for you.  Add it manually:&lt;br /&gt;
&lt;br /&gt;
# Press {{Key|Win}} → type &amp;quot;environment&amp;quot; → &amp;quot;Edit the system environment variables&amp;quot;.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Environment Variables&amp;#039;&amp;#039;&amp;#039; → under &amp;#039;&amp;#039;&amp;#039;User variables&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;New&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
# Name: &amp;lt;code&amp;gt;SSH_AUTH_SOCK&amp;lt;/code&amp;gt;&lt;br /&gt;
# Value: &amp;lt;code&amp;gt;\\.\pipe\openssh-ssh-agent&amp;lt;/code&amp;gt;&lt;br /&gt;
# Log out and back in (or restart stx) so the new env propagates.&lt;br /&gt;
&lt;br /&gt;
==== PowerShell quick-setup ====&lt;br /&gt;
&lt;br /&gt;
The same setup from an &amp;#039;&amp;#039;&amp;#039;elevated&amp;#039;&amp;#039;&amp;#039; PowerShell prompt, for&lt;br /&gt;
scripts or unattended provisioning:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Start the agent now AND on every reboot (permanent).&lt;br /&gt;
Set-Service -Name ssh-agent -StartupType Automatic&lt;br /&gt;
Start-Service ssh-agent&lt;br /&gt;
&lt;br /&gt;
# Persist SSH_AUTH_SOCK for the user (survives reboots).&lt;br /&gt;
[Environment]::SetEnvironmentVariable(&lt;br /&gt;
    &amp;#039;SSH_AUTH_SOCK&amp;#039;,&lt;br /&gt;
    &amp;#039;\\.\pipe\openssh-ssh-agent&amp;#039;,&lt;br /&gt;
    &amp;#039;User&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
# Load a key (prompts for the passphrase if the file is encrypted).&lt;br /&gt;
ssh-add $HOME\.ssh\id_ed25519&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For a one-shot agent start without making it persistent (e.g.&lt;br /&gt;
single-session test), drop the &amp;lt;code&amp;gt;Set-Service&amp;lt;/code&amp;gt; line and&lt;br /&gt;
just run &amp;lt;code&amp;gt;Start-Service ssh-agent&amp;lt;/code&amp;gt;.  The env-var line&lt;br /&gt;
can also be omitted if &amp;lt;code&amp;gt;SSH_AUTH_SOCK&amp;lt;/code&amp;gt; is only needed&lt;br /&gt;
in the current shell — use &amp;lt;code&amp;gt;$env:SSH_AUTH_SOCK = &amp;#039;...&amp;#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
instead for that session-local form.&lt;br /&gt;
&lt;br /&gt;
On stripped-down Windows installs the ssh-agent service may not&lt;br /&gt;
be present.  Add it once via &amp;#039;&amp;#039;&amp;#039;Settings → Apps → Optional&lt;br /&gt;
features → OpenSSH Client&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Alternative agents:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;PuTTY pageant&amp;#039;&amp;#039;&amp;#039; — uses its own protocol; NOT supported by&lt;br /&gt;
  ST/X&amp;#039;s SSH::Agent.  Migrate the keys to OpenSSH.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Git for Windows ssh-agent&amp;#039;&amp;#039;&amp;#039; — works; point&lt;br /&gt;
  &amp;lt;code&amp;gt;SSH_AUTH_SOCK&amp;lt;/code&amp;gt; at the socket it publishes.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;WSL 2&amp;#039;&amp;#039;&amp;#039; — a ST/X inside WSL sees WSL&amp;#039;s Linux agent normally;&lt;br /&gt;
  a ST/X on the Windows side does not.  Bridging needs a helper&lt;br /&gt;
  like &amp;lt;code&amp;gt;npiperelay&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;socat&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Verify in the Remote Access settings page&lt;br /&gt;
(&amp;#039;&amp;#039;&amp;#039;Extras → Settings → Plugins → Remote Access — SSH Keys&amp;#039;&amp;#039;&amp;#039;) —&lt;br /&gt;
the agent indicator there reports whether the running image sees&lt;br /&gt;
the agent.&lt;br /&gt;
&lt;br /&gt;
==== Auto-loading keys on first use ====&lt;br /&gt;
&lt;br /&gt;
Windows OpenSSH does &amp;#039;&amp;#039;&amp;#039;not&amp;#039;&amp;#039;&amp;#039; persist agent-loaded keys across&lt;br /&gt;
agent restarts.  To avoid running &amp;lt;code&amp;gt;ssh-add&amp;lt;/code&amp;gt; manually&lt;br /&gt;
after each reboot, add the same lazy-load configuration to&lt;br /&gt;
&amp;lt;code&amp;gt;%USERPROFILE%\.ssh\config&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Host *&lt;br /&gt;
    AddKeysToAgent yes&lt;br /&gt;
    IdentityFile ~/.ssh/id_ed25519&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
OpenSSH then loads the key into the agent on first use (prompts&lt;br /&gt;
for the passphrase once) and reuses it for the rest of the&lt;br /&gt;
session.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
All tunables are class-side on &amp;lt;code&amp;gt;SSH::SftpFilename&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Accessor !! Default !! What it controls&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;#idleEvictionSeconds:&amp;lt;/code&amp;gt; || 240 (4 min) || How long a pooled&lt;br /&gt;
connection sits idle before the next access proactively closes +&lt;br /&gt;
reopens it.  Just under typical sshd&lt;br /&gt;
&amp;lt;code&amp;gt;ClientAliveInterval × ClientAliveCountMax&amp;lt;/code&amp;gt; so we recycle&lt;br /&gt;
before the server TCP-RESETs us.  Pass &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; to restore&lt;br /&gt;
the default.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;#attrsCacheTtlSeconds:&amp;lt;/code&amp;gt; || 5 || Max age (s) of a&lt;br /&gt;
cached STAT before &amp;lt;code&amp;gt;#ensureAttrs&amp;lt;/code&amp;gt; refetches.  Parent&lt;br /&gt;
listDir always re-stamps fresh attrs onto children, so navigating&lt;br /&gt;
an open directory does not pay the TTL.  Set to &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; to&lt;br /&gt;
disable caching.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;#closeAllConnections&amp;lt;/code&amp;gt; || (action) || Tears down every&lt;br /&gt;
pooled connection.  Useful after a known-bad network event, before&lt;br /&gt;
a deliberate identity swap, or as part of a clean image shutdown.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Diagnostics ==&lt;br /&gt;
&lt;br /&gt;
=== SemaphoreMonitor ===&lt;br /&gt;
&lt;br /&gt;
Open &amp;lt;code&amp;gt;SemaphoreMonitor&amp;lt;/code&amp;gt; from the Launcher&amp;#039;s &amp;quot;Status&amp;quot;&lt;br /&gt;
sub-menu.  Per-host SFTP mutex appears as&lt;br /&gt;
&amp;lt;code&amp;gt;SFTP/&amp;amp;lt;user@host:port&amp;amp;gt;&amp;lt;/code&amp;gt;; the pool-wide mutex as&lt;br /&gt;
&amp;lt;code&amp;gt;SFTP/pool&amp;lt;/code&amp;gt;.  Right-click a row:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Copy Waiters Stack to Clipboard&amp;#039;&amp;#039;&amp;#039; — dumps the last-owner&amp;#039;s&lt;br /&gt;
  walkback plus each waiter&amp;#039;s, formatted as plain text.  Use when&lt;br /&gt;
  a process is wedged in &amp;lt;code&amp;gt;readWait&amp;lt;/code&amp;gt; inside&lt;br /&gt;
  &amp;lt;code&amp;gt;withSftpClientDo:&amp;lt;/code&amp;gt; and you need to see which SFTP&lt;br /&gt;
  request it is on.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Copy List to Clipboard&amp;#039;&amp;#039;&amp;#039; — the whole table, for an&lt;br /&gt;
  email-this-to-someone diagnosis.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Detect Deadlocks&amp;#039;&amp;#039;&amp;#039; — DFS over the wait-for graph, reports&lt;br /&gt;
  cycles.&lt;br /&gt;
&lt;br /&gt;
=== Logger ===&lt;br /&gt;
&lt;br /&gt;
The SSH stack logs interesting events:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;warning:&amp;lt;/code&amp;gt; on auto-reconnect after a dead connection.&lt;br /&gt;
* &amp;lt;code&amp;gt;warning:&amp;lt;/code&amp;gt; when a pool entry is idle-evicted.&lt;br /&gt;
* &amp;lt;code&amp;gt;warning:&amp;lt;/code&amp;gt; when an SSH key file cannot be parsed&lt;br /&gt;
  (e.g. legacy PEM, encrypted-without-agent) — the file is skipped,&lt;br /&gt;
  others tried.&lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;SFTP v3 only.&amp;#039;&amp;#039;&amp;#039;  No SETSTAT (no remote chmod / chown / utime),&lt;br /&gt;
  no SSH_FXP_READLINK exposed (&amp;lt;code&amp;gt;#isSymbolicLink&amp;lt;/code&amp;gt; always&lt;br /&gt;
  &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;#linkInfo&amp;lt;/code&amp;gt; returns the regular&lt;br /&gt;
  stat info).  SFTPv5+ features (atomic-overwrite rename via&lt;br /&gt;
  &amp;lt;code&amp;gt;SSH_FXF_OVERWRITE&amp;lt;/code&amp;gt;) not supported.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Per-host serialisation.&amp;#039;&amp;#039;&amp;#039;  Two concurrent operations on the&lt;br /&gt;
  same host queue through the host mutex.  See [[#Future work]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;#renameTo:&amp;lt;/code&amp;gt; has a TOCTOU window.&amp;#039;&amp;#039;&amp;#039;  POSIX-style&lt;br /&gt;
  overwrite is emulated as delete-then-rename; another process can&lt;br /&gt;
  race in between.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;#isNonEmptyDirectory&amp;lt;/code&amp;gt; is heuristic.&amp;#039;&amp;#039;&amp;#039;  Always&lt;br /&gt;
  returns &amp;lt;code&amp;gt;#isDirectory&amp;lt;/code&amp;gt; (the accurate answer would cost&lt;br /&gt;
  three round-trips per directory icon, which made the original tree&lt;br /&gt;
  expansion unbearably slow).&lt;br /&gt;
&lt;br /&gt;
== Implementation details ==&lt;br /&gt;
&lt;br /&gt;
For readers wanting the architecture.  Five classes, top-down:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Class !! Role&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SSH::SftpFilename&amp;lt;/code&amp;gt; || Filename subclass; the public&lt;br /&gt;
API.  Maps &amp;lt;code&amp;gt;sftp://...&amp;lt;/code&amp;gt; URLs to remote files; exposes&lt;br /&gt;
&amp;lt;code&amp;gt;directoryContents&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;readingFileDo:&amp;lt;/code&amp;gt;,&lt;br /&gt;
&amp;lt;code&amp;gt;renameTo:&amp;lt;/code&amp;gt; etc.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SSH::SftpClient&amp;lt;/code&amp;gt; || SFTP-v3 protocol&lt;br /&gt;
(request/response codec, listDir, stat, open, read, write, mkdir).&lt;br /&gt;
Driven by SftpFilename.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SSH::Channel&amp;lt;/code&amp;gt; || SSH channel multiplexer&lt;br /&gt;
(CHANNEL_OPEN, DATA, EOF, CLOSE, WINDOW_ADJUST).  One logical&lt;br /&gt;
session per Channel instance.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SSH::Client&amp;lt;/code&amp;gt; || High-level SSH client: opens the&lt;br /&gt;
transport, runs KEX, host-key check, userauth, then dispenses&lt;br /&gt;
Channels.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SSH::Transport&amp;lt;/code&amp;gt; || Wire layer.  Banner + KEXINIT&lt;br /&gt;
exchange, ChaCha20-Poly1305 packet framing, sendSeq / recvSeq,&lt;br /&gt;
heartbeat, SSH_MSG_DISCONNECT.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Connection pooling ===&lt;br /&gt;
&lt;br /&gt;
Every &amp;lt;code&amp;gt;SftpFilename&amp;lt;/code&amp;gt; instance pointing at the same&lt;br /&gt;
&amp;lt;code&amp;gt;user@host:port&amp;lt;/code&amp;gt; triple shares one&lt;br /&gt;
&amp;lt;code&amp;gt;SSH::Client&amp;lt;/code&amp;gt; plus one &amp;lt;code&amp;gt;SSH::SftpClient&amp;lt;/code&amp;gt;.&lt;br /&gt;
Pool is class-side, guarded by a single&lt;br /&gt;
&amp;lt;code&amp;gt;ConnectionPoolMutex&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Lazy bring-up&amp;#039;&amp;#039;&amp;#039; — TCP + KEX + userauth + SFTP INIT happens&lt;br /&gt;
  on the first SFTP operation, not on &amp;lt;code&amp;gt;forUrl:&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Per-host serialisation&amp;#039;&amp;#039;&amp;#039; — SFTP requests on a given host&lt;br /&gt;
  are serialised through a &amp;lt;code&amp;gt;RecursionLock&amp;lt;/code&amp;gt; named&lt;br /&gt;
  &amp;lt;code&amp;gt;SFTP/&amp;amp;lt;user@host:port&amp;amp;gt;&amp;lt;/code&amp;gt; (visible in&lt;br /&gt;
  SemaphoreMonitor).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Idle eviction&amp;#039;&amp;#039;&amp;#039; — unused for longer than&lt;br /&gt;
  &amp;lt;code&amp;gt;idleEvictionSeconds&amp;lt;/code&amp;gt;, the entry is proactively&lt;br /&gt;
  closed + reopened on the next access.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Auto-reconnect&amp;#039;&amp;#039;&amp;#039; — a transport-level failure (broken pipe,&lt;br /&gt;
  EOF, MNU on nil socket) evicts the dead pool entry, opens a&lt;br /&gt;
  fresh client, retries the request &amp;#039;&amp;#039;&amp;#039;once&amp;#039;&amp;#039;&amp;#039;.  Application-level&lt;br /&gt;
  SFTP STATUS errors propagate immediately.&lt;br /&gt;
&lt;br /&gt;
== Future work ==&lt;br /&gt;
&lt;br /&gt;
Tracked but not yet implemented:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Multi-channel parallelism per host&amp;#039;&amp;#039;&amp;#039; — today one TCP +&lt;br /&gt;
  one SFTP channel per host means N concurrent requests&lt;br /&gt;
  serialise.  Pipelining over multiple SshClients in the pool&lt;br /&gt;
  (preferred), or a transport-level reader process demultiplexing&lt;br /&gt;
  to per-channel inboxes, would let the tree pane keep listing&lt;br /&gt;
  while the content pane reads a large file.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Accurate &amp;lt;code&amp;gt;#isNonEmptyDirectory&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; via OPEN_DIR&lt;br /&gt;
  + READ_DIR (first batch only) + CLOSE — three RTTs per probe;&lt;br /&gt;
  needs SftpClient to pipeline requests before this pays off.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;SFTP v5/v6 negotiation&amp;#039;&amp;#039;&amp;#039; for atomic-overwrite rename,&lt;br /&gt;
  extended attrs, FTP-style canonicalisation.&lt;br /&gt;
&lt;br /&gt;
= Command Shell =&lt;br /&gt;
&lt;br /&gt;
Local command shell on this expecco machine.  Typical applications:&lt;br /&gt;
local command-line, running a local helper tool, bridging a&lt;br /&gt;
remote workflow to a local utility.&lt;br /&gt;
&lt;br /&gt;
The Expecco RemoteAccess plugin exposes:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;CmdShell - Open&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;CmdShell - Close&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
No credentials, no network — runs as the expecco process&amp;#039;s own&lt;br /&gt;
user.  Output streams to expecco&amp;#039;s log.&lt;br /&gt;
&lt;br /&gt;
= Telnet =&lt;br /&gt;
&lt;br /&gt;
[[File:Warning.svg|24px|Warning]] &amp;#039;&amp;#039;&amp;#039;Telnet is a legacy protocol&lt;br /&gt;
with no encryption.&amp;#039;&amp;#039;&amp;#039; Passwords are transmitted in plain text on&lt;br /&gt;
the wire; anyone on the network path can read them.  Use Telnet&lt;br /&gt;
ONLY when the target device has no other option (typically: old&lt;br /&gt;
industrial controllers, lab instruments, embedded measurement&lt;br /&gt;
equipment without an SSH stack).  For everything else use&lt;br /&gt;
[[#SSH and SFTP]].&lt;br /&gt;
&lt;br /&gt;
The expecco plugin exposes:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Telnet - Open Remote Connection With Login&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Telnet - Execute Remote Command&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Example - Remote Device Control via Telnet&amp;#039;&amp;#039;&amp;#039; (internal demo)&lt;br /&gt;
&lt;br /&gt;
The Telnet protocol (RFC 854) is a bidirectional 8-bit byte stream&lt;br /&gt;
over TCP, with in-band control sequences for terminal options.&lt;br /&gt;
A connection is established to a target host:port; after optional&lt;br /&gt;
in-band login, both sides can send data.&lt;br /&gt;
&lt;br /&gt;
= See also =&lt;br /&gt;
&lt;br /&gt;
* [[SSH Client/en|SSH::Client]] — the SSH layer (exec, TTY, agent&lt;br /&gt;
  forwarding, ProxyJump).&lt;br /&gt;
* [[FileBrowserV2/en|FileBrowserV2]] — the main UI client of&lt;br /&gt;
  this stack.&lt;br /&gt;
* [[ClaudeCode plugin/en|Claude Code]] — uses the same SSH stack&lt;br /&gt;
  for its HTTPS transport.&lt;br /&gt;
* [[Wikipedia:Secure Shell|RFC 4251 (SSH-2 Architecture)]]&lt;br /&gt;
* [[Wikipedia:Telnet|RFC 854 (Telnet Protocol)]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Plugins]]&lt;br /&gt;
[[Category:Network]]&lt;br /&gt;
[[Category:SSH]]&lt;/div&gt;</summary>
		<author><name>Sv</name></author>
	</entry>
</feed>