How to send files from your Ubuntu remote machine to your local machine with SSH.
This topic was one I really feared when I started my Linux journey. My biggest struggle was understanding remote and local machine, this sounds weird but I struggled with it. So this write-up is aimed at explaining how to transfer files between your remote system and your local machine.
The remote machine is the Ubuntu system installed in your local system, in my case the remote system was installed using vagrant. The local machine is your Laptop or Desktop, in my case, it's a Mac.
To transfer files from your remote system to your local system, an ssh connection needs to be set between the remote and local systems.
To create an ssh connection between your remote and local systems, from your terminal in your local machine, run this command to create your ssh key.
ssh-keygen -t rsa
If you are okay with the current location suggested by the ssh-keygen prompt, just press enter. Also for the passphrase prompt, you can simply just press enter.
The created keys can be found using this command.
ls -l .ssh/
A sample output of the command above can be seen below.
-rw------- 1 achebe staff 2635 Aug 23 00:11 id_rsa
-rw-r--r-- 1 achebe staff 589 Aug 23 00:11 id_rsa.pub
The id_rsa is the private key, while id_rsa.pub is the public key generated by the ssh-keygen command.
For the ssh connection to be made, the generated public key needs to be sent to the remote system. To get the public key transferred to the remote system, the ipaddress and user currently logged to the remote system are needed. To get your ipaddress, from your remote system run this command.
ifconfig
The needed ipaddress is usually located in the enp0s8 or eth1 adapter section outputted by the ifconfig command. A sample of the command is shown below.
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.56.9 netmask 255.255.255.0 broadcast 192.168.56.255
inet6 fe80::5f96:e06a:841c:d33a prefixlen 64 scopeid 0x20<link>
ether 08:00:27:e0:2b:8d txqueuelen 1000 (Ethernet)
RX packets 939 bytes 229027 (223.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 783 bytes 161203 (157.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
From my remote system, 192.168.56.9 is my ipaddress. To get the user currently logged, run this command.
whoami
The user currently logged on my remote system is vagrant
To send the created public ssh to the remote system run this command from the terminal of your local machine.
ssh-copy-id -i .ssh/id_rsa vagrant@192.168.56.9
You will get this output;
achebe@okechukwus-MacBook-Pro ~ % ssh-copy-id -i .ssh/id_rsa vagrant@192.168.56.9
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: ".ssh/id_rsa.pub"
The authenticity of host '192.168.56.9 (192.168.56.9)' can't be established.
ED25519 key fingerprint is SHA256:f3vzmjzoMj6cLsw0DhtrTlt/R6muK996HX0UdgD7qTg.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])?
Type yes to the prompt given. This should be all but if you get this error;
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
vagrant@192.168.56.9: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
or simply;
vagrant@192.168.56.9: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
Please don't fright; to get this solved, go to your remote machine and edit the /etc/ssh/sshd_config file. Change and uncomment PasswordAuthentication, its value should be;
PasswordAuthentication yes
Save the file and please remember to restart the sshd service using this command;
sudo systemctl restart sshd
Once this has been done you can rerun this command and you are good to go.
ssh-copy-id -i .ssh/id_rsa vagrant@192.168.56.9
Transfer of files can be possible now between the two systems because we have an established ssh connection.
For a case scenario, let's save the output of the ifconfig command from our remote system into a file and then transfer that file from our remote system to our local machine.
From our remote system, the format to save the output of a command to a file is
command > file_name.txt
So in our case, to save the output of the ifconfig file, run this command;
ifconfig > ifconfig.txt
This created file is located in the home directory of the vagrant user which is /home/vagrant. This information is important when making the file transfer between the remote and local systems.
Transferring files between two ssh connected systems is carried out by the use of the scp command. The format for this transfer is given below.
scp source_directory destination_directory
For this transfer, run this command from the local system terminal to transfer the file into the local system.
scp vagrant@192.168.56.9:/home/vagrant/ifconfig.txt Desktop
Where vagrant@192.168.56.9:/home/vagrant/ifconfig.txt is the source directory where the file is located in our remote system. Desktop is the directory in the local system where we intend to store the file. Once the command above is run, check the Desktop folder in the local system, the ifconfig.txt file will be located there.
Thank you for reading, I hope it helped in giving a good understanding of file transfer with ssh.