如何从Heroku Bash下载文件



我从Heroku Bash中运行了一个Ruby脚本,该脚本在我要下载的服务器上生成了CSV文件。我尝试将其移至公共文件夹下载,但这无效。我发现,在Heroku Bash控制台中的每个会话之后,文件删除。是否有命令可以直接从Heroku Bash控制台下载?

如果您设法从heroku run bash创建文件,则可以使用Transfer.SH。/p>

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

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>

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

示例运行:

#$ 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 

警告

这似乎不是通过heroku runrun来运行。

示例

#$ 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'

是!证明:

#$ 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)

我可以连接到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.6039 Dyno命令行中使用SCP scp -P PORT tmp/some.log user@host:/path/some.heroku.log

现在https://transfer.sh已停产,https https 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的安全性,因此使用其他答案中所述的加密可能是一个好主意。

herokuDyno文件系统是短暂的,非持久性的,并且在Dynos之间没有共享。因此,当您进行heroku run bash时,您实际上将获得一个新的Dyno,并通过对您的应用的全新部署,而没有对其他Dynos中的短暂文件系统进行的任何更改。

如果您想执行这样的操作,则可能应该在heroku run bash会话中或全部完成对Heroku上运行的Web应用程序中的全部完成,该应用程序使用您想要的CSV文件响应。

i如下:

  • 首先,我使用此命令进入了Heroku Bash:

    Heroku Run'SH''

  • 然后制作了一个目录,然后将文件移至该文件

  • 制作了一个git存储库并承诺文件
  • 最后,我将这个存储库推到了github

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

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

如果有一种简单的方法,请让我知道!

对不起,我的英语不好。

另一种执行此操作的方式(不涉及任何第三服务器)是使用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>

我同意,您的需求很可能意味着您的应用程序体系结构(例如Worker dyno)的更改。但是,通过执行以下步骤,您可以传输文件,因为Heroku One-Dyno可以运行scp

  1. 在云提供商中创建VM,例如数字海洋;
  2. 运行Heroku One-Oneft Dyno并创建您的文件;
  3. scp从Heroku One-Onf Dyno到该VM服务器的文件;
  4. scp从VM服务器到本地计算机的文件;
  5. 删除Cloud VM并停止Heroku One-Oneft Dyno。

我看到这些答案年龄较大,所以我认为这是一个新功能。对于像我这样的所有正在寻找解决方案的人都比这里已经出色的答案更容易的解决方案,而Heroku现在可以通过以下命令轻松地复制文件:heroku ps:copy <filename>

请注意,正如您期望的那样,这与相对路径有效。(在Heroku-18堆栈上测试,在"路径/to/file.ext"上下载文件

供参考:Heroku Docs

Heroku dyno的Dyno带有 sftp 预先安装。我尝试了git,但是步骤太多(必须生成新的SSH证书并每次将其添加到GitHub),所以现在我使用SFTP,并且效果很好。

您需要还有另一个主机(例如Dreamhost,Hostgator,Godaddy等) - 但是,如果您这样做,则可以:

sftp username@ftp.yourhostname.com

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

在服务器上,导航到要上传到的文件夹(使用CD和LS命令)。

然后使用命令put filename.csv,并将其上传到您的Web主机。

检索文件:如果您上传到www或www或网站文件夹路径中的文件夹时,请使用诸如Filezilla之类的FTP客户端。

这很棒,因为它还可以与多个文件和二进制文件以及文本文件一起使用。

对于剪贴板中舒适的小/快速传输:

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

现在,我创建了Shell脚本以将某些文件上传到git备份repo(例如,我的app.db sqlite文件被gitignored 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 for被忽略的文件)并推入repo(-f,因为git需要拉)

最新更新