2022-02-02 09:05:27 +00:00
|
|
|
+++
|
|
|
|
title = "CLI tools"
|
|
|
|
weight = 20
|
|
|
|
+++
|
2021-10-29 16:05:47 +00:00
|
|
|
|
|
|
|
CLI tools allow you to query the S3 API without too many abstractions.
|
|
|
|
These tools are particularly suitable for debug, backups, website deployments or any scripted task that need to handle data.
|
|
|
|
|
|
|
|
## Minio client (recommended)
|
|
|
|
|
|
|
|
Use the following command to set an "alias", i.e. define a new S3 server to be
|
|
|
|
used by the Minio client:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
mc alias set \
|
|
|
|
garage \
|
|
|
|
<endpoint> \
|
|
|
|
<access key> \
|
|
|
|
<secret key> \
|
|
|
|
--api S3v4
|
|
|
|
```
|
|
|
|
|
|
|
|
Remember that `mc` is sometimes called `mcli` (such as on Arch Linux), to avoid conflicts
|
|
|
|
with Midnight Commander.
|
|
|
|
|
|
|
|
Some commands:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
# list buckets
|
|
|
|
mc ls garage/
|
|
|
|
|
|
|
|
# list objets in a bucket
|
|
|
|
mc ls garage/my_files
|
|
|
|
|
|
|
|
# copy from your filesystem to garage
|
|
|
|
mc cp /proc/cpuinfo garage/my_files/cpuinfo.txt
|
|
|
|
|
|
|
|
# copy from garage to your filesystem
|
|
|
|
mc cp garage/my_files/cpuinfo.txt /tmp/cpuinfo.txt
|
|
|
|
|
|
|
|
# mirror a folder from your filesystem to garage
|
|
|
|
mc mirror --overwrite ./book garage/garagehq.deuxfleurs.fr
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## AWS CLI
|
|
|
|
|
|
|
|
Create a file named `~/.aws/credentials` and put:
|
|
|
|
|
|
|
|
```toml
|
|
|
|
[default]
|
|
|
|
aws_access_key_id=xxxx
|
|
|
|
aws_secret_access_key=xxxx
|
|
|
|
```
|
|
|
|
|
|
|
|
Then a file named `~/.aws/config` and put:
|
|
|
|
|
|
|
|
```toml
|
|
|
|
[default]
|
|
|
|
region=garage
|
|
|
|
```
|
|
|
|
|
2021-11-03 11:55:03 +00:00
|
|
|
Now, supposing Garage is listening on `http://127.0.0.1:3900`, you can list your buckets with:
|
2021-10-29 16:05:47 +00:00
|
|
|
|
|
|
|
```bash
|
2021-11-03 11:55:03 +00:00
|
|
|
aws --endpoint-url http://127.0.0.1:3900 s3 ls
|
2021-10-29 16:05:47 +00:00
|
|
|
```
|
|
|
|
|
|
|
|
Passing the `--endpoint-url` parameter to each command is annoying but AWS developers do not provide a corresponding configuration entry.
|
|
|
|
As a workaround, you can redefine the aws command by editing the file `~/.bashrc`:
|
|
|
|
|
|
|
|
```
|
2021-11-03 11:55:03 +00:00
|
|
|
function aws { command aws --endpoint-url http://127.0.0.1:3900 $@ ; }
|
2021-10-29 16:05:47 +00:00
|
|
|
```
|
|
|
|
|
|
|
|
*Do not forget to run `source ~/.bashrc` or to start a new terminal before running the next commands.*
|
|
|
|
|
|
|
|
Now you can simply run:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
# list buckets
|
|
|
|
aws s3 ls
|
|
|
|
|
|
|
|
# list objects of a bucket
|
|
|
|
aws s3 ls s3://my_files
|
|
|
|
|
|
|
|
# copy from your filesystem to garage
|
|
|
|
aws s3 cp /proc/cpuinfo s3://my_files/cpuinfo.txt
|
|
|
|
|
|
|
|
# copy from garage to your filesystem
|
|
|
|
aws s3 cp s3/my_files/cpuinfo.txt /tmp/cpuinfo.txt
|
|
|
|
```
|
|
|
|
|
|
|
|
## `rclone`
|
|
|
|
|
2021-11-10 17:18:34 +00:00
|
|
|
`rclone` can be configured using the interactive assistant invoked using `rclone config`.
|
2021-10-29 16:05:47 +00:00
|
|
|
|
|
|
|
You can also configure `rclone` by writing directly its configuration file.
|
2021-11-10 17:18:34 +00:00
|
|
|
Here is a template `rclone.ini` configuration file (mine is located at `~/.config/rclone/rclone.conf`):
|
2021-10-29 16:05:47 +00:00
|
|
|
|
|
|
|
```ini
|
|
|
|
[garage]
|
|
|
|
type = s3
|
|
|
|
provider = Other
|
|
|
|
env_auth = false
|
|
|
|
access_key_id = <access key>
|
|
|
|
secret_access_key = <secret key>
|
|
|
|
region = <region>
|
|
|
|
endpoint = <endpoint>
|
|
|
|
force_path_style = true
|
|
|
|
acl = private
|
|
|
|
bucket_acl = private
|
|
|
|
```
|
|
|
|
|
2021-11-10 17:18:34 +00:00
|
|
|
Now you can run:
|
2021-10-29 16:05:47 +00:00
|
|
|
|
2021-11-10 17:18:34 +00:00
|
|
|
```bash
|
|
|
|
# list buckets
|
|
|
|
rclone lsd garage:
|
|
|
|
|
|
|
|
# list objects of a bucket aggregated in directories
|
|
|
|
rclone lsd garage:my-bucket
|
|
|
|
|
|
|
|
# copy from your filesystem to garage
|
|
|
|
echo hello world > /tmp/hello.txt
|
|
|
|
rclone copy /tmp/hello.txt garage:my-bucket/
|
|
|
|
|
|
|
|
# copy from garage to your filesystem
|
|
|
|
rclone copy garage:quentin.divers/hello.txt .
|
|
|
|
|
|
|
|
# see all available subcommands
|
|
|
|
rclone help
|
|
|
|
```
|
2021-10-29 16:05:47 +00:00
|
|
|
|
2022-01-31 15:51:39 +00:00
|
|
|
**Advice with rclone:** use the `--fast-list` option when accessing buckets with large amounts of objects.
|
|
|
|
This will tremendously accelerate operations such as `rclone sync` or `rclone ncdu` by reducing the number
|
|
|
|
of ListObjects calls that are made.
|
|
|
|
|
|
|
|
|
2021-10-29 16:05:47 +00:00
|
|
|
## `s3cmd`
|
|
|
|
|
|
|
|
Here is a template for the `s3cmd.cfg` file to talk with Garage:
|
|
|
|
|
|
|
|
```ini
|
|
|
|
[default]
|
|
|
|
access_key = <access key>
|
|
|
|
secret_key = <secret key>
|
|
|
|
host_base = <endpoint without http(s)://>
|
|
|
|
host_bucket = <same as host_base>
|
2021-11-10 17:18:34 +00:00
|
|
|
use_https = <False or True>
|
|
|
|
```
|
|
|
|
|
|
|
|
And use it as follow:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
# List buckets
|
|
|
|
s3cmd ls
|
|
|
|
|
|
|
|
# s3cmd objects inside a bucket
|
|
|
|
s3cmd ls s3://my-bucket
|
|
|
|
|
|
|
|
# copy from your filesystem to garage
|
|
|
|
echo hello world > /tmp/hello.txt
|
|
|
|
s3cmd put /tmp/hello.txt s3://my-bucket/
|
|
|
|
|
|
|
|
# copy from garage to your filesystem
|
|
|
|
s3cmd get s3://my-bucket/hello.txt hello.txt
|
2021-10-29 16:05:47 +00:00
|
|
|
```
|
2021-11-10 17:18:34 +00:00
|
|
|
|
|
|
|
## Cyberduck & duck
|
|
|
|
|
|
|
|
TODO
|
|
|
|
|
|
|
|
|