# Transferring files from QEMU to your host machine

## Method 1: WebServer
Serenity has a built-in web server which extends to your host machine.

Open a new terminal and use the following command to start a WebServer instance for the current working directory:

```console
ws .
```

Then we just open `localhost:8000` on our host machine :^)

![](WebServer_localhost.png)

**NOTE:** Due to the fact that some browsers download unrecognized files as plain text, you may want to use something like `wget` to download the file **as is** instead. Otherwise the file may appear corrupted when the system tries to load it.

## Method 2: Mount the disk image

Another way is to mount Serenity's `_disk_image` to your host machine by using the following command on *nix systems (or inside WSL):

```console
cd "Build/${SERENITY_ARCH}"
mkdir mnt
sudo mount -t ext2 _disk_image mnt
```

## Method 3: Archiving tool with ext2 support

Some archiving tools, like [7-Zip](https://www.7-zip.org/), are capable of directly opening ext2 images like Serenity's `_disk_image`. With these, you can open the disk image like any other archive and extract the files you need.

For WSL users: If you have the image on your native WSL drive (recommended), this drive can be opened in Explorer by manually opening `\\wsl$` (not visible in the Network tab!) and then the "network share" corresponding to your distro.

## Method 4: Enable OpenSSH on host and use sftp client on SerenityOS

- Setup OpenSSH server on your host.
For windows: Google is your friend (https://docs.microsoft.com/en-us/windows-server/administration/openssh/openssh_install_firstuse)
For linux: Google is your friend.
- Ensure that you already have a working SerenityOS working build.
```console
$ Meta/serenity.sh rebuild-world
```
- To enable OpenSSH package from SerenityOS: (initial directory is SerenityOS ROOT_DIR)

```console
cd Ports
cd openssh
./package.sh
cd ../..
Meta/serenity.run
```
- From within SerenityOS, check that you have a working sftp app:

```console
courage:~ $ sftp
```
The expected response will be:

```console
courage:~ $ sftp
usage: sftp [-46aCfNpqrv] [-B buffer_size] [-b batchfile] [-c cipher]
          [-D sftp_server_path] [-F ssh_config] [-i identity_file]
          [-J destination] [-l limit] [-o ssh_option] [-P port]
          [-R num_requests] [-S program] [-s subsystem | sftp_server]
          destination
```
- Assume that you have a working OpenSSH server as mentioned earlier, with an IP address of 192.168.0.11.
- Assume that you have a valid user on that host with account name user1.
- Assume that you are currently inside the folder from which you want to transfer the file(s) from.
- Local
    User: anon
- Remote
    User: user1
    IP Address: 192.168.0.11
- Connect to remote server via sftp

```console
courage:~ $ sftp user1@192.168.0.11
The authenticity of host '(192.168.0.11)' can't be established.
ECDSA key finger print is SHA256:Iav!m/E0cHJBnzSk0hJEZnBZ2F3LBL4wxhyv4nrfPtU.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes

user1@'s password:
Connected to 192.168.0.11

```
- By this time, you have successfully connected and logged on to the remote host.
- You can get more information by typing ` help `.
- The most often used (simplified) sftp commands are ` ls `, ` cd `, ` put [filename] `, ` get [filename] `, and ` quit `. I said simplified since the actual commands have many more options. 
- Be aware that there will be a time you would think that nothing is happening since the cursor just stares back at you. It is always waiting for your next instruction. Typing ` quit ` or ` bye ` will close the program.
- Congratulations. Pat yourself at the back.
