sftp client: upload from pipe

Damien Miller djm at mindrot.org
Sat Jun 22 18:48:03 AEST 2019


On Fri, 21 Jun 2019, Adam Osuchowski wrote:

> Hi,
> 
> the sftp client from openssh package can't upload data from local pipe
> to remote file. For example, such a command fails:
> 
> $ cat file | sftp -b <(echo 'put /dev/stdin /directory/filename') -i ~/.ssh/key user at remote.host
> sftp> put /dev/stdin /directory/filename
> /dev/stdin is not a regular file
> 
> What is a purpose for such a behaviour and limitation? As experiment,
> I removed following piece of code which is responsible for this check
> (sftp-client.c, do_upload() function):
> 
>         if (!S_ISREG(sb.st_mode)) {
>                 error("%s is not a regular file", local_path);
>                 close(local_fd);
>                 return(-1);
>         }
> 
> and nothing bad happened. It was still possible to upload regular files,
> but additionaly there was an opportunity for upload data piped from other
> command (what in my opinion is very useful feature) and even directly
> from terminal. Would it be possible to remove this restriction from sftp
> client?

IIRC it's there because reads on named pipes can hang if nothing is
attached to them and because reading from devices can have side-effects
(classic example being /dev/mt)

I'm not opposed to relaxing this restriction, but I think that we'd need to
preserve the behaviour I just mentioned.

-d


More information about the openssh-unix-dev mailing list