82

I have logged on to a system with ssh and there is no scp present on both the systems. How to copy a file without using the scp program.

Talespin_Kit
  • 3,201
  • 6
  • 24
  • 18

5 Answers5

139

To send a file:

cat file | ssh ajw@dogmatix "cat > remote"

Or:

ssh ajw@dogmatix "cat > remote" < file

To receive a file:

ssh ajw@dogmatix "cat remote" > copy
Michael
  • 999
  • 10
  • 16
Flexo
  • 2,297
  • 1
  • 17
  • 19
  • 21
    @ggg that's not true at all. `cd /tmp; cat /bin/bash > test; chmod a+x test; diff test /bin/bash; ./test` all works fine. There's nothing inherently "magic" about binary files. Both files in my example compared identical and have the same checksum. It's true that copy and pasting from a terminal window won't work because of things like control sequences and unprintable characters, but using pipes like this these never go near a terminal. – Flexo Sep 23 '12 at 10:35
  • @Flexo I need something like this, the only exception is, I need to pipe in all jpg from a folder. How could iterate through /storage/sdcard1/*jpg and `>` to files with the same name ? – George Profenza Jul 03 '13 at 11:58
  • 2
    @GeorgeProfenza you'll need to add `tar` into the mix. `tar cvf - /path/*.jpg | ssh [email protected] "tar xvf -"` or something similar ought to work. – Flexo Jul 03 '13 at 20:36
  • One implication of what ggg and Flexo say above is that you can't use the "-t" option to ssh. – mjg123 Nov 05 '14 at 13:43
  • Why do you use cat? – PyRulez Jun 11 '15 at 22:47
  • @pyrulez - on the local end it's habbit - I normally use a pipe from some more complex process and don't just transfer files. On the remote end there needs to be a process of some sort spawned, cat is a good choice. – Flexo Jun 11 '15 at 23:16
  • This is brilliant, and was necessary on the tiny embedded device I was using that didn't have scp. – moodboom Nov 24 '16 at 01:51
  • Neat - this even works to copy from windows to linux if you use "type" instead of cat on the windows end (using windows 10's built in beta ssh client). (text files, haven't tried binary) – Frederik Dec 24 '17 at 17:40
  • 1
    Nice! You can also use pv instead of the first cat so you get a progressbar, eg `pv file | ssh ajw@dogmatix "cat > remote"` – Theolodus May 18 '18 at 09:14
  • WOW! This make my live so much easier on embedded stuff – varta Mar 29 '22 at 14:00
  • google queries "copy file if scp not found", "copy file if no scp", "sh: scp: not found" should go here – quant2016 Aug 25 '22 at 10:08
6

Try this:

cat myfile.txt | ssh me@otherhost 'cat - > myfile.txt' 
Keith
  • 8,013
  • 1
  • 31
  • 34
3

You can use xxd and some ugly quoting to copy over multiple files as well as run commands on them and execute them:

ssh -t [email protected] "
echo $'"$(cat somefile | xxd -ps)"' | xxd -ps -r > "'somefile'"
chmod +x somefile
echo $'"$(cat someotherfile | xxd -ps)"' | xxd -ps -r > "'someotherfile'"
chmod +x someotherfile
./somefile
./someotherfile
"
Michael
  • 999
  • 10
  • 16
Aric
  • 31
  • 4
-2

python3 -m http.server in the same directory with desired file - after that you can curl or wget or download a file with your browser. Note that with that running command all your files from current directory will be publicly available, until you press Ctrl+C.

Vitaly Zdanevich
  • 190
  • 1
  • 3
  • 18
-2

Besides piping the file to a remote cat, you may also be able to use some SFTP client to transfer the files.

salva
  • 179
  • 6
  • +1 but it should be noted that the OP is attempting to avoid scp because it does not exist on the systems. Given this constraint it's also probable that an FTP server needs to exist on the receiving end which makes the copying process dependent on software other than what is usually there by default. – Paul Sasik May 05 '15 at 16:50