Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: OpenSSH scp completion reminder



Hi,

On Thu, Apr 14, 2022 at 10:04:42AM -0700, Bart Schaefer wrote:
> On Thu, Apr 14, 2022 at 9:43 AM Axel Beckert <abe@xxxxxxxxxxxxxxx> wrote:
> > On Thu, Apr 14, 2022 at 11:20:34AM -0400, Phil Pennock wrote:
> > > This change impacts quoting of things like whitespace.
> > > Which I have assumed will impact zsh completion.
> >
> > I thought so as well, but I so far couldn't find anything which didn't
> > work with zsh remote file completion with OpenSSH 9.0 on the client
> > side.
> 
> Completion itself doesn't use scp to do the remote file name
> generation, it uses plain ssh.  Of course once the file names are
> returned, getting the quoting right for the actual scp invocation is
> down to what appears on the command line, so the only way completion
> could be implicated in messing this up is if it somehow automatically
> inserted the wrong quoting.

Yep, and that's the point: In theory, the amount of quoting (e.g.
three backslashes vs one backslash) is expected to be different with
the different scp backends. But for some reason the variant with three
backslashes still worked for me with OpenSSH 9.0 on the client side
which defaults to use the SFTP backend which does no shell globbing or
escaping on the server side.

To copy a file named "tmp/foo bar" from remotehost to my local
directory "tmp/", I did:

  % scp -p remotehost:tmp/foo<Tab><Tab> tmp/<Enter>

It expanded to:

  % scp -p remotehost:tmp/foo\\\ bar tmp/

Accoding to the docs, this does no more work with OpenSSH 9.0's
default settings, but it did. Running "scp" with "-vvvv" confirms that
the new default (SFTP backend) is used:

   scp -pvvvv remotehost:tmp/foo\\\ bar tmp/ |& fgrep tmp/foo
   scp: debug3: sink_sftp: copying remote tmp/foo\\ bar to local tmp/
   scp: debug1: Fetching tmp/foo bar to tmp/foo bar
   scp: debug2: do_download: download remote "tmp/foo bar" to local "tmp/foo bar"
   scp: debug2: Sending SSH2_FXP_STAT "tmp/foo bar"
   scp: debug2: Sending SSH2_FXP_OPEN "tmp/foo bar"
   scp: debug3: Sent remote message SSH2_FXP_OPEN I:4 P:tmp/foo bar M:0x0001
   
It seems as if scp has some capability to recognize of there's too
much shell quoting in a file name and reducres it, since there are
still two backslashes in the first line with "debug3:" which vanish
after that line.

And this even seems to go wrong if I want to copy a file created with
"touch 'foo\ bar'", i.e. with an backslash in there. I would have had
expected that OpenSSH 9.0 would fetch that file with "scp -p
remotehost:tmp/foo\\\ bar tmp/" but it actually stripped the file name
down and I needed five backslashes:

   scp -pvvvv remotehost:tmp/foo\\\\\ bar tmp/ |& fgrep tmp/foo
   scp: debug3: sink_sftp: copying remote tmp/foo\\\\ bar to local tmp/
   scp: debug1: Fetching tmp/foo\\ bar to tmp/foo\\ bar
   scp: debug2: do_download: download remote "tmp/foo\\ bar" to local "tmp/foo\\ bar"
   scp: debug2: Sending SSH2_FXP_STAT "tmp/foo\\ bar"
   scp: debug2: Sending SSH2_FXP_OPEN "tmp/foo\\ bar"
   scp: debug3: Sent remote message SSH2_FXP_OPEN I:4 P:tmp/foo\\ bar M:0x0001

Looks like either a bug in OpenSSH 9.0 or an undocumented
compatibility feature to me.

		Kind regards, Axel
-- 
PGP: 2FF9CD59612616B5      /~\  Plain Text Ribbon Campaign, http://arc.pasp.de/
Mail: abe@xxxxxxxxxxxxxxx  \ /  Say No to HTML in E-Mail and Usenet
Mail+Jabber: abe@xxxxxxxxx  X
https://axel.beckert.ch/   / \  I love long mails: https://email.is-not-s.ms/




Messages sorted by: Reverse Date, Date, Thread, Author