<div dir="ltr"><div>did some testing with a small adaption in cli-runopts.c</div><div>Basicly if a proycmd if used and multihop is used, I pass the proxycmd with -J in each exec</div><div><br></div><div>Seems to work :)</div><div>underneath the complete function... didn't have time to make a diff to the original...</div><div><br></div><div>Hans</div><div><br></div><div><br></div><div><div>static void parse_multihop_hostname(const char* orighostarg, const char* argv0) {</div><div><span style="white-space:pre">        </span>char *userhostarg = NULL;</div><div><span style="white-space:pre">        </span>char *hostbuf = NULL;</div><div><span style="white-space:pre">        </span>char *last_hop = NULL;</div><div><span style="white-space:pre">        </span>char *remainder = NULL;</div><div><br></div><div><span style="white-space:pre">        </span>/* both scp and rsync parse a user@host argument</div><div><span style="white-space:pre">        </span> * and turn it into "-l user host". This breaks</div><div><span style="white-space:pre">        </span> * for our multihop syntax, so we suture it back together.</div><div><span style="white-space:pre">        </span> * This will break usernames that have both '@' and ',' in them,</div><div><span style="white-space:pre">        </span> * though that should be fairly uncommon. */</div><div><span style="white-space:pre">        </span>if (cli_opts.username </div><div><span style="white-space:pre">                        </span>&& strchr(cli_opts.username, ',') </div><div><span style="white-space:pre">                        </span>&& strchr(cli_opts.username, '@')) {</div><div><span style="white-space:pre">                </span>unsigned int len = strlen(orighostarg) + strlen(cli_opts.username) + 2;</div><div><span style="white-space:pre">                </span>hostbuf = m_malloc(len);</div><div><span style="white-space:pre">                </span>snprintf(hostbuf, len, "%s@%s", cli_opts.username, orighostarg);</div><div><span style="white-space:pre">        </span>} else {</div><div><span style="white-space:pre">                </span>hostbuf = m_strdup(orighostarg);</div><div><span style="white-space:pre">        </span>}</div><div><span style="white-space:pre">        </span>userhostarg = hostbuf;</div><div><br></div><div><span style="white-space:pre">        </span>last_hop = strrchr(userhostarg, ',');</div><div><span style="white-space:pre">        </span>if (last_hop) {</div><div><span style="white-space:pre">                </span>if (last_hop == userhostarg) {</div><div><span style="white-space:pre">                        </span>dropbear_exit("Bad multi-hop hostnames");</div><div><span style="white-space:pre">                </span>}</div><div><span style="white-space:pre">                </span>*last_hop = '\0';</div><div><span style="white-space:pre">                </span>last_hop++;</div><div><span style="white-space:pre">                </span>remainder = userhostarg;</div><div><span style="white-space:pre">                </span>userhostarg = last_hop;</div><div><span style="white-space:pre">        </span>}</div><div><br></div><div><span style="white-space:pre">        </span>parse_hostname(userhostarg);</div><div><br></div><div><span style="white-space:pre">        </span>if (last_hop) {</div><div><span style="white-space:pre">                </span>/* Set up the proxycmd */</div><div><span style="white-space:pre">                </span>unsigned int cmd_len = 0;</div><div><span style="white-space:pre">                </span>char *passthrough_args = multihop_passthrough_args();</div><div> char *pproxycmd = NULL;</div><div><span style="white-space:pre">                </span>if (cli_opts.remoteport == NULL) {</div><div><span style="white-space:pre">                        </span>cli_opts.remoteport = "22";</div><div><span style="white-space:pre">                </span>}</div><div><span style="white-space:pre">                </span>cmd_len = strlen(argv0) + strlen(remainder) </div><div><span style="white-space:pre">                        </span>+ strlen(cli_opts.remotehost) + strlen(cli_opts.remoteport)</div><div><span style="white-space:pre">                        </span>+ strlen(passthrough_args)</div><div><span style="white-space:pre">                        </span>+ 30;</div><div> /* if proxycmd is filled, pass it also with every exec */</div><div><span style="white-space:pre">                </span>if (cli_opts.proxycmd) {</div><div> int proxylen = strlen(cli_opts.proxycmd) + 10;</div><div> /* save original proxycmd to insert in new cmd */</div><div> <span style="white-space:pre">                </span> pproxycmd = m_malloc(proxylen);</div><div> snprintf(pproxycmd,proxylen,"-J \"%s\" ",cli_opts.proxycmd);</div><div> cli_opts.proxycmd = NULL;</div><div> /* increase cmd_len with proxycmd length */</div><div> cmd_len += proxylen;</div><div><span style="white-space:pre">                </span>}</div><div><span style="white-space:pre">                </span>cli_opts.proxycmd = m_malloc(cmd_len);</div><div><span style="white-space:pre">                </span>snprintf(cli_opts.proxycmd, cmd_len, "%s %s-B %s:%s %s %s", </div><div><span style="white-space:pre">                                </span>argv0, (pproxycmd)?pproxycmd:"",</div><div> cli_opts.remotehost, cli_opts.remoteport, </div><div><span style="white-space:pre">                                </span>passthrough_args, remainder);</div><div>#ifndef DISABLE_ZLIB</div><div><span style="white-space:pre">                </span>/* The stream will be incompressible since it's encrypted. */</div><div><span style="white-space:pre">                </span>opts.compress_mode = DROPBEAR_COMPRESS_OFF;</div><div>#endif</div><div><span style="white-space:pre">                </span>if (pproxycmd) m_free(pproxycmd);</div><div><span style="white-space:pre">                </span>m_free(passthrough_args);</div><div><span style="white-space:pre">        </span>}</div><div><span style="white-space:pre">        </span>m_free(hostbuf);</div><div>}</div></div><div><br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div><br></div></div>
</blockquote></div></div>