如何从Heroku bash下载文件?

时间:2014-01-30 19:30:51

标签: bash heroku

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

12 个答案:

答案 0 :(得分:45)

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

您甚至可以在传输文件之前加密文件。

cat <file_name> | gpg -ac -o- | curl -X PUT -T "-" https://transfer.sh/<file_name>.gpg

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

curl https://transfer.sh/<hash>/<file_name>.gpg | gpg -o- > <file_name>

答案 1 :(得分:7)

我做了如下:

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

    heroku run&#39; sh&#39;

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

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

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

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

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

抱歉我的英语不好。

答案 2 :(得分:6)

Heroku dyno filesystems are ephemeral,非持续性且不在dynos之间共享。因此,当你执行heroku run bash时,你实际上会获得一个新的dyno,它会重新部署你的app,而不会对其他dynos中的短暂文件系统进行任何更改。

如果你想做这样的事情,你可能要么在heroku run bash会话中全部完成,要么全部在对Heroku上运行的Web应用程序的请求中执行,该应用程序使用您想要的CSV文件进行响应。

答案 3 :(得分:6)

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

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

答案 4 :(得分:3)

heroku ps:copy

  

将文件从dyno复制到本地文件系统

     

用法   $ heroku ps:复制文件

但我最终遇到此错误:

Establishing credentials... error
 ▸    Could not connect to dyno!
 ▸    Check if the dyno is running with `heroku ps'

也许您会在此方面获得更大的成功。

答案 5 :(得分:3)

现在https://transfer.sh已失效,https://file.io是替代选择。要上传myfile.csv

$ curl -F "file=@myfile.csv" https://file.io

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

{"success":true,"key":"2ojE41","link":"https://file.io/2ojE41","expiry":"14 days"}

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

答案 6 :(得分:2)

适用于在剪贴板中舒适放置的小型/快速转移:

  1. 在本地设备上打开终端
  2. 运行heroku run bash
  3. (在远程连接内,在dyno上)运行cat filename
  4. 选择本地终端中的行并将其复制到剪贴板。
  5. 检查以确保粘贴时有正确的换行符。

答案 7 :(得分:0)

现在我创建了shell脚本来将一些文件从git backup repo上传(例如,我的app.db sqlite文件是gitignored,每次部署都会杀死它)

## upload dyno files to git via SSH session
## https://devcenter.heroku.com/changelog-items/1112
# heroku ps:exec
git config --global user.email 'dmitry.cheva@gmail.com'
git config --global user.name 'Dmitry Cheva'
rm -rf ./.gitignore
git init
## add each file separately (-f to add git ignored files)
git add app.db -f
git commit -m "backup on `date +'%Y-%m-%d %H:%M:%S'`"
git remote add origin https://bitbucket.org/cheva/appbackup.git
git push -u origin master -f

git将在部署后重新启动并且不存储环境,您需要执行前3个命令。 然后你需要添加文件(-f用于忽略的文件)并推入repo(-f,因为git需要拉动)

答案 8 :(得分:0)

Heroku dyno预先安装了 sftp 。我尝试了git,但是步骤太多(必须生成一个新的ssh证书并且每次都将它添加到github),所以现在我使用的是sftp并且效果很好。

您需要拥有另一位主持人(如dreamhost,hostgator,godaddy等) - 但如果您这样做,您可以:

sftp username@ftp.yourhostname.com

接受服务器指纹/哈希,然后输入密码。

进入服务器后,导航到要上传的文件夹(使用cd和ls命令)。

然后使用命令put filename.csv,它会将其上传到您的网络主机。

要检索文件:如果您上传到www或网站文件夹路径中的文件夹,请使用ftz客户端(如filezilla)或点击网址。

这很棒,因为它也适用于多个文件和二进制文件以及文本文件。

答案 9 :(得分:0)

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

这是我的做法:

  1. 使用heroku run bash
  2. 登录到您的heroku实例
  3. 使用base64打印文件内容:base64 <your-file>
  4. 在终端中选择base64文本并进行复制
  5. 在您的本地计算机上,使用base64将这些文本直接解压缩为一个新文件(在Mac上,我会pbpaste | base64 --decode -o <your-file>进行压缩)

答案 10 :(得分:0)

我看到这些答案要老得多,所以我假设这是一个新功能。对于像我这样寻求比此处给出的最佳答案更简单的解决方案的所有人,Heroku现在可以使用以下命令轻松复制文件:heroku ps:copy <filename>

请注意,这与相对路径一样,如您所愿。 (在heroku-18堆栈上进行了测试,可以从“ path / to / file.ext”下载文件

以供参考:Heroku docs

答案 11 :(得分:0)

TLDR:使用 Heroku Redis 作为存储机制。

以前的答案很好,但主要涉及用于导出文件的 3rd 方服务、用于生成文件的 Web 应用程序或用于从 heroku 运行会话推送文件的 ftp/scp/rsync。我的要求不允许我使用其中任何一个:

  • 数据是私有的,不包括公共文件存储(即使是加密形式)
  • 不涉及第 3 方服务器(不涉及 ftp/scp/rsync)。
  • 没有网络 dynos(仅限工作人员)。

没有使用一次性 dyno 运行的 3rd 方外部服务的解决方案...

...对我有用:

最初面临的两个问题:

  • 在何处/如何将数据(文件)从生成一次性运行 dyno 的数据中移出?
  • 如何将数据提取到本地机器?

事实证明,我们可以通过使用简单的 Heroku Redis 插件来实现这两个目标。它将允许我们在应用程序内部(在 dynos 之间)以及与外部世界共享数据。

将文件推送到 Redis:

我还没有找到在 heroku run bash 会话中使用 redis-cli 的简单方法,所以我将 redis 库用于我拥有 buildpack 的语言(在我的情况下为 ruby​​)。

首先我们需要图书馆,所以:

gem install redis

然后我们需要将文件推送到 Redis。几行 ruby​​ 就可以解决问题。

require "redis"
redis = redis = Redis.new(url: ENV["REDIS_URL"])
redis.set("some-key-name", IO.binread("path/to/file.csv"), ex: 1200)

说明:

  • Heroku 会将带有凭据的 redis URL 存储在 REDIS_URL 环境变量中,因此我们可以使用 ENV["REDIS_URL"]
  • 1200 是 Redis 在丢弃记录之前将保留该记录的时间(以秒为单位)(可以省略)。

这就是存储。现在可以跨应用程序内的 dyno 访问数据。 Heroku 也可以从 Internet 访问它。

在本地从 Redis 获取:

可以通过 heroku redis cli 或再次通过 redis 驱动程序检索数据。

示例(通过 heroku redis:cli)

echo 'GET some-key-name' | redis:cli > file.out

file.out 现在应该有数据了。
我们需要清理数据,因为 redis:cli 信息消息也在那里被捕获。 (我还没有找到禁用它们的方法,但我看起来不够努力)。

示例(ruby 驱动程序): 我们需要先获取redis URL(为了简单起见,将其保存为REDIS_URL):

REDIS_URL=$(heroku redis:credentials)

确保安装了 redis gem:

gem install redis

用于获取数据的 Ruby 脚本如下所示:

require "redis"

redis = Redis.new(url: ENV["REDIS_URL"])
IO.binwrite("output/file.txt", redis.get("some-key-name"))

免责声明:

  • 这可能不是 redis 的最佳用法,但确实有效。
  • redis 中的值有数据大小限制。
  • 使用 postgres 附加组件可能会实现同样的效果(尚未尝试过)。
  • Heroku 提供了一个插件来将文件推送到 S3。如果我有可用的附加组件,那将是我的第一选择。