如何从Heroku bash下载文件?

37 bash heroku

我从Heroku bash运行了一个ruby脚本,它在我想要下载的服务器上生成一个CSV文件.我尝试将其移动到公共文件夹进行下载,但这不起作用.我发现在Heroku bash控制台中的每个会话之后,文件都会被删除.是否有直接从Heroku bash控制台下载的命令?

小智 53

如果您设法从中创建文件heroku run bash,则可以使用transfer.sh.

您甚至可以在传输文件之前对其进行加密.

cat <file_name> | gpg -ac -o- | curl -X PUT -T "-" https://transfer.sh/<file_name>.gpg
Run Code Online (Sandbox Code Playgroud)

然后在目标计算机上下载并解密它

curl https://transfer.sh/<hash>/<file_name>.gpg | gpg -o- > <file_name>
Run Code Online (Sandbox Code Playgroud)

  • 我总是努力从heroku bash中获取任何数据转储.谢谢.没有更多的痛苦 (4认同)

iai*_*ton 11

另一种方法(不涉及任何第三方服务器)是使用 Patrick 的方法,但首先将文件压缩为仅使用可见 ASCII 字符的格式。这应该使它适用于任何文件,而不管任何空白字符或不寻常的编码。我建议base64这样做。

这是我如何做到的:

  1. 使用登录到您的 heroku 实例 heroku run bash
  2. 使用 base64 打印文件的内容: base64 <your-file>
  3. 在终端中选择 base64 文本并复制它
  4. 在您的本地机器上,使用base64直接解压缩此文本到一个新文件中(在 mac 上我会这样做pbpaste | base64 --decode -o <your-file>


Jos*_*ice 11

现在https://transfer.sh已失效,https://file.io是一个替代方案。上传myfile.csv

$ curl -F "file=@myfile.csv" https://file.io
Run Code Online (Sandbox Code Playgroud)

响应将包含一个链接,您可以在以下位置访问该文件:

{"success":true,"key":"2ojE41","link":"https://file.io/2ojE41","expiry":"14 days"}
Run Code Online (Sandbox Code Playgroud)

我不能保证 file.io 的安全性,因此使用其他答案中描述的加密可能是一个好主意。


Szy*_*Jeż 8

heroku ps:copy

#$ heroku help ps:copy 
Copy a file from a dyno to the local filesystem

USAGE
  $ heroku ps:copy FILE

OPTIONS
  -a, --app=app        (required) app to run command against
  -d, --dyno=dyno      specify the dyno to connect to
  -o, --output=output  the name of the output file
  -r, --remote=remote  git remote of app to use

DESCRIPTION
  Example:

       $ heroku ps:copy FILENAME --app murmuring-headland-14719
Run Code Online (Sandbox Code Playgroud)

示例运行:

#$ heroku ps:copy app.json --app=app-example-prod --output=app.json.from-heroku
Copying app.json to app.json.from-heroku
Establishing credentials... done
Connecting to web.1 on ? app-example-prod... 
Downloading... ?????????????????????????  100% 00:00 
Run Code Online (Sandbox Code Playgroud)

警告

这似乎不与run通过的dynos一起运行heroku run

#$ heroku ps:copy tmp/some.log --app app-example-prod --dyno run.6039 --output=tmp/some.heroku.log
Copying tmp/some.log to tmp/some.heroku.log
Establishing credentials... error
 ?    Could not connect to dyno!
 ?    Check if the dyno is running with `heroku ps'
Run Code Online (Sandbox Code Playgroud)

它是!证明:

#$ heroku ps --app app-example-prod
=== run: one-off processes (1)
run.6039 (Standard-1X): up 2019/08/29 12:09:13 +0200 (~ 16m ago): bash

=== web (Standard-2X): elixir --sname dyno -S mix phx.server --no-compile (2)
web.1: up 2019/08/29 10:41:35 +0200 (~ 1h ago)
web.2: up 2019/08/29 10:41:39 +0200 (~ 1h ago)
Run Code Online (Sandbox Code Playgroud)

我可以连接到web.1

#$ heroku ps:copy tmp/some.log --app app-example-prod --dyno web.1 --output=tmp/some.heroku.log
Copying tmp/some.log to tmp/some.heroku.log
Establishing credentials... done
Connecting to web.1 on ? app-example-prod... 
 ?    ERROR: Could not transfer the file!
 ?    Make sure the filename is correct.
Run Code Online (Sandbox Code Playgroud)

因此,我scp -P PORT tmp/some.log user@host:/path/some.heroku.logrun.6039dyno命令行退回到使用SCP 。

  • 对于2018/2019年,这是正确的答案。 (2认同)

fri*_*ism 7

Heroku dyno文件系统是短暂的,非持续性的,并且不会在dynos之间共享.因此,当你这样做的时候heroku run bash,你实际上会得到一个新的dyno,它会重新部署你的app,而不会对其他dynos中的短暂文件系统进行任何更改.

如果你想做这样的事情,你应该在一个heroku run bash会话中完成所有这一切,或者在对Heroku上运行的Web应用程序的请求中全部执行,该应用程序使用您想要的CSV文件进行响应.


小智 7

我做了如下:

  • 首先我用这个命令输入了heroku bash:

    heroku跑'sh'

  • 然后创建一个目录并将文件移动到该目录

  • 制作了一个git存储库并提交了该文件
  • 最后,我将此存储库推送到github

在提交之前,git会询问您的姓名和电子邮件.给它假货!

如果您的文件大于100 Mg,请推送到gitlab.

如果有更简单的方法请告诉我!

对不起,我的英语不好.


小智 6

我同意,很可能你的需求意味着改变你的应用程序架构,就像工作器dyno.但是通过执行以下步骤,您可以传输文件,因为heroku one-off dyno可以运行scp:

  1. 在云提供商中创建虚拟机,例如数字海洋;
  2. 运行heroku一次性dyno并创建你的文件;
  3. scp 从heroku one-off dyno到该vm服务器的文件;
  4. scp 从vm服务器到本地计算机的文件;
  5. 删除云vm并停止heroku一次性dyno.